From 4e33371afc37e62b41aecc5425a5e3a3f957b9d7 Mon Sep 17 00:00:00 2001 From: ironbrands16 <103500025+ironbrands16@users.noreply.github.com> Date: Thu, 11 May 2023 18:39:06 +0200 Subject: [PATCH 01/62] Fix problem with solana extension It seems Solana from Phantom has this namespace for their browser extension. I added a check for prevent them being detected as bots. --- src/default.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/default.js b/src/default.js index dfeccbd9..05402523 100644 --- a/src/default.js +++ b/src/default.js @@ -490,7 +490,7 @@ nav.webdriver || window.__nightmare || window.callPhantom || - window._phantom || + window._phantom && !window._phantom.solana || window.phantom || window.__polypane || window._bot || From 38373b8618fc926cecf5e3368b1e53d2c852288c Mon Sep 17 00:00:00 2001 From: Adriaan <1079135+adriaanvanrossum@users.noreply.github.com> Date: Fri, 12 May 2023 14:47:29 +0200 Subject: [PATCH 02/62] Move from _phantom to phantom --- src/default.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/default.js b/src/default.js index 05402523..4938b544 100644 --- a/src/default.js +++ b/src/default.js @@ -486,12 +486,13 @@ // /** if botdetection **/ + var phantom = window.phantom; var bot = nav.webdriver || window.__nightmare || window.callPhantom || - window._phantom && !window._phantom.solana || - window.phantom || + window._phantom || + phantom && !phantom || window.__polypane || window._bot || isBotAgent || From f79ba5d430c0894143d933282cbab00a4dd2b38f Mon Sep 17 00:00:00 2001 From: adriaanvanrossum Date: Fri, 12 May 2023 12:48:54 +0000 Subject: [PATCH 03/62] Run prettier via GitHub Action --- src/default.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/default.js b/src/default.js index 4938b544..b62b8121 100644 --- a/src/default.js +++ b/src/default.js @@ -492,7 +492,7 @@ window.__nightmare || window.callPhantom || window._phantom || - phantom && !phantom || + (phantom && !phantom) || window.__polypane || window._bot || isBotAgent || From 3d7ccb516cce5f3d66405d20ae2b2827ede07038 Mon Sep 17 00:00:00 2001 From: Adriaan <1079135+adriaanvanrossum@users.noreply.github.com> Date: Mon, 19 Jun 2023 14:26:15 +0200 Subject: [PATCH 04/62] Fix bug in checking phantom.solana --- src/default.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/default.js b/src/default.js index b62b8121..f62097d4 100644 --- a/src/default.js +++ b/src/default.js @@ -492,7 +492,7 @@ window.__nightmare || window.callPhantom || window._phantom || - (phantom && !phantom) || + (phantom && !phantom.solana) || window.__polypane || window._bot || isBotAgent || From 65a6c3a994f31ec02f4a7ab570c3bcda2d74f760 Mon Sep 17 00:00:00 2001 From: Adriaan van Rossum <1079135+adriaanvanrossum@users.noreply.github.com> Date: Thu, 29 Jun 2023 15:54:07 +0200 Subject: [PATCH 05/62] Always expose sa_pageview --- src/default.js | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/src/default.js b/src/default.js index f62097d4..5f2fd012 100644 --- a/src/default.js +++ b/src/default.js @@ -949,17 +949,17 @@ /** if (or spa hash) **/ if (autoCollect) pageview(); - else { - /** if metadata **/ - window.sa_pageview = function (path, metadata) { - pageview(0, path, metadata); - }; - /** else **/ - window.sa_pageview = function (path) { - pageview(0, path); - }; - /** endif **/ - } + + /** if metadata **/ + window.sa_pageview = function (path, metadata) { + pageview(0, path, metadata); + }; + /** else **/ + window.sa_pageview = function (path) { + pageview(0, path); + }; + /** endif **/ + /** else **/ pageview(); /** endif **/ From a914c9a2d3cffcfc75107710ce47c70cefe80ff5 Mon Sep 17 00:00:00 2001 From: Adriaan van Rossum <1079135+adriaanvanrossum@users.noreply.github.com> Date: Fri, 14 Jul 2023 20:46:47 +0200 Subject: [PATCH 06/62] Check for Cloudflare under attack mode param --- src/default.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/default.js b/src/default.js index 5f2fd012..1fd7a74b 100644 --- a/src/default.js +++ b/src/default.js @@ -838,7 +838,10 @@ /** if uniques **/ // We set unique variable based on pushstate or back navigation, if no match we check the referrer - page.unique = isPushState || userNavigated ? falseVar : !sameSite; + page.unique = + /__cf_chl_tk/i.test(getReferrer()) || isPushState || userNavigated + ? falseVar + : !sameSite; /** endif **/ /** if metadata **/ From de31383d9ea222878dce37047843a6bf194a1257 Mon Sep 17 00:00:00 2001 From: adriaanvanrossum Date: Fri, 14 Jul 2023 18:47:17 +0000 Subject: [PATCH 07/62] Run prettier via GitHub Action --- compile.js | 20 +++++++------- playground/callback.html | 12 +++++---- playground/events.html | 14 +++++----- src/auto-events.js | 2 +- src/default.js | 52 ++++++++++++++++++------------------ test/helpers/get-browsers.js | 32 +++++++++++----------- test/helpers/index.js | 4 +-- test/helpers/server.js | 2 +- test/index.js | 14 +++++----- test/test-beacon.js | 18 ++++++------- test/test-events.js | 24 ++++++++--------- test/test-no-pushstate.js | 12 ++++----- test/test-one-beacon.js | 16 +++++------ test/test-pushstate.js | 16 +++++------ 14 files changed, 121 insertions(+), 117 deletions(-) diff --git a/compile.js b/compile.js index 52f4bbf1..343e22de 100644 --- a/compile.js +++ b/compile.js @@ -30,21 +30,21 @@ const fillTemplate = (template, { overwriteOptions = null } = {}) => { return template .replace( /\{\{\s?nginxHost\s?\}\}/gi, - '' + '', ) .replace( /\{\{\s?nginxProxyHost\s?\}\}/gi, - '' + '', ) .replace( /\\?"\{\{\s?overwriteOptions\s?\}\}\\?"/gi, overwriteOptions ? JSON.stringify(overwriteOptions).replace(/:"([^"]+)"/gi, ":$1") - : "{}" + : "{}", ) .replace( /"\{\{\s?cloudFlareCustomDomain\s?\}\}"/gi, - 'INSTALL_OPTIONS.custom_domain || "queue.simpleanalyticscdn.com"' + 'INSTALL_OPTIONS.custom_domain || "queue.simpleanalyticscdn.com"', ); }; @@ -284,7 +284,7 @@ const files = templates.reduce((list, template) => { if (template.variables.sri) { list.push( { ...template, variables: { ...template.variables, sri: true } }, - { ...template, variables: { ...template.variables, sri: false } } + { ...template, variables: { ...template.variables, sri: false } }, ); } else { list.push(template); @@ -346,7 +346,7 @@ for (const file of files) { filename: originalFileName, url: `${finalFileName}.map`, }, - } + }, ) : { code: prepend + rawCode, @@ -374,7 +374,7 @@ for (const file of files) { RED, `[${name}][ERROR] ${input .split("/") - .pop()} ${description} at line ${lineNumber} position ${index}` + .pop()} ${description} at line ${lineNumber} position ${index}`, ); continue; } @@ -402,7 +402,7 @@ for (const file of files) { let write = code.replace( /sourceMappingURL=latest\.js\.map/gi, - `sourceMappingURL=${cdnFileName}.map` + `sourceMappingURL=${cdnFileName}.map`, ); fs.writeFileSync(versionFile, write); @@ -410,7 +410,7 @@ for (const file of files) { if (compiledMap) { let writeCompiled = compiledMap.replace( /latest\.source\.js/gi, - cdnFileName + cdnFileName, ); fs.writeFileSync(`${versionFile}.map`, writeCompiled); @@ -438,7 +438,7 @@ for (const file of files) { console.log( ` ${name.toLowerCase()} ${fill1}Compiled ${sourceName} ${fill2} ${bytesZeroFilled} bytes ${ variables.sri ? " (SRI)" : "" - }` + }`, ); } diff --git a/playground/callback.html b/playground/callback.html index fd6069af..70e1c10b 100644 --- a/playground/callback.html +++ b/playground/callback.html @@ -1,4 +1,4 @@ - + @@ -46,7 +46,8 @@ @font-face { font-family: "Space Grotesk"; font-weight: 500; - src: url("https://assets.simpleanalytics.com/fonts/SpaceGrotesk-Medium.woff2") + src: + url("https://assets.simpleanalytics.com/fonts/SpaceGrotesk-Medium.woff2") format("woff2"), url("https://assets.simpleanalytics.com/fonts/SpaceGrotesk-Medium.woff") format("woff"); @@ -54,7 +55,8 @@ @font-face { font-family: "Space Grotesk"; font-weight: 400; - src: url("https://assets.simpleanalytics.com/fonts/SpaceGrotesk-Regular.woff2") + src: + url("https://assets.simpleanalytics.com/fonts/SpaceGrotesk-Regular.woff2") format("woff2"), url("https://assets.simpleanalytics.com/fonts/SpaceGrotesk-Regular.woff") format("woff"); @@ -180,7 +182,7 @@

Automated events

}) .join(" "); document.querySelector( - "textarea" + "textarea", ).value += `${type.toUpperCase()}: ${line}\n`; } @@ -253,7 +255,7 @@

Automated events

}); const callbackMetadataLink = document.querySelector( - "[data-metadata-callback]" + "[data-metadata-callback]", ); callbackMetadataLink.addEventListener("click", (event) => { event.preventDefault(); diff --git a/playground/events.html b/playground/events.html index 05f871a2..dede8af2 100644 --- a/playground/events.html +++ b/playground/events.html @@ -1,4 +1,4 @@ - + @@ -33,9 +33,9 @@ }, () => { console.info( - "Simple Analytics auto events: collected before_script_load" + "Simple Analytics auto events: collected before_script_load", ); - } + }, ); @@ -67,7 +67,8 @@ @font-face { font-family: "Space Grotesk"; font-weight: 500; - src: url("https://assets.simpleanalytics.com/fonts/SpaceGrotesk-Medium.woff2") + src: + url("https://assets.simpleanalytics.com/fonts/SpaceGrotesk-Medium.woff2") format("woff2"), url("https://assets.simpleanalytics.com/fonts/SpaceGrotesk-Medium.woff") format("woff"); @@ -75,7 +76,8 @@ @font-face { font-family: "Space Grotesk"; font-weight: 400; - src: url("https://assets.simpleanalytics.com/fonts/SpaceGrotesk-Regular.woff2") + src: + url("https://assets.simpleanalytics.com/fonts/SpaceGrotesk-Regular.woff2") format("woff2"), url("https://assets.simpleanalytics.com/fonts/SpaceGrotesk-Regular.woff") format("woff"); @@ -207,7 +209,7 @@

Automated events

}) .join(" "); document.querySelector( - "textarea" + "textarea", ).value += `${type.toUpperCase()}: ${line}\n`; } diff --git a/src/auto-events.js b/src/auto-events.js index 0df03611..745d1e8d 100644 --- a/src/auto-events.js +++ b/src/auto-events.js @@ -155,7 +155,7 @@ /^https?:\/\//i.test(link.href) && new RegExp( "\\.(" + (optionsLink.downloadsExtensions || []).join("|") + ")$", - "i" + "i", ).test(link.pathname) ) { collect = "download"; diff --git a/src/default.js b/src/default.js index 1fd7a74b..09beb8c1 100644 --- a/src/default.js +++ b/src/default.js @@ -8,7 +8,7 @@ version, defaultNamespace, sendError, - warn + warn, ) { try { ///////////////////// @@ -152,7 +152,7 @@ /** if ignoremetrics **/ // Customers can skip data points var ignoreMetrics = convertCommaSeparatedToArray( - overwriteOptions.ignoreMetrics || attr(scriptElement, "ignore-metrics") + overwriteOptions.ignoreMetrics || attr(scriptElement, "ignore-metrics"), ); /** endif **/ @@ -213,7 +213,7 @@ try { return assign( metadata, - metadataCollectorFunction.call(window, assign(metadata, data)) + metadataCollectorFunction.call(window, assign(metadata, data)), ); } catch (error) { warnInFunction("metadata", error); @@ -284,7 +284,7 @@ ignorePage === path || new RegExp( "^" + filterRegex(ignorePage).replace(/\\\*/gi, "(.*)") + "$", - "i" + "i", ).test(path) ) return trueVar; @@ -374,7 +374,7 @@ path: loc.pathname, }), undefinedVar, - trueVar + trueVar, ); }; @@ -387,7 +387,7 @@ sendError(event.message); } }, - falseVar + falseVar, ); /** endif **/ @@ -438,14 +438,14 @@ /** if ignorepages **/ // Customers can ignore certain pages var ignorePages = convertCommaSeparatedToArray( - overwriteOptions.ignorePages || attr(scriptElement, "ignore-pages") + overwriteOptions.ignorePages || attr(scriptElement, "ignore-pages"), ); /** endif **/ /** if allowparams **/ // Customers can allow params var allowParams = convertCommaSeparatedToArray( - overwriteOptions.allowParams || attr(scriptElement, "allow-params") + overwriteOptions.allowParams || attr(scriptElement, "allow-params"), ); /** endif **/ @@ -453,7 +453,7 @@ // Customers can allow params var nonUniqueHostnames = convertCommaSeparatedToArray( overwriteOptions.nonUniqueHostnames || - attr(scriptElement, "non-unique-hostnames") + attr(scriptElement, "non-unique-hostnames"), ); /** endif **/ @@ -554,12 +554,12 @@ /** if ignorednt **/ if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == "1") return warn( - notSendingWhen + doNotTrack + " is enabled. See " + docsUrl + "/dnt" + notSendingWhen + doNotTrack + " is enabled. See " + docsUrl + "/dnt", ); /** else **/ if (doNotTrack in nav && nav[doNotTrack] == "1") return warn( - notSendingWhen + doNotTrack + " is enabled. See " + docsUrl + "/dnt" + notSendingWhen + doNotTrack + " is enabled. See " + docsUrl + "/dnt", ); /** endif **/ @@ -574,7 +574,7 @@ locationHostname + ". See " + docsUrl + - "/overwrite-domain-name" + "/overwrite-domain-name", ); ///////////////////// @@ -645,7 +645,7 @@ hiddenStart = now(); } else msHidden += now() - hiddenStart; }, - falseVar + falseVar, ); /** endif **/ @@ -661,15 +661,15 @@ body[offsetHeight] || 0, documentElement[clientHeight] || 0, documentElement[scrollHeight] || 0, - documentElement[offsetHeight] || 0 + documentElement[offsetHeight] || 0, ); return Math.min( 100, Math.round( (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) / height / - 5 - ) * 5 + 5, + ) * 5, ); } catch (error) { warn(error); @@ -684,7 +684,7 @@ function () { if (scrolled < position()) scrolled = position(); }, - falseVar + falseVar, ); }); /** endif **/ @@ -738,7 +738,7 @@ isPushState, deleteSourceInfo, sameSite, - metadata + metadata, ) { if (isPushState) sendOnLeave("" + payload.page_id, trueVar); if (collectDataOnLeave) payload.page_id = uuid(); @@ -783,7 +783,7 @@ page.viewport_height = Math.max( documentElement[clientHeight] || 0, - window.innerHeight || 0 + window.innerHeight || 0, ) || null; } /** endif **/ @@ -857,7 +857,7 @@ isPushState, isPushState || userNavigated || !collectMetricByString("r"), // r = referrers sameSite, - metadata + metadata, ); }; @@ -924,7 +924,7 @@ function () { pageview(1); }, - falseVar + falseVar, ); addEventListenerFunc( @@ -932,7 +932,7 @@ function () { pageview(1); }, - falseVar + falseVar, ); } /** endif **/ @@ -945,7 +945,7 @@ function () { pageview(1); }, - falseVar + falseVar, ); } /** endif **/ @@ -992,7 +992,7 @@ if (validTypes.indexOf(typeof eventOutput) < 0) { warnInFunction( eventFunctionName, - event + " returns no string: " + eventOutput + event + " returns no string: " + eventOutput, ); return callback(); } @@ -1026,7 +1026,7 @@ metadata: stringify(metadata), /** endif **/ }), - callback + callback, ); } }; @@ -1069,5 +1069,5 @@ "{{baseUrl}}", "{{apiUrlPrefix}}", "{{scriptName}}", - "{{namespace}}" + "{{namespace}}", ); diff --git a/test/helpers/get-browsers.js b/test/helpers/get-browsers.js index fba8d423..2cc449f7 100644 --- a/test/helpers/get-browsers.js +++ b/test/helpers/get-browsers.js @@ -38,10 +38,10 @@ module.exports = async () => { browser_main_version: version(item.browser_version), })) .sort((left, right) => - version(left.browser_version) > version(right.browser_version) ? -1 : 1 + version(left.browser_version) > version(right.browser_version) ? -1 : 1, ) .slice(0, 2), - ["os", "browser_main_version"] + ["os", "browser_main_version"], ); const chrome = makeUnique( @@ -54,18 +54,18 @@ module.exports = async () => { ); }) .sort((left, right) => - version(left.browser_version) > version(right.browser_version) ? -1 : 1 + version(left.browser_version) > version(right.browser_version) ? -1 : 1, ), - ["os", "os_version"] + ["os", "os_version"], ); const ios = makeUnique( all .filter(({ browser }) => browser === "iphone") .sort((left, right) => - version(left.browser_version) > version(right.browser_version) ? -1 : 1 + version(left.browser_version) > version(right.browser_version) ? -1 : 1, ), - ["os", "os_version"] + ["os", "os_version"], ); const android = makeUnique( @@ -76,9 +76,9 @@ module.exports = async () => { os_main_version: parseInt(item.os_version.split(".")[0], 10), })) .sort((left, right) => - version(left.os_version) > version(right.os_version) ? -1 : 1 + version(left.os_version) > version(right.os_version) ? -1 : 1, ), - ["os", "os_main_version"] + ["os", "os_main_version"], ); const safari = makeUnique( @@ -96,10 +96,10 @@ module.exports = async () => { browser_main_version: version(item.browser_version), })) .sort((left, right) => - left.browser_main_version > right.browser_main_version ? -1 : 1 + left.browser_main_version > right.browser_main_version ? -1 : 1, ) .slice(0, 4), - ["os", "browser_main_version"] + ["os", "browser_main_version"], ).slice(0, 5); const firefox = makeUnique( @@ -112,9 +112,9 @@ module.exports = async () => { ); }) .sort((left, right) => - version(left.browser_version) > version(right.browser_version) ? -1 : 1 + version(left.browser_version) > version(right.browser_version) ? -1 : 1, ), - ["os"] + ["os"], ); const opera = makeUnique( @@ -128,9 +128,9 @@ module.exports = async () => { ); }) .sort((left, right) => - version(left.browser_version) > version(right.browser_version) ? -1 : 1 + version(left.browser_version) > version(right.browser_version) ? -1 : 1, ), - ["os"] + ["os"], ); const ipads = makeUnique( @@ -139,9 +139,9 @@ module.exports = async () => { return browser === "ipad"; }) .sort((left, right) => - version(left.os_version) > version(right.os_version) ? -1 : 1 + version(left.os_version) > version(right.os_version) ? -1 : 1, ), - ["os_version"] + ["os_version"], ); const browsers = [ diff --git a/test/helpers/index.js b/test/helpers/index.js index 25544d7c..66d8b727 100644 --- a/test/helpers/index.js +++ b/test/helpers/index.js @@ -27,7 +27,7 @@ module.exports.makeUnique = (array = [], keys = []) => { return array.reduce((list, item) => { const has = list.find((listItem) => - keys.every((key) => listItem[key] === item[key]) + keys.every((key) => listItem[key] === item[key]), ); if (!has) list.push(item); return list; @@ -92,7 +92,7 @@ module.exports.navigate = async ({ browser, os, name, driver, commands }) => { `${amount || 1}x`, typeof exceeded === "number" ? `(found request in ${exceeded}ms)` - : `(exceeded timeout)` + : `(exceeded timeout)`, ); } else if (script) { log(`script (${name})`, `${localhost}/?${searchParams}`); diff --git a/test/helpers/server.js b/test/helpers/server.js index 18ef4dfe..cf4353bc 100644 --- a/test/helpers/server.js +++ b/test/helpers/server.js @@ -66,7 +66,7 @@ const route = async (req, res) => { Simple Analytics Test

Path: ${pathname}

- ` + `, ); return res.end(); } diff --git a/test/index.js b/test/index.js index 8bafc945..fc705c9f 100644 --- a/test/index.js +++ b/test/index.js @@ -144,7 +144,7 @@ const log = (...messages) => DEBUG && console.log(" => Test:", ...messages); if (!BROWSERSTACK_USERNAME || !BROWSERSTACK_ACCESS_KEY) { console.error( - "BROWSERSTACK_USERNAME nor BROWSERSTACK_ACCESS_KEY are not defined." + "BROWSERSTACK_USERNAME nor BROWSERSTACK_ACCESS_KEY are not defined.", ); process.exit(1); } @@ -213,7 +213,7 @@ const getDeviceName = ({ const suiteInstance = Mocha.Suite.create( mochaInstance.suite, - "Public Script Test Suite" + "Public Script Test Suite", ); if (CI) @@ -223,16 +223,16 @@ const getDeviceName = ({ async function () { expect( browsers, - "Should have more than 20 browsers" + "Should have more than 20 browsers", ).to.have.lengthOf.at.least(20); - } - ) + }, + ), ); suiteInstance.addTest( new Mocha.Test(`Test Node.js environment`, async function () { expect(process.version, "Should use Node.js 16.16").to.match(/^v16\.16/); - }) + }), ); const appendBrowserData = (browser) => { @@ -409,7 +409,7 @@ const getDeviceName = ({ const testName = `Testing ${browser.name} (${index + 1}/${total})`; const nextBrowser = browsers[index + 1]; suiteInstance.addTest( - new Mocha.Test(testName, () => test(browser, nextBrowser)) + new Mocha.Test(testName, () => test(browser, nextBrowser)), ); } diff --git a/test/test-beacon.js b/test/test-beacon.js index b9aefce1..b47a98de 100644 --- a/test/test-beacon.js +++ b/test/test-beacon.js @@ -9,48 +9,48 @@ module.exports = async () => { expect( beaconRequests, - "There are not enough beacon requests found" + "There are not enough beacon requests found", ).to.have.lengthOf(2); expect( beaconRequests[0].pathname, - "First beacon request should be send via GIF" + "First beacon request should be send via GIF", ).to.equal("/simple.gif"); expect( beaconRequests[1].pathname, - "Second beacon request should be send via /append" + "Second beacon request should be send via /append", ).to.equal("/append"); beaconRequests.map((request) => { expect( request, - "There are no page view requests with body found" + "There are no page view requests with body found", ).to.have.property("body"); expect( request.body, - "All required keys should be present" + "All required keys should be present", ).to.include.all.keys(["duration", "scrolled", "original_id", "type"]); expect( UUIDvalidate(request.body.original_id, 4), - "original_id should be a valid UUIDv4" + "original_id should be a valid UUIDv4", ).to.be.true; expect( parseInt(request.body.scrolled, 10), - "Scrolled should be close to 35 percent" + "Scrolled should be close to 35 percent", ).to.be.closeTo(35, 5); expect( parseInt(request.body.duration, 10), - "Duration should be a valid number" + "Duration should be a valid number", ).to.be.a("number"); expect( parseInt(request.body.duration, 10), - "Duration should be close to 0 or 1 second" + "Duration should be close to 0 or 1 second", ).to.be.closeTo(2, 2); }); }; diff --git a/test/test-events.js b/test/test-events.js index 04e633d2..734dd018 100644 --- a/test/test-events.js +++ b/test/test-events.js @@ -10,31 +10,31 @@ module.exports = async ({ os, browser }) => { expect(requests, "There should be two event requests").to.have.lengthOf(3); expect(requests[0].body.event, "Event should be 'event_123'").to.equal( - "event_123" + "event_123", ); expect(requests[1].body.event, "Event should be 'functionoutput'").to.equal( - "functionoutput" + "functionoutput", ); expect(requests[2].body.metadata, "Event should have metadata").to.contain( - '","bool":false,"int":20301,"string":"hi\'/301%20uas@#*0"}' + '","bool":false,"int":20301,"string":"hi\'/301%20uas@#*0"}', ); expect( new Date(JSON.parse(requests[2].body.metadata).date), - "Event should have a date in the last 5 minutes" + "Event should have a date in the last 5 minutes", ).to.greaterThan(new Date(Date.now() - 300000)); requests.map((request) => { expect( request, - "There are no event requests with body found" + "There are no event requests with body found", ).to.have.property("body"); expect( request.body, - "All required keys should be present" + "All required keys should be present", ).to.include.all.keys([ "version", "hostname", @@ -47,34 +47,34 @@ module.exports = async ({ os, browser }) => { expect( UUIDvalidate(request.body.id, 4), - "event id should be a valid UUIDv4" + "event id should be a valid UUIDv4", ).to.be.true; expect( UUIDvalidate(request.body.session_id, 4), - "session_id should be a valid UUIDv4" + "session_id should be a valid UUIDv4", ).to.be.true; expect( UUIDvalidate(request.body.page_id, 4), - "page_id should be a valid UUIDv4" + "page_id should be a valid UUIDv4", ).to.be.true; if (os === "ios" || browser === "safari") { expect( request.body.hostname, - "Hostname should be bs-local.com on OS X Safari" + "Hostname should be bs-local.com on OS X Safari", ).to.equal("bs-local.com:3000"); } else { expect( request.body.hostname, - "Hostname should be localhost on non iOS" + "Hostname should be localhost on non iOS", ).to.equal("localhost:3000"); } expect( parseInt(request.body.version, 10), - "Version should be a valid number" + "Version should be a valid number", ).to.be.a("number"); }); }; diff --git a/test/test-no-pushstate.js b/test/test-no-pushstate.js index 0dda1a39..503a7209 100644 --- a/test/test-no-pushstate.js +++ b/test/test-no-pushstate.js @@ -11,28 +11,28 @@ module.exports = async () => { expect( pageViewRequests, - "There are not enough page views requests found" + "There are not enough page views requests found", ).to.have.lengthOf(2); expect( pageViewRequests[0].body.unique, - "The first visit should be unique" + "The first visit should be unique", ).to.equal("true"); expect( pageViewRequests[1].body.unique, - "The second visit should not be unique" + "The second visit should not be unique", ).to.equal("false"); pageViewRequests.map((request) => { expect( request, - "There are no page view requests with body found" + "There are no page view requests with body found", ).to.have.property("body"); expect( request.body, - "All required keys should be present" + "All required keys should be present", ).to.include.all.keys([ "hostname", "https", @@ -53,7 +53,7 @@ module.exports = async () => { expect( parseInt(request.body.version, 10), - "Version should be a valid number" + "Version should be a valid number", ).to.be.a("number"); // We replace "https:" with "http:" string on CI diff --git a/test/test-one-beacon.js b/test/test-one-beacon.js index 03d6ee9b..ff7cbaf8 100644 --- a/test/test-one-beacon.js +++ b/test/test-one-beacon.js @@ -9,24 +9,24 @@ module.exports = async () => { expect( beaconRequests, - "There should be 1 beacon type request" + "There should be 1 beacon type request", ).to.have.lengthOf(1); const request = beaconRequests[0]; expect( request.pathname, - "First beacon request should be send via GIF" + "First beacon request should be send via GIF", ).to.equal("/simple.gif"); expect( request, - "There are no beacon requests with body found" + "There are no beacon requests with body found", ).to.have.property("body"); expect( request.body, - "All required keys should be present" + "All required keys should be present", ).to.include.all.keys([ "hostname", "duration", @@ -37,21 +37,21 @@ module.exports = async () => { expect( UUIDvalidate(request.body.original_id, 4), - "original_id should be a valid UUIDv4" + "original_id should be a valid UUIDv4", ).to.be.true; expect( parseInt(request.body.scrolled, 10), - "Scrolled should be close to 35 percent" + "Scrolled should be close to 35 percent", ).to.be.closeTo(35, 5); expect( parseInt(request.body.duration, 10), - "Duration should be a valid number" + "Duration should be a valid number", ).to.be.a("number"); expect( parseInt(request.body.version, 10), - "Version should be a valid number" + "Version should be a valid number", ).to.be.a("number"); }; diff --git a/test/test-pushstate.js b/test/test-pushstate.js index bd3781b5..62e9540f 100644 --- a/test/test-pushstate.js +++ b/test/test-pushstate.js @@ -11,23 +11,23 @@ module.exports = async () => { expect( pageViewRequests, - "There are not enough page views requests found" + "There are not enough page views requests found", ).to.have.lengthOf(2); expect([true, "true"], "The first visit should be unique").to.include( - pageViewRequests[0].body.unique + pageViewRequests[0].body.unique, ); expect([false, "false"], "The second visit should not be unique").to.include( - pageViewRequests[1].body.unique + pageViewRequests[1].body.unique, ); expect(pageViewRequests[0].body.query, "Query should exist").to.equal( - "project=project_x&utm_source=utm_source&medium=medium&ref=ref" + "project=project_x&utm_source=utm_source&medium=medium&ref=ref", ); expect(pageViewRequests[1].body.query, "Query should not exist").to.equal( - "project=project_x" + "project=project_x", ); // Seconds page referrer should be the first page (ending with /) @@ -36,12 +36,12 @@ module.exports = async () => { pageViewRequests.map((request) => { expect( request, - "There are no page view requests with body found" + "There are no page view requests with body found", ).to.have.property("body"); expect( request.body, - "All required keys should be present" + "All required keys should be present", ).to.include.all.keys([ "hostname", "https", @@ -63,7 +63,7 @@ module.exports = async () => { expect( parseInt(request.body.version, 10), - "Version should be a valid number" + "Version should be a valid number", ).to.be.a("number"); // We replace "https:" with "http:" string on CI From 49241748ce5e696f78f3ffeb922bfef144225fce Mon Sep 17 00:00:00 2001 From: Adriaan van Rossum <1079135+adriaanvanrossum@users.noreply.github.com> Date: Fri, 14 Jul 2023 20:49:16 +0200 Subject: [PATCH 08/62] Test for all Cloudflare params --- src/default.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/default.js b/src/default.js index 09beb8c1..16202783 100644 --- a/src/default.js +++ b/src/default.js @@ -839,7 +839,7 @@ /** if uniques **/ // We set unique variable based on pushstate or back navigation, if no match we check the referrer page.unique = - /__cf_chl_tk/i.test(getReferrer()) || isPushState || userNavigated + /__cf_/i.test(getReferrer()) || isPushState || userNavigated ? falseVar : !sameSite; /** endif **/ From 23e043d6f96f005d4ba4f0da71404a42d4a58c7f Mon Sep 17 00:00:00 2001 From: Adriaan van Rossum <1079135+adriaanvanrossum@users.noreply.github.com> Date: Thu, 7 Mar 2024 18:28:09 +0100 Subject: [PATCH 09/62] Clean subdomain hostname, fix auto events for links with child elements, run prettier --- .prettierrc.json | 1 + compile.js | 2 +- dist/v12/app.js | 4 ++++ dist/v12/app.js.map | 1 + dist/v12/auto-events.js | 4 ++++ dist/v12/auto-events.js.map | 1 + dist/v12/custom/app.js | 4 ++++ dist/v12/custom/app.js.map | 1 + dist/v12/custom/auto-events.js | 4 ++++ dist/v12/custom/auto-events.js.map | 1 + dist/v12/custom/light.js | 4 ++++ dist/v12/custom/light.js.map | 1 + dist/v12/custom/proxy.js | 4 ++++ dist/v12/custom/proxy.js.map | 1 + dist/v12/light.js | 4 ++++ dist/v12/light.js.map | 1 + package-lock.json | 22 +++++++++++++++++++++ package.json | 4 +++- playground/callback.html | 5 ++--- playground/events.html | 5 ++--- src/auto-events.js | 4 ++-- src/default.js | 31 +++++++++++++++++++----------- 22 files changed, 88 insertions(+), 21 deletions(-) create mode 100644 .prettierrc.json create mode 100644 dist/v12/app.js create mode 100644 dist/v12/app.js.map create mode 100644 dist/v12/auto-events.js create mode 100644 dist/v12/auto-events.js.map create mode 100644 dist/v12/custom/app.js create mode 100644 dist/v12/custom/app.js.map create mode 100644 dist/v12/custom/auto-events.js create mode 100644 dist/v12/custom/auto-events.js.map create mode 100644 dist/v12/custom/light.js create mode 100644 dist/v12/custom/light.js.map create mode 100644 dist/v12/custom/proxy.js create mode 100644 dist/v12/custom/proxy.js.map create mode 100644 dist/v12/light.js create mode 100644 dist/v12/light.js.map diff --git a/.prettierrc.json b/.prettierrc.json new file mode 100644 index 00000000..0967ef42 --- /dev/null +++ b/.prettierrc.json @@ -0,0 +1 @@ +{} diff --git a/compile.js b/compile.js index 343e22de..f57a9550 100644 --- a/compile.js +++ b/compile.js @@ -8,7 +8,7 @@ const GREEN = "\x1b[32m%s\x1b[0m"; const YELLOW = "\x1b[33m%s\x1b[0m"; const RED = "\x1b[31m%s\x1b[0m"; -const VERSION = 11; +const VERSION = 12; Handlebars.registerHelper("or", function (param1, param2) { return param1 || param2; diff --git a/dist/v12/app.js b/dist/v12/app.js new file mode 100644 index 00000000..f418e37a --- /dev/null +++ b/dist/v12/app.js @@ -0,0 +1,4 @@ +/* Simple Analytics - Privacy friendly analytics (docs.simpleanalytics.com/script; 2024-03-07; b254; SRI-version; v12) */ + +!function(l,t,e,n,p){try{var f=undefined,h=!0,d=!1,r="true",a="https:",m="pageview",u="event",i="error",o=l.console,c="doNotTrack",g=l.navigator,s=l.location,v=s.host,y=l.document,_=g.userAgent,w="Not sending request ",b=w+"when ",E=d,O=encodeURIComponent,x=decodeURIComponent,S=JSON.stringify,M=l.addEventListener,k="https://queue."+e,q=y.documentElement||{},A="language",j="Height",D="scroll",$=g.userAgentData,C=D+j,R="offset"+j,H="client"+j,P="pagehide",T="platform",U="platformVersion",I="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(_)&&!/(cubot)/i.test(_),N=l.screen,z=y.currentScript||y.querySelector('script[src*="'+e+'"]');p=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){p("Error in your "+t+" function:",e)},W=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},G=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},J=function(t,e){return t&&t.getAttribute("data-"+e)},L=function(t){return Array.isArray(t)?t:"string"==typeof t&&t.length?t.split(/, ?/):[]},Y=function(t){return t&&t.constructor===Object},Z=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},rt=function(t){return"function"==typeof t},at="namespace",it=t[at]||J(z,at)||"sa",ot=l[it+"_metadata"],ct=function(t,e){Y(ot)&&(t=Z(t,ot));var n=l[kt];if(!rt(n))return t;try{return Z(t,n.call(l,Z(t,e)))}catch(r){F("metadata",r)}},st=t.strictUtm||J(z,"strict-utm")==r,ut=function(a){return s.search.slice(1).split("&").filter(function(t){var e=a||!tt("ut"),n=xt.map(G).join("|"),r=e?"^("+n+")=":"^((utm_)"+(st?"":"?")+"(source|medium|content|term|campaign)"+(st?"":"|ref")+"|"+n+")=";return e&&!xt.length?d:new RegExp(r).test(t)}).join("&")||f},lt=it+"_loaded";if(l[lt]==h)return p(w+"twice");l.sa_event_loaded=h,l[lt]=h;var pt=function(e,t,n){e=n?e:Z(Dt,Rt,e),g.brave&&!n&&(e.brave=h),g._duckduckgoloader_&&!n&&(e.duck=h);var r=new Image;t&&(r.onerror=t,r.onload=t),r.src=k+"/simple.gif?"+Object.keys(e).filter(function(t){return e[t]!=f}).map(function(t){return O(t)+"="+O(e[t])}).join("&")+"&time="+Date.now()},ft=function(t){if(t)return t.replace(/^(https?:\/\/)?((m|l|w{2,3}([0-9]+)?)\.)?([^?#]+)(.*)$/,"$5")},ht=ft(t.hostname||J(z,"hostname")),dt=ft(ht||v),mt={version:"cdn_latest_12",hostname:dt};n=function(t){t=t.stack?t+" "+t.stack:t,p(t),pt(Z(mt,{type:i,error:t,path:s.pathname}),f,h)},M(i,function(t){t.filename&&-1> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var metadataObject = window[namespace + \"_metadata\"];\n var appendMetadata = function (metadata, data) {\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) return metadata;\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var getQueryParams = function (ignoreSource) {\n return (\n loc.search\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex).test(keyValue);\n })\n .join(\"&\") || undefinedVar\n );\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n var cleanSubdomain = function (url) {\n if (!url) return;\n return url.replace(\n /^(https?:\\/\\/)?((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/,\n \"$5\"\n );\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname = cleanSubdomain(\n overwriteOptions.hostname || attr(scriptElement, \"hostname\")\n );\n\n var definedHostname = cleanSubdomain(\n overwrittenHostname || locationHostname\n );\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = trueVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n return cleanSubdomain(\n (doc.referrer || \"\").replace(locationHostname, definedHostname)\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n nav.sendBeacon(fullApiUrl + \"/append\", stringify(append));\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n metadata\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n\n sendData({\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: getQueryParams(deleteSourceInfo),\n\n metadata: stringify(metadata),\n });\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (isPushState, pathOverwrite, metadata) {\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n sendPageView(\n isPushState,\n isPushState || userNavigated || !collectMetricByString(\"r\"), // r = referrers\n sameSite,\n metadata\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata) {\n pageview(0, path, metadata);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"simpleanalyticscdn.com\",\n \"queue.\",\n \"cdn_latest_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","protocol","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","metadataObject","appendMetadata","metadata","data","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","search","keyValue","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","cleanSubdomain","url","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","indexOf","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","i","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","e","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","callbackRaw","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue","q"],"mappings":"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"} \ No newline at end of file diff --git a/dist/v12/auto-events.js b/dist/v12/auto-events.js new file mode 100644 index 00000000..847ff7cd --- /dev/null +++ b/dist/v12/auto-events.js @@ -0,0 +1,4 @@ +/* Simple Analytics - Privacy friendly analytics (docs.simpleanalytics.com/script; 2024-03-07; 1cc1; SRI-version; v12) */ + +function r(t,e){var a,o=!1;h.downloads&&/^https?:\/\//i.test(t.href)&&new RegExp("\\.("+(h.downloadsExtensions||[]).join("|")+")$","i").test(t.pathname)?o="download":h.outbound&&/^https?:\/\//i.test(t.href)&&t.hostname!==m.location.hostname?o="outbound":h.emails&&/^mailto:/i.test(t.href)&&(o="email"),o&&(e?(a="saAutomatedLink(this, '"+o+"');",t.hasAttribute("target")&&"_self"!==t.getAttribute("target")||(a+=" return false;"),t.setAttribute("onclick",a)):t.addEventListener("click",function(){saAutomatedLink(t,o)}))}function e(){try{for(var t=document.getElementsByTagName("a"),e=0;e -1,\n emails: collectTypes.indexOf(\"emails\") > -1,\n downloads: collectTypes.indexOf(\"downloads\") > -1,\n // Downloads: enter file extensions you want to collect\n downloadsExtensions: setting(\"extensions\", \"array\", [\n \"pdf\",\n \"csv\",\n \"docx\",\n \"xlsx\",\n \"zip\",\n \"doc\",\n \"xls\",\n ]),\n\n // All: use title attribute if set for event name (for all events)\n // THIS TAKES PRECEDENCE OVER OTHER SETTINGS BELOW\n title: setting(\"useTitle\", \"bool\", true),\n // Outbound: use full URL of the links? false for just the hostname\n outboundFullUrl: fullUrls,\n // Downloads: if taking event name from URL, use full URL or just filename (default)\n downloadsFullUrl: fullUrls,\n };\n\n var saGlobal = setting(\"saGlobal\", \"string\", \"sa_event\");\n\n // For compiling the script\n var optionsLink = options;\n\n if (typeof optionsLink === \"undefined\")\n log(\"options object not found, please specify\", \"warn\");\n\n window.saAutomatedLink = function saAutomatedLink(element, type) {\n try {\n if (!element) return log(\"no element found\");\n var sent = false;\n\n var callback = function () {\n if (!sent && !element.hasAttribute(\"target\"))\n document.location = element.getAttribute(\"href\");\n sent = true;\n };\n\n if (window[saGlobal] && window[saGlobal + \"_loaded\"]) {\n var hostname = element.hostname;\n var pathname = element.pathname;\n\n var event;\n var metadata = {\n title: element.getAttribute(\"title\") || undefined,\n };\n var url = element.href || undefined;\n\n var useTitle = false;\n if (optionsLink.title && element.hasAttribute(\"title\")) {\n var theTitle = element.getAttribute(\"title\").trim();\n if (theTitle != \"\") useTitle = true;\n }\n\n if (useTitle) {\n event = theTitle;\n } else {\n switch (type) {\n case \"outbound\": {\n event = hostname + (optionsLink.outboundFullUrl ? pathname : \"\");\n metadata.url = url;\n break;\n }\n case \"download\": {\n event = optionsLink.downloadsFullUrl\n ? hostname + pathname\n : pathname.split(\"/\").pop();\n metadata.url = url;\n break;\n }\n case \"email\": {\n var href = element.getAttribute(\"href\");\n event = (href.split(\":\")[1] || \"\").split(\"?\")[0];\n metadata.email = event;\n break;\n }\n }\n }\n\n var clean =\n type +\n \"_\" +\n event.replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_+|_+$)/g, \"\");\n\n window[saGlobal](clean, metadata, callback);\n\n log(\"collected \" + clean);\n\n return type === \"email\"\n ? callback()\n : window.setTimeout(callback, 5000);\n } else {\n log(saGlobal + \" is not defined\", \"warn\");\n return callback();\n }\n } catch (error) {\n log(error.message, \"warn\");\n }\n };\n\n function collectLink(link, onclick) {\n var collect = false;\n\n // Collect download clicks\n if (\n optionsLink.downloads &&\n /^https?:\\/\\//i.test(link.href) &&\n new RegExp(\n \"\\\\.(\" + (optionsLink.downloadsExtensions || []).join(\"|\") + \")$\",\n \"i\"\n ).test(link.pathname)\n ) {\n collect = \"download\";\n\n // Collect outbound links clicks\n } else if (\n optionsLink.outbound &&\n /^https?:\\/\\//i.test(link.href) &&\n link.hostname !== window.location.hostname\n ) {\n collect = \"outbound\";\n\n // Collect email clicks\n } else if (optionsLink.emails && /^mailto:/i.test(link.href)) {\n collect = \"email\";\n }\n\n if (!collect) return;\n\n if (onclick) {\n var onClickAttribute = \"saAutomatedLink(this, '\" + collect + \"');\";\n\n if (\n !link.hasAttribute(\"target\") ||\n link.getAttribute(\"target\") === \"_self\"\n )\n onClickAttribute += \" return false;\";\n\n link.setAttribute(\"onclick\", onClickAttribute);\n } else {\n link.addEventListener(\"click\", function () {\n saAutomatedLink(link, collect);\n });\n }\n }\n\n function onDOMContentLoaded() {\n try {\n var a = document.getElementsByTagName(\"a\");\n\n // Loop over all links on the page\n for (var i = 0; i < a.length; i++) {\n var link = a[i];\n var href = link.getAttribute(\"href\");\n\n // Skip links that don't have an href\n if (!href) continue;\n\n // We don't want to overwrite website behaviour so we check for the onclick attribute\n if (!link.getAttribute(\"onclick\") && !/^mailto:/.test(href)) {\n collectLink(link, true);\n } else {\n collectLink(link, false);\n }\n }\n } catch (error) {\n log(error.message, \"warn\");\n }\n }\n\n if (doc.readyState === \"ready\" || doc.readyState === \"complete\") {\n onDOMContentLoaded();\n } else {\n document.addEventListener(\"readystatechange\", function (event) {\n if (event.target.readyState === \"complete\") onDOMContentLoaded();\n });\n }\n})(window);\n"],"names":["collectLink","link","onclick","onClickAttribute","collect","optionsLink","downloads","test","href","RegExp","downloadsExtensions","join","pathname","outbound","hostname","window","location","emails","hasAttribute","getAttribute","setAttribute","addEventListener","saAutomatedLink","onDOMContentLoaded","a","document","getElementsByTagName","i","length","error","log","message","doc","scriptElement","setting","collectTypes","fullUrls","options","saGlobal","type","logger","console","warn","info","currentScript","querySelector","attribute","defaultValue","value","dataset","split","map","item","trim","filter","Boolean","indexOf","title","outboundFullUrl","downloadsFullUrl","element","sent","callback","theTitle","metadata","undefined","url","useTitle","event","pop","email","clean","replace","setTimeout","readyState","target"],"mappings":"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"} \ No newline at end of file diff --git a/dist/v12/custom/app.js b/dist/v12/custom/app.js new file mode 100644 index 00000000..391bffc9 --- /dev/null +++ b/dist/v12/custom/app.js @@ -0,0 +1,4 @@ +/* Simple Analytics - Privacy friendly analytics (docs.simpleanalytics.com/script; 2024-03-07; 3ec0; SRI-version; v12) */ + +!function(l,t,e,n,p){try{var f=undefined,h=!0,d=!1,r="true",a="https:",m="pageview",u="event",i="error",o=l.console,c="doNotTrack",g=l.navigator,s=l.location,v=s.host,y=l.document,_=g.userAgent,w="Not sending request ",b=w+"when ",E=d,O=encodeURIComponent,x=decodeURIComponent,S=JSON.stringify,M=l.addEventListener,k="https://"+e,A=y.documentElement||{},q="language",j="Height",D="scroll",$=g.userAgentData,C=D+j,H="offset"+j,R="client"+j,P="pagehide",T="platform",U="platformVersion",I="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(_)&&!/(cubot)/i.test(_),N=l.screen,z=y.currentScript||y.querySelector('script[src*="'+e+'"]');p=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){p("Error in your "+t+" function:",e)},W=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},G=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},J=function(t,e){return t&&t.getAttribute("data-"+e)},L=function(t){return Array.isArray(t)?t:"string"==typeof t&&t.length?t.split(/, ?/):[]},Y=function(t){return t&&t.constructor===Object},Z=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},rt=function(t){return"function"==typeof t},at="namespace",it=t[at]||J(z,at)||"sa",ot=l[it+"_metadata"],ct=function(t,e){Y(ot)&&(t=Z(t,ot));var n=l[kt];if(!rt(n))return t;try{return Z(t,n.call(l,Z(t,e)))}catch(r){F("metadata",r)}},st=t.strictUtm||J(z,"strict-utm")==r,ut=function(a){return s.search.slice(1).split("&").filter(function(t){var e=a||!tt("ut"),n=xt.map(G).join("|"),r=e?"^("+n+")=":"^((utm_)"+(st?"":"?")+"(source|medium|content|term|campaign)"+(st?"":"|ref")+"|"+n+")=";return e&&!xt.length?d:new RegExp(r).test(t)}).join("&")||f},lt=it+"_loaded";if(l[lt]==h)return p(w+"twice");l.sa_event_loaded=h,l[lt]=h;var pt=function(e,t,n){e=n?e:Z(Dt,Ht,e),g.brave&&!n&&(e.brave=h),g._duckduckgoloader_&&!n&&(e.duck=h);var r=new Image;t&&(r.onerror=t,r.onload=t),r.src=k+"/simple.gif?"+Object.keys(e).filter(function(t){return e[t]!=f}).map(function(t){return O(t)+"="+O(e[t])}).join("&")+"&time="+Date.now()},ft=function(t){if(t)return t.replace(/^(https?:\/\/)?((m|l|w{2,3}([0-9]+)?)\.)?([^?#]+)(.*)$/,"$5")},ht=ft(t.hostname||J(z,"hostname")),dt=ft(ht||v),mt={version:"custom_app_12",hostname:dt};n=function(t){t=t.stack?t+" "+t.stack:t,p(t),pt(Z(mt,{type:i,error:t,path:s.pathname}),f,h)},M(i,function(t){t.filename&&-1"); +//# sourceMappingURL=app.js.map \ No newline at end of file diff --git a/dist/v12/custom/app.js.map b/dist/v12/custom/app.js.map new file mode 100644 index 00000000..d4ffdcdf --- /dev/null +++ b/dist/v12/custom/app.js.map @@ -0,0 +1 @@ +{"version":3,"file":"app.source.js","sources":["app.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var metadataObject = window[namespace + \"_metadata\"];\n var appendMetadata = function (metadata, data) {\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) return metadata;\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var getQueryParams = function (ignoreSource) {\n return (\n loc.search\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex).test(keyValue);\n })\n .join(\"&\") || undefinedVar\n );\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n var cleanSubdomain = function (url) {\n if (!url) return;\n return url.replace(\n /^(https?:\\/\\/)?((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/,\n \"$5\"\n );\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname = cleanSubdomain(\n overwriteOptions.hostname || attr(scriptElement, \"hostname\")\n );\n\n var definedHostname = cleanSubdomain(\n overwrittenHostname || locationHostname\n );\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = trueVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n return cleanSubdomain(\n (doc.referrer || \"\").replace(locationHostname, definedHostname)\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n nav.sendBeacon(fullApiUrl + \"/append\", stringify(append));\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n metadata\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n\n sendData({\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: getQueryParams(deleteSourceInfo),\n\n metadata: stringify(metadata),\n });\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (isPushState, pathOverwrite, metadata) {\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n sendPageView(\n isPushState,\n isPushState || userNavigated || !collectMetricByString(\"r\"), // r = referrers\n sameSite,\n metadata\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata) {\n pageview(0, path, metadata);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_app_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","metadataObject","appendMetadata","metadata","data","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","search","keyValue","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","cleanSubdomain","url","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","indexOf","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","protocol","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","i","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","e","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","callbackRaw","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue","q"],"mappings":"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"} \ No newline at end of file diff --git a/dist/v12/custom/auto-events.js b/dist/v12/custom/auto-events.js new file mode 100644 index 00000000..847ff7cd --- /dev/null +++ b/dist/v12/custom/auto-events.js @@ -0,0 +1,4 @@ +/* Simple Analytics - Privacy friendly analytics (docs.simpleanalytics.com/script; 2024-03-07; 1cc1; SRI-version; v12) */ + +function r(t,e){var a,o=!1;h.downloads&&/^https?:\/\//i.test(t.href)&&new RegExp("\\.("+(h.downloadsExtensions||[]).join("|")+")$","i").test(t.pathname)?o="download":h.outbound&&/^https?:\/\//i.test(t.href)&&t.hostname!==m.location.hostname?o="outbound":h.emails&&/^mailto:/i.test(t.href)&&(o="email"),o&&(e?(a="saAutomatedLink(this, '"+o+"');",t.hasAttribute("target")&&"_self"!==t.getAttribute("target")||(a+=" return false;"),t.setAttribute("onclick",a)):t.addEventListener("click",function(){saAutomatedLink(t,o)}))}function e(){try{for(var t=document.getElementsByTagName("a"),e=0;e -1,\n emails: collectTypes.indexOf(\"emails\") > -1,\n downloads: collectTypes.indexOf(\"downloads\") > -1,\n // Downloads: enter file extensions you want to collect\n downloadsExtensions: setting(\"extensions\", \"array\", [\n \"pdf\",\n \"csv\",\n \"docx\",\n \"xlsx\",\n \"zip\",\n \"doc\",\n \"xls\",\n ]),\n\n // All: use title attribute if set for event name (for all events)\n // THIS TAKES PRECEDENCE OVER OTHER SETTINGS BELOW\n title: setting(\"useTitle\", \"bool\", true),\n // Outbound: use full URL of the links? false for just the hostname\n outboundFullUrl: fullUrls,\n // Downloads: if taking event name from URL, use full URL or just filename (default)\n downloadsFullUrl: fullUrls,\n };\n\n var saGlobal = setting(\"saGlobal\", \"string\", \"sa_event\");\n\n // For compiling the script\n var optionsLink = options;\n\n if (typeof optionsLink === \"undefined\")\n log(\"options object not found, please specify\", \"warn\");\n\n window.saAutomatedLink = function saAutomatedLink(element, type) {\n try {\n if (!element) return log(\"no element found\");\n var sent = false;\n\n var callback = function () {\n if (!sent && !element.hasAttribute(\"target\"))\n document.location = element.getAttribute(\"href\");\n sent = true;\n };\n\n if (window[saGlobal] && window[saGlobal + \"_loaded\"]) {\n var hostname = element.hostname;\n var pathname = element.pathname;\n\n var event;\n var metadata = {\n title: element.getAttribute(\"title\") || undefined,\n };\n var url = element.href || undefined;\n\n var useTitle = false;\n if (optionsLink.title && element.hasAttribute(\"title\")) {\n var theTitle = element.getAttribute(\"title\").trim();\n if (theTitle != \"\") useTitle = true;\n }\n\n if (useTitle) {\n event = theTitle;\n } else {\n switch (type) {\n case \"outbound\": {\n event = hostname + (optionsLink.outboundFullUrl ? pathname : \"\");\n metadata.url = url;\n break;\n }\n case \"download\": {\n event = optionsLink.downloadsFullUrl\n ? hostname + pathname\n : pathname.split(\"/\").pop();\n metadata.url = url;\n break;\n }\n case \"email\": {\n var href = element.getAttribute(\"href\");\n event = (href.split(\":\")[1] || \"\").split(\"?\")[0];\n metadata.email = event;\n break;\n }\n }\n }\n\n var clean =\n type +\n \"_\" +\n event.replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_+|_+$)/g, \"\");\n\n window[saGlobal](clean, metadata, callback);\n\n log(\"collected \" + clean);\n\n return type === \"email\"\n ? callback()\n : window.setTimeout(callback, 5000);\n } else {\n log(saGlobal + \" is not defined\", \"warn\");\n return callback();\n }\n } catch (error) {\n log(error.message, \"warn\");\n }\n };\n\n function collectLink(link, onclick) {\n var collect = false;\n\n // Collect download clicks\n if (\n optionsLink.downloads &&\n /^https?:\\/\\//i.test(link.href) &&\n new RegExp(\n \"\\\\.(\" + (optionsLink.downloadsExtensions || []).join(\"|\") + \")$\",\n \"i\"\n ).test(link.pathname)\n ) {\n collect = \"download\";\n\n // Collect outbound links clicks\n } else if (\n optionsLink.outbound &&\n /^https?:\\/\\//i.test(link.href) &&\n link.hostname !== window.location.hostname\n ) {\n collect = \"outbound\";\n\n // Collect email clicks\n } else if (optionsLink.emails && /^mailto:/i.test(link.href)) {\n collect = \"email\";\n }\n\n if (!collect) return;\n\n if (onclick) {\n var onClickAttribute = \"saAutomatedLink(this, '\" + collect + \"');\";\n\n if (\n !link.hasAttribute(\"target\") ||\n link.getAttribute(\"target\") === \"_self\"\n )\n onClickAttribute += \" return false;\";\n\n link.setAttribute(\"onclick\", onClickAttribute);\n } else {\n link.addEventListener(\"click\", function () {\n saAutomatedLink(link, collect);\n });\n }\n }\n\n function onDOMContentLoaded() {\n try {\n var a = document.getElementsByTagName(\"a\");\n\n // Loop over all links on the page\n for (var i = 0; i < a.length; i++) {\n var link = a[i];\n var href = link.getAttribute(\"href\");\n\n // Skip links that don't have an href\n if (!href) continue;\n\n // We don't want to overwrite website behaviour so we check for the onclick attribute\n if (!link.getAttribute(\"onclick\") && !/^mailto:/.test(href)) {\n collectLink(link, true);\n } else {\n collectLink(link, false);\n }\n }\n } catch (error) {\n log(error.message, \"warn\");\n }\n }\n\n if (doc.readyState === \"ready\" || doc.readyState === \"complete\") {\n onDOMContentLoaded();\n } else {\n document.addEventListener(\"readystatechange\", function (event) {\n if (event.target.readyState === \"complete\") onDOMContentLoaded();\n });\n }\n})(window);\n"],"names":["collectLink","link","onclick","onClickAttribute","collect","optionsLink","downloads","test","href","RegExp","downloadsExtensions","join","pathname","outbound","hostname","window","location","emails","hasAttribute","getAttribute","setAttribute","addEventListener","saAutomatedLink","onDOMContentLoaded","a","document","getElementsByTagName","i","length","error","log","message","doc","scriptElement","setting","collectTypes","fullUrls","options","saGlobal","type","logger","console","warn","info","currentScript","querySelector","attribute","defaultValue","value","dataset","split","map","item","trim","filter","Boolean","indexOf","title","outboundFullUrl","downloadsFullUrl","element","sent","callback","theTitle","metadata","undefined","url","useTitle","event","pop","email","clean","replace","setTimeout","readyState","target"],"mappings":";;AAoJE,SAASA,EAAYC,EAAMC,GACzB,IA6BMC,EA7BFC,GAAU,EAIZC,EAAYC,WACZ,gBAAgBC,KAAKN,EAAKO,OAC1B,IAAIC,OACF,QAAUJ,EAAYK,qBAAuB,IAAIC,KAAK,KAAO,KAC7D,KACAJ,KAAKN,EAAKW,UAEZR,EAAU,WAIVC,EAAYQ,UACZ,gBAAgBN,KAAKN,EAAKO,OAC1BP,EAAKa,WAAaC,EAAOC,SAASF,SAElCV,EAAU,WAGDC,EAAYY,QAAU,YAAYV,KAAKN,EAAKO,QACrDJ,EAAU,SAGPA,IAEDF,GACEC,EAAmB,0BAA4BC,EAAU,MAG1DH,EAAKiB,aAAa,WACa,UAAhCjB,EAAKkB,aAAa,YAElBhB,GAAoB,kBAEtBF,EAAKmB,aAAa,UAAWjB,IAE7BF,EAAKoB,iBAAiB,QAAS,WAC7BC,gBAAgBrB,EAAMG,MAK5B,SAASmB,IACP,IAIE,IAHA,IAAIC,EAAIC,SAASC,qBAAqB,KAG7BC,EAAI,EAAGA,EAAIH,EAAEI,OAAQD,IAAK,CACjC,IAAI1B,EAAOuB,EAAEG,GACTnB,EAAOP,EAAKkB,aAAa,QAGxBX,IAGAP,EAAKkB,aAAa,YAAe,WAAWZ,KAAKC,GAGpDR,EAAYC,GAAM,GAFlBD,EAAYC,GAAM,KAKtB,MAAO4B,GACPC,EAAID,EAAME,QAAS,SAtNzB,IAA4BhB,EAItBe,EAKAE,EAEAC,EAGAC,EAqBAC,EAKAC,EAEAC,EAyBAC,EAGAjC,OApEkB,KAFIU,EAiOzBA,UA7NGe,EAAM,SAAUC,EAASQ,GAC3B,IAAIC,EAAkB,SAATD,EAAkBE,QAAQC,KAAOD,QAAQE,KACtD,OAAOH,GAAUA,EAAO,gCAAiCT,IAGvDC,EAAMjB,EAAOU,SAEbQ,EACFD,EAAIY,eAAiBZ,EAAIa,cAAc,iCAuBrCV,GArBAD,EAAU,SAAUY,EAAWP,EAAMQ,GACvC,IAAIC,EAAQf,GAAiBA,EAAcgB,QAAQH,GAGnD,MAAa,SAATP,GAA8B,SAAVS,GAA8B,UAAVA,EAE1B,SAATT,EAAwBQ,EAGpB,UAATR,GAAoBS,EACfA,EACJE,MAAM,KACNC,IAAI,SAAUC,GACb,OAAOA,EAAKC,SAEbC,OAAOC,SACM,UAAThB,GAEFS,GAF2BD,EAXf,SAAVC,IAgBgB,UAAW,QAAS,CAC7C,WACA,SACA,cAEEZ,EAAWF,EAAQ,WAAY,QAAQ,GAEvCG,EAAU,CAEZxB,UAA8C,EAApCsB,EAAaqB,QAAQ,YAC/BvC,QAA0C,EAAlCkB,EAAaqB,QAAQ,UAC7BlD,WAAgD,EAArC6B,EAAaqB,QAAQ,aAEhC9C,oBAAqBwB,EAAQ,aAAc,QAAS,CAClD,MACA,MACA,OACA,OACA,MACA,MACA,QAKFuB,MAAOvB,EAAQ,WAAY,QAAQ,GAEnCwB,gBAAiBtB,EAEjBuB,iBAAkBvB,GAGhBE,EAAWJ,EAAQ,WAAY,SAAU,iBAKlB,KAFvB7B,EAAcgC,IAGhBP,EAAI,2CAA4C,QAElDf,EAAOO,gBAAkB,SAAyBsC,EAASrB,GACzD,IACE,IAAKqB,EAAS,OAAO9B,EAAI,oBACzB,IAAI+B,GAAO,EAEPC,EAAW,WACRD,GAASD,EAAQ1C,aAAa,YACjCO,SAAST,SAAW4C,EAAQzC,aAAa,SAC3C0C,GAAO,GAGT,GAAI9C,EAAOuB,IAAavB,EAAOuB,EAAW,WAAY,CACpD,IAWMyB,EAXFjD,EAAW8C,EAAQ9C,SACnBF,EAAWgD,EAAQhD,SAGnBoD,EAAW,CACbP,MAAOG,EAAQzC,aAAa,UAAY8C,WAEtCC,EAAMN,EAAQpD,MAAQyD,UAEtBE,GAAW,EAMf,GALI9D,EAAYoD,OAASG,EAAQ1C,aAAa,WAE5B,KADZ6C,EAAWH,EAAQzC,aAAa,SAASkC,UACzBc,GAAW,IAG7BA,EACFC,EAAQL,OAER,OAAQxB,GACN,IAAK,WACH6B,EAAQtD,GAAYT,EAAYqD,gBAAkB9C,EAAW,IAC7DoD,EAASE,IAAMA,EACf,MAEF,IAAK,WACHE,EAAQ/D,EAAYsD,iBAChB7C,EAAWF,EACXA,EAASsC,MAAM,KAAKmB,MACxBL,EAASE,IAAMA,EACf,MAEF,IAAK,QACH,IACAE,GADWR,EAAQzC,aAAa,QAClB+B,MAAM,KAAK,IAAM,IAAIA,MAAM,KAAK,GAC9Cc,EAASM,MAAQF,EAMvB,IAAIG,EACFhC,EACA,IACA6B,EAAMI,QAAQ,eAAgB,KAAKA,QAAQ,aAAc,IAM3D,OAJAzD,EAAOuB,GAAUiC,EAAOP,EAAUF,GAElChC,EAAI,aAAeyC,GAEH,UAAThC,EACHuB,IACA/C,EAAO0D,WAAWX,EAAU,KAGhC,OADAhC,EAAIQ,EAAW,kBAAmB,QAC3BwB,IAET,MAAOjC,GACPC,EAAID,EAAME,QAAS,UA0EA,UAAnBC,EAAI0C,YAA6C,aAAnB1C,EAAI0C,WACpCnD,IAEAE,SAASJ,iBAAiB,mBAAoB,SAAU+C,GACtB,aAA5BA,EAAMO,OAAOD,YAA2BnD"} \ No newline at end of file diff --git a/dist/v12/custom/light.js b/dist/v12/custom/light.js new file mode 100644 index 00000000..6c32467b --- /dev/null +++ b/dist/v12/custom/light.js @@ -0,0 +1,4 @@ +/* Simple Analytics - Privacy friendly analytics (docs.simpleanalytics.com/script; 2024-03-07; 399f; SRI-version; v12) */ + +!function(s,e,t,u){try{var i=undefined,n="https:",r=s.console,a="doNotTrack",p=s.navigator,c=s.location,d=c.host,o=s.document,l=p.userAgent,m="Not sending request ",f=!1,g=encodeURIComponent,h=decodeURIComponent,v=JSON.stringify,y=s.addEventListener,_="https://"+t,w=(o.documentElement,"language"),b=p.userAgentData,O="platform",S="platformVersion",k="https://docs.simpleanalytics.com",j=/(bot|spider|crawl)/i.test(l)&&!/(cubot)/i.test(l),E=o.currentScript||o.querySelector('script[src*="'+t+'"]');u=function(){var e=[].slice.call(arguments);return e.unshift("Simple Analytics:"),Function.prototype.apply.call(r.warn,r,e)};var x=function(e,t){return e&&e.getAttribute("data-"+t)},A=function(){for(var e,t,n,r={},a=arguments,o=0;o>e/4).toString(16)})}catch(r){return e.replace(n,function(e){var t=16*Math.random()|0;return(e<2?t:3&t|8).toString(16)})}},N="namespace",R=e[N]||x(E,N)||"sa",U=e.strictUtm||"true"==x(E,"strict-utm"),V=R+"_loaded";if(1==s[V])return u(m+"twice");s.sa_event_loaded=!0,s[V]=!0;var B,C=function(t,e,n){t=n?t:A(z,L,t),p.brave&&!n&&(t.brave=!0),p._duckduckgoloader_&&!n&&(t.duck=!0),(new Image).src=_+"/simple.gif?"+Object.keys(t).filter(function(e){return t[e]!=i}).map(function(e){return g(e)+"="+g(t[e])}).join("&")+"&time="+Date.now()},H=function(e){if(e)return e.replace(/^(https?:\/\/)?((m|l|w{2,3}([0-9]+)?)\.)?([^?#]+)(.*)$/,"$5")},T=H(e.hostname||x(E,"hostname")),$=H(T||d),F={version:"custom_light_12",hostname:$};e.mode||x(E,"mode");try{B=Intl.DateTimeFormat().resolvedOptions().timeZone}catch(W){u(W)}j&&(F.bot=!0);var z=A(F,{ua:l,https:c.protocol==n,timezone:B,page_id:I(),session_id:I()});if(z.sri=!0,b&&(z.mobile=b.mobile,z.brands=v(b.brands)),$!==d&&(z.hostname_original=d),a in p&&"1"==p[a])return u("Not sending request when "+a+" is enabled. See "+k+"/dnt");-1!=d.indexOf(".")&&!/^[0-9.:]+$/.test(d)||T||u("Set hostname on "+d+". See "+k+"/overwrite-domain-name");var J,L={},M=H((o.referrer||"").replace(d,$)),P=function(e,t){var n=A(F,{type:"append",original_id:t?e:z.page_id});t||!p.sendBeacon?C(n,0,!0):p.sendBeacon(_+"/append",v(n))};y("pagehide",P,!1);var Z,G,K=function(e){var t="";try{t=e||h(c.pathname)}catch(W){u(W)}return t},Q=function(e,t,n,r){e&&P(""+z.page_id,!0),z.page_id=I();var a,o=$+K();C({id:z.page_id,type:"pageview",referrer:!t||n?M:null,query:(a=t,c.search.slice(1).split("&").filter(function(e){return!a&&new RegExp("^((utm_)"+(U?"":"?")+"(source|medium|content|term|campaign)"+(U?"":"|ref")+")=").test(e)}).join("&")||i)}),M=o,0};!function(e,t){var n=K(t);if(n&&J!=n){J=n,L.path=n,p[w]&&(L[w]=p[w]);var r,a=s.performance,o="navigation";try{r=a.getEntriesByType(o)[0].type}catch(W){u(W)}G=r?-1<["reload","back_forward"].indexOf(r):a&&a[o]&&-1<[1,2].indexOf(a[o].type),Z=!!M&&M.split("/")[0]==d;var i=function(){f=!0,Q(e,e||G||!1,Z)};if(f)i();else try{b&&"function"==typeof b.getHighEntropyValues?b.getHighEntropyValues([O,S]).then(function(e){z.os_name=e[O],z.os_version=e[S],i()})["catch"](i):i()}catch(c){i()}}}()}catch(X){u(X)}}(window,{},""); +//# sourceMappingURL=light.js.map \ No newline at end of file diff --git a/dist/v12/custom/light.js.map b/dist/v12/custom/light.js.map new file mode 100644 index 00000000..5140a8ac --- /dev/null +++ b/dist/v12/custom/light.js.map @@ -0,0 +1 @@ +{"version":3,"file":"light.source.js","sources":["light.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n\n var collectMetricByString = function (metricAbbreviation) {\n return true;\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var getQueryParams = function (ignoreSource) {\n return (\n loc.search\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n if (ignore) return falseVar;\n var regex =\n \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \")=\";\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex).test(keyValue);\n })\n .join(\"&\") || undefinedVar\n );\n };\n\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n var cleanSubdomain = function (url) {\n if (!url) return;\n return url.replace(\n /^(https?:\\/\\/)?((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/,\n \"$5\"\n );\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname = cleanSubdomain(\n overwriteOptions.hostname || attr(scriptElement, \"hostname\")\n );\n\n var definedHostname = cleanSubdomain(\n overwrittenHostname || locationHostname\n );\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n\n\n\n\n\n\n\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var bot = isBotAgent;\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = trueVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n return cleanSubdomain(\n (doc.referrer || \"\").replace(locationHostname, definedHostname)\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n nav.sendBeacon(fullApiUrl + \"/append\", stringify(append));\n }\n };\n\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n\n\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n metadata\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n\n sendData({\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: getQueryParams(deleteSourceInfo),\n\n });\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (isPushState, pathOverwrite, metadata) {\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n sameSite = referrer\n ? referrer.split(slash)[0] == locationHostname\n : falseVar;\n\n\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n sendPageView(\n isPushState,\n isPushState || userNavigated || !collectMetricByString(\"r\"), // r = referrers\n sameSite,\n metadata\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n\n\n pageview();\n\n } catch (e) {\n warn(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_light_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","warn","undefinedVar","undefined","https","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","language","documentElement","uaData","userAgentData","platformText","platformVersionText","docsUrl","isBotAgent","test","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","attr","attribute","getAttribute","assign","obj","prop","object","to","arg","index","length","nextSource","constructor","Object","nextKey","hasOwnProperty","settings","sa_settings","logSettings","keys","Date","now","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","replace","c","getRandomValues","Uint8Array","toString","error","r","Math","random","namespaceText","namespace","strictUtm","loadedVariable","sa_event_loaded","timezone","sendData","data","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","Image","src","filter","key","map","join","cleanSubdomain","url","overwrittenHostname","hostname","definedHostname","basePayload","version","mode","Intl","DateTimeFormat","resolvedOptions","timeZone","bot","ua","protocol","page_id","session_id","sri","mobile","brands","hostname_original","indexOf","lastSendPath","referrer","sendOnLeave","id","push","append","type","original_id","sendBeacon","sameSite","userNavigated","getPath","overwrite","path","pathname","sendPageView","isPushState","deleteSourceInfo","metadata","ignoreSource","currentPage","query","search","split","keyValue","RegExp","pages","pathOverwrite","performaceEntryType","perf","performance","navigationText","getEntriesByType","triggerSendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","e","pageview"],"mappings":"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"} \ No newline at end of file diff --git a/dist/v12/custom/proxy.js b/dist/v12/custom/proxy.js new file mode 100644 index 00000000..6b2edecf --- /dev/null +++ b/dist/v12/custom/proxy.js @@ -0,0 +1,4 @@ +/* Simple Analytics - Privacy friendly analytics (docs.simpleanalytics.com/script; 2024-03-07; 871f; SRI-version; v12) */ + +!function(l,t,e,n,p){try{var f=undefined,h=!0,d=!1,r="true",a="https:",m="pageview",u="event",i="error",o=l.console,c="doNotTrack",g=l.navigator,s=l.location,v=s.host,y=l.document,_=g.userAgent,w="Not sending request ",b=w+"when ",x=d,E=encodeURIComponent,O=decodeURIComponent,S=JSON.stringify,M=l.addEventListener,k="https://"+e,A=y.documentElement||{},q="language",j="Height",D="scroll",$=g.userAgentData,C=D+j,H="offset"+j,P="client"+j,R="pagehide",T="platform",U="platformVersion",I="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(_)&&!/(cubot)/i.test(_),N=l.screen,z=y.currentScript||y.querySelector('script[src*="'+e+'"]');p=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){p("Error in your "+t+" function:",e)},W=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},G=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},J=function(t,e){return t&&t.getAttribute("data-"+e)},L=function(t){return Array.isArray(t)?t:"string"==typeof t&&t.length?t.split(/, ?/):[]},Y=function(t){return t&&t.constructor===Object},Z=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},rt=function(t){return"function"==typeof t},at="namespace",it=t[at]||J(z,at)||"sa",ot=l[it+"_metadata"],ct=function(t,e){Y(ot)&&(t=Z(t,ot));var n=l[kt];if(!rt(n))return t;try{return Z(t,n.call(l,Z(t,e)))}catch(r){F("metadata",r)}},st=t.strictUtm||J(z,"strict-utm")==r,ut=function(a){return s.search.slice(1).split("&").filter(function(t){var e=a||!tt("ut"),n=Ot.map(G).join("|"),r=e?"^("+n+")=":"^((utm_)"+(st?"":"?")+"(source|medium|content|term|campaign)"+(st?"":"|ref")+"|"+n+")=";return e&&!Ot.length?d:new RegExp(r).test(t)}).join("&")||f},lt=it+"_loaded";if(l[lt]==h)return p(w+"twice");l.sa_event_loaded=h,l[lt]=h;var pt=function(e,t,n){e=n?e:Z(Dt,Ht,e),g.brave&&!n&&(e.brave=h),g._duckduckgoloader_&&!n&&(e.duck=h);var r=new Image;t&&(r.onerror=t,r.onload=t),r.src=k+"/simple.gif?"+Object.keys(e).filter(function(t){return e[t]!=f}).map(function(t){return E(t)+"="+E(e[t])}).join("&")+"&time="+Date.now()},ft=function(t){if(t)return t.replace(/^(https?:\/\/)?((m|l|w{2,3}([0-9]+)?)\.)?([^?#]+)(.*)$/,"$5")},ht=ft(t.hostname||J(z,"hostname")),dt=ft(ht||v),mt={version:"custom_proxy_12",hostname:dt};n=function(t){t=t.stack?t+" "+t.stack:t,p(t),pt(Z(mt,{type:i,error:t,path:s.pathname}),f,h)},M(i,function(t){t.filename&&-1"); +//# sourceMappingURL=proxy.js.map \ No newline at end of file diff --git a/dist/v12/custom/proxy.js.map b/dist/v12/custom/proxy.js.map new file mode 100644 index 00000000..58bf1b76 --- /dev/null +++ b/dist/v12/custom/proxy.js.map @@ -0,0 +1 @@ +{"version":3,"file":"proxy.source.js","sources":["proxy.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var metadataObject = window[namespace + \"_metadata\"];\n var appendMetadata = function (metadata, data) {\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) return metadata;\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var getQueryParams = function (ignoreSource) {\n return (\n loc.search\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex).test(keyValue);\n })\n .join(\"&\") || undefinedVar\n );\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n var cleanSubdomain = function (url) {\n if (!url) return;\n return url.replace(\n /^(https?:\\/\\/)?((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/,\n \"$5\"\n );\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname = cleanSubdomain(\n overwriteOptions.hostname || attr(scriptElement, \"hostname\")\n );\n\n var definedHostname = cleanSubdomain(\n overwrittenHostname || locationHostname\n );\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = trueVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n return cleanSubdomain(\n (doc.referrer || \"\").replace(locationHostname, definedHostname)\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n nav.sendBeacon(fullApiUrl + \"/append\", stringify(append));\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n metadata\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n\n sendData({\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: getQueryParams(deleteSourceInfo),\n\n metadata: stringify(metadata),\n });\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (isPushState, pathOverwrite, metadata) {\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n sendPageView(\n isPushState,\n isPushState || userNavigated || !collectMetricByString(\"r\"), // r = referrers\n sameSite,\n metadata\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata) {\n pageview(0, path, metadata);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_proxy_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","metadataObject","appendMetadata","metadata","data","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","search","keyValue","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","cleanSubdomain","url","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","indexOf","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","protocol","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","i","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","e","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","callbackRaw","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue","q"],"mappings":"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"} \ No newline at end of file diff --git a/dist/v12/light.js b/dist/v12/light.js new file mode 100644 index 00000000..0a19a5fa --- /dev/null +++ b/dist/v12/light.js @@ -0,0 +1,4 @@ +/* Simple Analytics - Privacy friendly analytics (docs.simpleanalytics.com/script; 2024-03-07; 5782; SRI-version; v12) */ + +!function(s,e,t,u){try{var i=undefined,n="https:",r=s.console,a="doNotTrack",p=s.navigator,c=s.location,d=c.host,o=s.document,l=p.userAgent,m="Not sending request ",f=!1,g=encodeURIComponent,h=decodeURIComponent,v=JSON.stringify,y=s.addEventListener,_="https://queue."+t,w=(o.documentElement,"language"),b=p.userAgentData,O="platform",S="platformVersion",k="https://docs.simpleanalytics.com",j=/(bot|spider|crawl)/i.test(l)&&!/(cubot)/i.test(l),E=o.currentScript||o.querySelector('script[src*="'+t+'"]');u=function(){var e=[].slice.call(arguments);return e.unshift("Simple Analytics:"),Function.prototype.apply.call(r.warn,r,e)};var q=function(e,t){return e&&e.getAttribute("data-"+t)},A=function(){for(var e,t,n,r={},a=arguments,o=0;o>e/4).toString(16)})}catch(r){return e.replace(n,function(e){var t=16*Math.random()|0;return(e<2?t:3&t|8).toString(16)})}},N="namespace",R=e[N]||q(E,N)||"sa",U=e.strictUtm||"true"==q(E,"strict-utm"),V=R+"_loaded";if(1==s[V])return u(m+"twice");s.sa_event_loaded=!0,s[V]=!0;var B,C=function(t,e,n){t=n?t:A(z,L,t),p.brave&&!n&&(t.brave=!0),p._duckduckgoloader_&&!n&&(t.duck=!0),(new Image).src=_+"/simple.gif?"+Object.keys(t).filter(function(e){return t[e]!=i}).map(function(e){return g(e)+"="+g(t[e])}).join("&")+"&time="+Date.now()},T=function(e){if(e)return e.replace(/^(https?:\/\/)?((m|l|w{2,3}([0-9]+)?)\.)?([^?#]+)(.*)$/,"$5")},$=T(e.hostname||q(E,"hostname")),F=T($||d),H={version:"cdn_light_12",hostname:F};e.mode||q(E,"mode");try{B=Intl.DateTimeFormat().resolvedOptions().timeZone}catch(W){u(W)}j&&(H.bot=!0);var z=A(H,{ua:l,https:c.protocol==n,timezone:B,page_id:I(),session_id:I()});if(z.sri=!0,b&&(z.mobile=b.mobile,z.brands=v(b.brands)),F!==d&&(z.hostname_original=d),a in p&&"1"==p[a])return u("Not sending request when "+a+" is enabled. See "+k+"/dnt");-1!=d.indexOf(".")&&!/^[0-9.:]+$/.test(d)||$||u("Set hostname on "+d+". See "+k+"/overwrite-domain-name");var J,L={},M=T((o.referrer||"").replace(d,F)),P=function(e,t){var n=A(H,{type:"append",original_id:t?e:z.page_id});t||!p.sendBeacon?C(n,0,!0):p.sendBeacon(_+"/append",v(n))};y("pagehide",P,!1);var Z,G,K=function(e){var t="";try{t=e||h(c.pathname)}catch(W){u(W)}return t},Q=function(e,t,n,r){e&&P(""+z.page_id,!0),z.page_id=I();var a,o=F+K();C({id:z.page_id,type:"pageview",referrer:!t||n?M:null,query:(a=t,c.search.slice(1).split("&").filter(function(e){return!a&&new RegExp("^((utm_)"+(U?"":"?")+"(source|medium|content|term|campaign)"+(U?"":"|ref")+")=").test(e)}).join("&")||i)}),M=o,0};!function(e,t){var n=K(t);if(n&&J!=n){J=n,L.path=n,p[w]&&(L[w]=p[w]);var r,a=s.performance,o="navigation";try{r=a.getEntriesByType(o)[0].type}catch(W){u(W)}G=r?-1<["reload","back_forward"].indexOf(r):a&&a[o]&&-1<[1,2].indexOf(a[o].type),Z=!!M&&M.split("/")[0]==d;var i=function(){f=!0,Q(e,e||G||!1,Z)};if(f)i();else try{b&&"function"==typeof b.getHighEntropyValues?b.getHighEntropyValues([O,S]).then(function(e){z.os_name=e[O],z.os_version=e[S],i()})["catch"](i):i()}catch(c){i()}}}()}catch(X){u(X)}}(window,{},"simpleanalyticscdn.com"); +//# sourceMappingURL=light.js.map \ No newline at end of file diff --git a/dist/v12/light.js.map b/dist/v12/light.js.map new file mode 100644 index 00000000..481c03c5 --- /dev/null +++ b/dist/v12/light.js.map @@ -0,0 +1 @@ +{"version":3,"file":"light.source.js","sources":["light.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n\n var collectMetricByString = function (metricAbbreviation) {\n return true;\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var getQueryParams = function (ignoreSource) {\n return (\n loc.search\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n if (ignore) return falseVar;\n var regex =\n \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \")=\";\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex).test(keyValue);\n })\n .join(\"&\") || undefinedVar\n );\n };\n\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n var cleanSubdomain = function (url) {\n if (!url) return;\n return url.replace(\n /^(https?:\\/\\/)?((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/,\n \"$5\"\n );\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname = cleanSubdomain(\n overwriteOptions.hostname || attr(scriptElement, \"hostname\")\n );\n\n var definedHostname = cleanSubdomain(\n overwrittenHostname || locationHostname\n );\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n\n\n\n\n\n\n\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var bot = isBotAgent;\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = trueVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n return cleanSubdomain(\n (doc.referrer || \"\").replace(locationHostname, definedHostname)\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n nav.sendBeacon(fullApiUrl + \"/append\", stringify(append));\n }\n };\n\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n\n\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n metadata\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n\n sendData({\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: getQueryParams(deleteSourceInfo),\n\n });\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (isPushState, pathOverwrite, metadata) {\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n sameSite = referrer\n ? referrer.split(slash)[0] == locationHostname\n : falseVar;\n\n\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n sendPageView(\n isPushState,\n isPushState || userNavigated || !collectMetricByString(\"r\"), // r = referrers\n sameSite,\n metadata\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n\n\n pageview();\n\n } catch (e) {\n warn(e);\n }\n})(\n window,\n {},\n \"simpleanalyticscdn.com\",\n \"queue.\",\n \"cdn_light_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","warn","undefinedVar","undefined","https","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","protocol","language","documentElement","uaData","userAgentData","platformText","platformVersionText","docsUrl","isBotAgent","test","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","attr","attribute","getAttribute","assign","obj","prop","object","to","arg","index","length","nextSource","constructor","Object","nextKey","hasOwnProperty","settings","sa_settings","logSettings","keys","Date","now","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","replace","c","getRandomValues","Uint8Array","toString","error","r","Math","random","namespaceText","namespace","strictUtm","loadedVariable","sa_event_loaded","timezone","sendData","data","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","Image","src","filter","key","map","join","cleanSubdomain","url","overwrittenHostname","hostname","definedHostname","basePayload","version","mode","Intl","DateTimeFormat","resolvedOptions","timeZone","bot","ua","page_id","session_id","sri","mobile","brands","hostname_original","indexOf","lastSendPath","referrer","sendOnLeave","id","push","append","type","original_id","sendBeacon","sameSite","userNavigated","getPath","overwrite","path","pathname","sendPageView","isPushState","deleteSourceInfo","metadata","ignoreSource","currentPage","query","search","split","keyValue","RegExp","pages","pathOverwrite","performaceEntryType","perf","performance","navigationText","getEntriesByType","triggerSendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","e","pageview"],"mappings":"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"} \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 7748693a..e168bb33 100644 --- a/package-lock.json +++ b/package-lock.json @@ -17,6 +17,7 @@ "handlebars": "^4.7.6", "mocha": "^6.2.3", "nodemon": "^1.19.4", + "prettier": "3.2.5", "request": "^2.88.0", "selenium-webdriver": "^4.3.1", "uglify-js": "^3.9.4", @@ -3508,6 +3509,21 @@ "node": ">=0.10.0" } }, + "node_modules/prettier": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.2.5.tgz", + "integrity": "sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==", + "dev": true, + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, "node_modules/process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", @@ -7889,6 +7905,12 @@ "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=", "dev": true }, + "prettier": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.2.5.tgz", + "integrity": "sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==", + "dev": true + }, "process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", diff --git a/package.json b/package.json index e8fe1bba..0a4fb70e 100644 --- a/package.json +++ b/package.json @@ -9,7 +9,8 @@ "build": "node compile.js", "pretest": "npm run build -- testing", "test": "node -r dotenv/config ./test/index.js", - "posttest": "npm run build" + "posttest": "npm run build", + "prettier": "prettier --write ." }, "repository": { "type": "git", @@ -31,6 +32,7 @@ "handlebars": "^4.7.6", "mocha": "^6.2.3", "nodemon": "^1.19.4", + "prettier": "3.2.5", "request": "^2.88.0", "selenium-webdriver": "^4.3.1", "uglify-js": "^3.9.4", diff --git a/playground/callback.html b/playground/callback.html index 70e1c10b..523f214b 100644 --- a/playground/callback.html +++ b/playground/callback.html @@ -181,9 +181,8 @@

Automated events

return param; }) .join(" "); - document.querySelector( - "textarea", - ).value += `${type.toUpperCase()}: ${line}\n`; + document.querySelector("textarea").value += + `${type.toUpperCase()}: ${line}\n`; } console.log = function () { diff --git a/playground/events.html b/playground/events.html index dede8af2..6e6336a3 100644 --- a/playground/events.html +++ b/playground/events.html @@ -208,9 +208,8 @@

Automated events

return param; }) .join(" "); - document.querySelector( - "textarea", - ).value += `${type.toUpperCase()}: ${line}\n`; + document.querySelector("textarea").value += + `${type.toUpperCase()}: ${line}\n`; } console.log = function () { diff --git a/src/auto-events.js b/src/auto-events.js index 745d1e8d..29fdd9ef 100644 --- a/src/auto-events.js +++ b/src/auto-events.js @@ -186,8 +186,8 @@ link.setAttribute("onclick", onClickAttribute); } else { - link.addEventListener("click", function (element) { - saAutomatedLink(element.target, collect); + link.addEventListener("click", function () { + saAutomatedLink(link, collect); }); } } diff --git a/src/default.js b/src/default.js index 16202783..e5355d0b 100644 --- a/src/default.js +++ b/src/default.js @@ -117,8 +117,8 @@ return Array.isArray(csv) ? csv : isString(csv) && csv.length - ? csv.split(/, ?/) - : []; + ? csv.split(/, ?/) + : []; }; var isObject = function (object) { @@ -345,10 +345,22 @@ Date.now(); }; + var cleanSubdomain = function (url) { + if (!url) return; + return url.replace( + /^(https?:\/\/)?((m|l|w{2,3}([0-9]+)?)\.)?([^?#]+)(.*)$/, + "$5", + ); + }; + // Customers can overwrite their hostname, here we check for that - var overwrittenHostname = - overwriteOptions.hostname || attr(scriptElement, "hostname"); - var definedHostname = overwrittenHostname || locationHostname; + var overwrittenHostname = cleanSubdomain( + overwriteOptions.hostname || attr(scriptElement, "hostname"), + ); + + var definedHostname = cleanSubdomain( + overwrittenHostname || locationHostname, + ); var basePayload = { version: version, @@ -585,11 +597,8 @@ var lastSendPath; var getReferrer = function () { - return ( - (doc.referrer || "") - .replace(locationHostname, definedHostname) - .replace(/^https?:\/\/((m|l|w{2,3}([0-9]+)?)\.)?([^?#]+)(.*)$/, "$4") - .replace(/^([^/]+)$/, "$1") || undefinedVar + return cleanSubdomain( + (doc.referrer || "").replace(locationHostname, definedHostname), ); }; @@ -839,7 +848,7 @@ /** if uniques **/ // We set unique variable based on pushstate or back navigation, if no match we check the referrer page.unique = - /__cf_/i.test(getReferrer()) || isPushState || userNavigated + /__cf_/.test(getReferrer()) || isPushState || userNavigated ? falseVar : !sameSite; /** endif **/ From dc1a3eff7742f2da730bc3c669507711f2d595ff Mon Sep 17 00:00:00 2001 From: Adriaan van Rossum <1079135+adriaanvanrossum@users.noreply.github.com> Date: Thu, 13 Feb 2025 19:01:55 +0100 Subject: [PATCH 10/62] Add acron and remove trailing comma --- .prettierrc.json | 4 +++- compile.js | 48 ++++++++++++++++++++++++++++--------- package-lock.json | 33 +++++++++++++++++++++----- package.json | 3 ++- src/default.js | 60 +++++++++++++++++++++++------------------------ 5 files changed, 99 insertions(+), 49 deletions(-) diff --git a/.prettierrc.json b/.prettierrc.json index 0967ef42..757fd64c 100644 --- a/.prettierrc.json +++ b/.prettierrc.json @@ -1 +1,3 @@ -{} +{ + "trailingComma": "es5" +} diff --git a/compile.js b/compile.js index f57a9550..1a8f2caf 100644 --- a/compile.js +++ b/compile.js @@ -3,6 +3,7 @@ const UglifyJS = require("uglify-js"); const fs = require("fs"); const esprima = require("esprima"); const path = require("path"); +const acorn = require("acorn"); const GREEN = "\x1b[32m%s\x1b[0m"; const YELLOW = "\x1b[33m%s\x1b[0m"; @@ -30,21 +31,21 @@ const fillTemplate = (template, { overwriteOptions = null } = {}) => { return template .replace( /\{\{\s?nginxHost\s?\}\}/gi, - '', + '' ) .replace( /\{\{\s?nginxProxyHost\s?\}\}/gi, - '', + '' ) .replace( /\\?"\{\{\s?overwriteOptions\s?\}\}\\?"/gi, overwriteOptions ? JSON.stringify(overwriteOptions).replace(/:"([^"]+)"/gi, ":$1") - : "{}", + : "{}" ) .replace( /"\{\{\s?cloudFlareCustomDomain\s?\}\}"/gi, - 'INSTALL_OPTIONS.custom_domain || "queue.simpleanalyticscdn.com"', + 'INSTALL_OPTIONS.custom_domain || "queue.simpleanalyticscdn.com"' ); }; @@ -284,7 +285,7 @@ const files = templates.reduce((list, template) => { if (template.variables.sri) { list.push( { ...template, variables: { ...template.variables, sri: true } }, - { ...template, variables: { ...template.variables, sri: false } }, + { ...template, variables: { ...template.variables, sri: false } } ); } else { list.push(template); @@ -320,7 +321,7 @@ for (const file of files) { .digest("hex") .slice(0, 4); - const prepend = `/* Simple Analytics - Privacy friendly analytics (docs.simpleanalytics.com/script; ${date}; ${hash}${ + const prepend = `/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; ${date}; ${hash}${ variables.sri ? `; SRI-version` : "" }${variables.version ? `; v${variables.version}` : ""}) */\n`; @@ -346,7 +347,7 @@ for (const file of files) { filename: originalFileName, url: `${finalFileName}.map`, }, - }, + } ) : { code: prepend + rawCode, @@ -358,6 +359,31 @@ for (const file of files) { for (const warning of warnings || []) console.warn(YELLOW, `[${name}] ${warning}`); + try { + acorn.parse(rawCode, { ecmaVersion: 5 }); + } catch (error) { + // console.log("acorn", error); + + // error object: + // pos: 147, + // loc: Position { line: 12, column: 0 }, + // raisedAt: 148 + + // Find part of the code that is causing the error + const lines = rawCode.split("\n"); + const line = error.loc.line; + const column = error.loc.column; + const start = Math.max(0, line - 3); + const end = Math.min(lines.length, line + 3); + const codeSnippet = lines.slice(start, end).join("\n"); + const sentence = lines[error.loc.line - 1]; + + // console.log({ codeSnippet, line: lines[error.loc.line - 1] }); + + throw new Error( + `${error.message} at line ${sentence} position ${column}: ${codeSnippet}` + ); + } const code = fillTemplate(codeTemplate, variables); const validate = template({ @@ -374,7 +400,7 @@ for (const file of files) { RED, `[${name}][ERROR] ${input .split("/") - .pop()} ${description} at line ${lineNumber} position ${index}`, + .pop()} ${description} at line ${lineNumber} position ${index}` ); continue; } @@ -402,7 +428,7 @@ for (const file of files) { let write = code.replace( /sourceMappingURL=latest\.js\.map/gi, - `sourceMappingURL=${cdnFileName}.map`, + `sourceMappingURL=${cdnFileName}.map` ); fs.writeFileSync(versionFile, write); @@ -410,7 +436,7 @@ for (const file of files) { if (compiledMap) { let writeCompiled = compiledMap.replace( /latest\.source\.js/gi, - cdnFileName, + cdnFileName ); fs.writeFileSync(`${versionFile}.map`, writeCompiled); @@ -438,7 +464,7 @@ for (const file of files) { console.log( ` ${name.toLowerCase()} ${fill1}Compiled ${sourceName} ${fill2} ${bytesZeroFilled} bytes ${ variables.sri ? " (SRI)" : "" - }`, + }` ); } diff --git a/package-lock.json b/package-lock.json index e168bb33..537811ca 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,6 +9,7 @@ "version": "9.0.0", "license": "ISC", "devDependencies": { + "acorn": "^8.11.3", "browserstack-local": "^1.5.1", "chai": "^4.2.0", "dotenv": "^8.2.0", @@ -51,9 +52,9 @@ "dev": true }, "node_modules/acorn": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.1.1.tgz", - "integrity": "sha512-add7dgA5ppRPxCFJoAGfMDi7PIBXq1RtGo7BhbLaxwrXPOmw8gq48Y9ozT01hUKy9byMjlR20EJhu5zlkErEkg==", + "version": "8.11.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", + "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", "dev": true, "bin": { "acorn": "bin/acorn" @@ -1303,6 +1304,18 @@ "node": ">=6.0.0" } }, + "node_modules/espree/node_modules/acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/esprima": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", @@ -5117,9 +5130,9 @@ "dev": true }, "acorn": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.1.1.tgz", - "integrity": "sha512-add7dgA5ppRPxCFJoAGfMDi7PIBXq1RtGo7BhbLaxwrXPOmw8gq48Y9ozT01hUKy9byMjlR20EJhu5zlkErEkg==", + "version": "8.11.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", + "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", "dev": true }, "acorn-jsx": { @@ -6140,6 +6153,14 @@ "acorn": "^7.1.0", "acorn-jsx": "^5.1.0", "eslint-visitor-keys": "^1.1.0" + }, + "dependencies": { + "acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true + } } }, "esprima": { diff --git a/package.json b/package.json index 0a4fb70e..e9f75eee 100644 --- a/package.json +++ b/package.json @@ -10,7 +10,7 @@ "pretest": "npm run build -- testing", "test": "node -r dotenv/config ./test/index.js", "posttest": "npm run build", - "prettier": "prettier --write ." + "prettier": "prettier --check ." }, "repository": { "type": "git", @@ -24,6 +24,7 @@ }, "homepage": "https://github.com/simpleanalytics/scripts#readme", "devDependencies": { + "acorn": "^8.11.3", "browserstack-local": "^1.5.1", "chai": "^4.2.0", "dotenv": "^8.2.0", diff --git a/src/default.js b/src/default.js index e5355d0b..5f7576c2 100644 --- a/src/default.js +++ b/src/default.js @@ -8,7 +8,7 @@ version, defaultNamespace, sendError, - warn, + warn ) { try { ///////////////////// @@ -152,7 +152,7 @@ /** if ignoremetrics **/ // Customers can skip data points var ignoreMetrics = convertCommaSeparatedToArray( - overwriteOptions.ignoreMetrics || attr(scriptElement, "ignore-metrics"), + overwriteOptions.ignoreMetrics || attr(scriptElement, "ignore-metrics") ); /** endif **/ @@ -213,7 +213,7 @@ try { return assign( metadata, - metadataCollectorFunction.call(window, assign(metadata, data)), + metadataCollectorFunction.call(window, assign(metadata, data)) ); } catch (error) { warnInFunction("metadata", error); @@ -284,7 +284,7 @@ ignorePage === path || new RegExp( "^" + filterRegex(ignorePage).replace(/\\\*/gi, "(.*)") + "$", - "i", + "i" ).test(path) ) return trueVar; @@ -349,17 +349,17 @@ if (!url) return; return url.replace( /^(https?:\/\/)?((m|l|w{2,3}([0-9]+)?)\.)?([^?#]+)(.*)$/, - "$5", + "$5" ); }; // Customers can overwrite their hostname, here we check for that var overwrittenHostname = cleanSubdomain( - overwriteOptions.hostname || attr(scriptElement, "hostname"), + overwriteOptions.hostname || attr(scriptElement, "hostname") ); var definedHostname = cleanSubdomain( - overwrittenHostname || locationHostname, + overwrittenHostname || locationHostname ); var basePayload = { @@ -386,7 +386,7 @@ path: loc.pathname, }), undefinedVar, - trueVar, + trueVar ); }; @@ -399,7 +399,7 @@ sendError(event.message); } }, - falseVar, + falseVar ); /** endif **/ @@ -450,14 +450,14 @@ /** if ignorepages **/ // Customers can ignore certain pages var ignorePages = convertCommaSeparatedToArray( - overwriteOptions.ignorePages || attr(scriptElement, "ignore-pages"), + overwriteOptions.ignorePages || attr(scriptElement, "ignore-pages") ); /** endif **/ /** if allowparams **/ // Customers can allow params var allowParams = convertCommaSeparatedToArray( - overwriteOptions.allowParams || attr(scriptElement, "allow-params"), + overwriteOptions.allowParams || attr(scriptElement, "allow-params") ); /** endif **/ @@ -465,7 +465,7 @@ // Customers can allow params var nonUniqueHostnames = convertCommaSeparatedToArray( overwriteOptions.nonUniqueHostnames || - attr(scriptElement, "non-unique-hostnames"), + attr(scriptElement, "non-unique-hostnames") ); /** endif **/ @@ -566,12 +566,12 @@ /** if ignorednt **/ if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == "1") return warn( - notSendingWhen + doNotTrack + " is enabled. See " + docsUrl + "/dnt", + notSendingWhen + doNotTrack + " is enabled. See " + docsUrl + "/dnt" ); /** else **/ if (doNotTrack in nav && nav[doNotTrack] == "1") return warn( - notSendingWhen + doNotTrack + " is enabled. See " + docsUrl + "/dnt", + notSendingWhen + doNotTrack + " is enabled. See " + docsUrl + "/dnt" ); /** endif **/ @@ -586,7 +586,7 @@ locationHostname + ". See " + docsUrl + - "/overwrite-domain-name", + "/overwrite-domain-name" ); ///////////////////// @@ -598,7 +598,7 @@ var getReferrer = function () { return cleanSubdomain( - (doc.referrer || "").replace(locationHostname, definedHostname), + (doc.referrer || "").replace(locationHostname, definedHostname) ); }; @@ -654,7 +654,7 @@ hiddenStart = now(); } else msHidden += now() - hiddenStart; }, - falseVar, + falseVar ); /** endif **/ @@ -670,15 +670,15 @@ body[offsetHeight] || 0, documentElement[clientHeight] || 0, documentElement[scrollHeight] || 0, - documentElement[offsetHeight] || 0, + documentElement[offsetHeight] || 0 ); return Math.min( 100, Math.round( (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) / height / - 5, - ) * 5, + 5 + ) * 5 ); } catch (error) { warn(error); @@ -693,7 +693,7 @@ function () { if (scrolled < position()) scrolled = position(); }, - falseVar, + falseVar ); }); /** endif **/ @@ -747,7 +747,7 @@ isPushState, deleteSourceInfo, sameSite, - metadata, + metadata ) { if (isPushState) sendOnLeave("" + payload.page_id, trueVar); if (collectDataOnLeave) payload.page_id = uuid(); @@ -792,7 +792,7 @@ page.viewport_height = Math.max( documentElement[clientHeight] || 0, - window.innerHeight || 0, + window.innerHeight || 0 ) || null; } /** endif **/ @@ -866,7 +866,7 @@ isPushState, isPushState || userNavigated || !collectMetricByString("r"), // r = referrers sameSite, - metadata, + metadata ); }; @@ -933,7 +933,7 @@ function () { pageview(1); }, - falseVar, + falseVar ); addEventListenerFunc( @@ -941,7 +941,7 @@ function () { pageview(1); }, - falseVar, + falseVar ); } /** endif **/ @@ -954,7 +954,7 @@ function () { pageview(1); }, - falseVar, + falseVar ); } /** endif **/ @@ -1001,7 +1001,7 @@ if (validTypes.indexOf(typeof eventOutput) < 0) { warnInFunction( eventFunctionName, - event + " returns no string: " + eventOutput, + event + " returns no string: " + eventOutput ); return callback(); } @@ -1035,7 +1035,7 @@ metadata: stringify(metadata), /** endif **/ }), - callback, + callback ); } }; @@ -1078,5 +1078,5 @@ "{{baseUrl}}", "{{apiUrlPrefix}}", "{{scriptName}}", - "{{namespace}}", + "{{namespace}}" ); From 6e7ce192ca1a1f2b83857490ef0212ed77ec98f2 Mon Sep 17 00:00:00 2001 From: adriaandotcom Date: Thu, 13 Feb 2025 18:02:23 +0000 Subject: [PATCH 11/62] Run prettier via GitHub Action --- playground/callback.html | 2 +- playground/events.html | 4 ++-- src/auto-events.js | 2 +- test/helpers/get-browsers.js | 32 ++++++++++++++++---------------- test/helpers/index.js | 4 ++-- test/helpers/server.js | 2 +- test/index.js | 14 +++++++------- test/test-beacon.js | 18 +++++++++--------- test/test-events.js | 24 ++++++++++++------------ test/test-no-pushstate.js | 12 ++++++------ test/test-one-beacon.js | 16 ++++++++-------- test/test-pushstate.js | 16 ++++++++-------- 12 files changed, 73 insertions(+), 73 deletions(-) diff --git a/playground/callback.html b/playground/callback.html index 523f214b..9f1bdfdb 100644 --- a/playground/callback.html +++ b/playground/callback.html @@ -254,7 +254,7 @@

Automated events

}); const callbackMetadataLink = document.querySelector( - "[data-metadata-callback]", + "[data-metadata-callback]" ); callbackMetadataLink.addEventListener("click", (event) => { event.preventDefault(); diff --git a/playground/events.html b/playground/events.html index 6e6336a3..2e8fe67c 100644 --- a/playground/events.html +++ b/playground/events.html @@ -33,9 +33,9 @@ }, () => { console.info( - "Simple Analytics auto events: collected before_script_load", + "Simple Analytics auto events: collected before_script_load" ); - }, + } ); diff --git a/src/auto-events.js b/src/auto-events.js index 29fdd9ef..af554a91 100644 --- a/src/auto-events.js +++ b/src/auto-events.js @@ -155,7 +155,7 @@ /^https?:\/\//i.test(link.href) && new RegExp( "\\.(" + (optionsLink.downloadsExtensions || []).join("|") + ")$", - "i", + "i" ).test(link.pathname) ) { collect = "download"; diff --git a/test/helpers/get-browsers.js b/test/helpers/get-browsers.js index 2cc449f7..fba8d423 100644 --- a/test/helpers/get-browsers.js +++ b/test/helpers/get-browsers.js @@ -38,10 +38,10 @@ module.exports = async () => { browser_main_version: version(item.browser_version), })) .sort((left, right) => - version(left.browser_version) > version(right.browser_version) ? -1 : 1, + version(left.browser_version) > version(right.browser_version) ? -1 : 1 ) .slice(0, 2), - ["os", "browser_main_version"], + ["os", "browser_main_version"] ); const chrome = makeUnique( @@ -54,18 +54,18 @@ module.exports = async () => { ); }) .sort((left, right) => - version(left.browser_version) > version(right.browser_version) ? -1 : 1, + version(left.browser_version) > version(right.browser_version) ? -1 : 1 ), - ["os", "os_version"], + ["os", "os_version"] ); const ios = makeUnique( all .filter(({ browser }) => browser === "iphone") .sort((left, right) => - version(left.browser_version) > version(right.browser_version) ? -1 : 1, + version(left.browser_version) > version(right.browser_version) ? -1 : 1 ), - ["os", "os_version"], + ["os", "os_version"] ); const android = makeUnique( @@ -76,9 +76,9 @@ module.exports = async () => { os_main_version: parseInt(item.os_version.split(".")[0], 10), })) .sort((left, right) => - version(left.os_version) > version(right.os_version) ? -1 : 1, + version(left.os_version) > version(right.os_version) ? -1 : 1 ), - ["os", "os_main_version"], + ["os", "os_main_version"] ); const safari = makeUnique( @@ -96,10 +96,10 @@ module.exports = async () => { browser_main_version: version(item.browser_version), })) .sort((left, right) => - left.browser_main_version > right.browser_main_version ? -1 : 1, + left.browser_main_version > right.browser_main_version ? -1 : 1 ) .slice(0, 4), - ["os", "browser_main_version"], + ["os", "browser_main_version"] ).slice(0, 5); const firefox = makeUnique( @@ -112,9 +112,9 @@ module.exports = async () => { ); }) .sort((left, right) => - version(left.browser_version) > version(right.browser_version) ? -1 : 1, + version(left.browser_version) > version(right.browser_version) ? -1 : 1 ), - ["os"], + ["os"] ); const opera = makeUnique( @@ -128,9 +128,9 @@ module.exports = async () => { ); }) .sort((left, right) => - version(left.browser_version) > version(right.browser_version) ? -1 : 1, + version(left.browser_version) > version(right.browser_version) ? -1 : 1 ), - ["os"], + ["os"] ); const ipads = makeUnique( @@ -139,9 +139,9 @@ module.exports = async () => { return browser === "ipad"; }) .sort((left, right) => - version(left.os_version) > version(right.os_version) ? -1 : 1, + version(left.os_version) > version(right.os_version) ? -1 : 1 ), - ["os_version"], + ["os_version"] ); const browsers = [ diff --git a/test/helpers/index.js b/test/helpers/index.js index 66d8b727..25544d7c 100644 --- a/test/helpers/index.js +++ b/test/helpers/index.js @@ -27,7 +27,7 @@ module.exports.makeUnique = (array = [], keys = []) => { return array.reduce((list, item) => { const has = list.find((listItem) => - keys.every((key) => listItem[key] === item[key]), + keys.every((key) => listItem[key] === item[key]) ); if (!has) list.push(item); return list; @@ -92,7 +92,7 @@ module.exports.navigate = async ({ browser, os, name, driver, commands }) => { `${amount || 1}x`, typeof exceeded === "number" ? `(found request in ${exceeded}ms)` - : `(exceeded timeout)`, + : `(exceeded timeout)` ); } else if (script) { log(`script (${name})`, `${localhost}/?${searchParams}`); diff --git a/test/helpers/server.js b/test/helpers/server.js index cf4353bc..18ef4dfe 100644 --- a/test/helpers/server.js +++ b/test/helpers/server.js @@ -66,7 +66,7 @@ const route = async (req, res) => { Simple Analytics Test

Path: ${pathname}

- `, + ` ); return res.end(); } diff --git a/test/index.js b/test/index.js index fc705c9f..8bafc945 100644 --- a/test/index.js +++ b/test/index.js @@ -144,7 +144,7 @@ const log = (...messages) => DEBUG && console.log(" => Test:", ...messages); if (!BROWSERSTACK_USERNAME || !BROWSERSTACK_ACCESS_KEY) { console.error( - "BROWSERSTACK_USERNAME nor BROWSERSTACK_ACCESS_KEY are not defined.", + "BROWSERSTACK_USERNAME nor BROWSERSTACK_ACCESS_KEY are not defined." ); process.exit(1); } @@ -213,7 +213,7 @@ const getDeviceName = ({ const suiteInstance = Mocha.Suite.create( mochaInstance.suite, - "Public Script Test Suite", + "Public Script Test Suite" ); if (CI) @@ -223,16 +223,16 @@ const getDeviceName = ({ async function () { expect( browsers, - "Should have more than 20 browsers", + "Should have more than 20 browsers" ).to.have.lengthOf.at.least(20); - }, - ), + } + ) ); suiteInstance.addTest( new Mocha.Test(`Test Node.js environment`, async function () { expect(process.version, "Should use Node.js 16.16").to.match(/^v16\.16/); - }), + }) ); const appendBrowserData = (browser) => { @@ -409,7 +409,7 @@ const getDeviceName = ({ const testName = `Testing ${browser.name} (${index + 1}/${total})`; const nextBrowser = browsers[index + 1]; suiteInstance.addTest( - new Mocha.Test(testName, () => test(browser, nextBrowser)), + new Mocha.Test(testName, () => test(browser, nextBrowser)) ); } diff --git a/test/test-beacon.js b/test/test-beacon.js index b47a98de..b9aefce1 100644 --- a/test/test-beacon.js +++ b/test/test-beacon.js @@ -9,48 +9,48 @@ module.exports = async () => { expect( beaconRequests, - "There are not enough beacon requests found", + "There are not enough beacon requests found" ).to.have.lengthOf(2); expect( beaconRequests[0].pathname, - "First beacon request should be send via GIF", + "First beacon request should be send via GIF" ).to.equal("/simple.gif"); expect( beaconRequests[1].pathname, - "Second beacon request should be send via /append", + "Second beacon request should be send via /append" ).to.equal("/append"); beaconRequests.map((request) => { expect( request, - "There are no page view requests with body found", + "There are no page view requests with body found" ).to.have.property("body"); expect( request.body, - "All required keys should be present", + "All required keys should be present" ).to.include.all.keys(["duration", "scrolled", "original_id", "type"]); expect( UUIDvalidate(request.body.original_id, 4), - "original_id should be a valid UUIDv4", + "original_id should be a valid UUIDv4" ).to.be.true; expect( parseInt(request.body.scrolled, 10), - "Scrolled should be close to 35 percent", + "Scrolled should be close to 35 percent" ).to.be.closeTo(35, 5); expect( parseInt(request.body.duration, 10), - "Duration should be a valid number", + "Duration should be a valid number" ).to.be.a("number"); expect( parseInt(request.body.duration, 10), - "Duration should be close to 0 or 1 second", + "Duration should be close to 0 or 1 second" ).to.be.closeTo(2, 2); }); }; diff --git a/test/test-events.js b/test/test-events.js index 734dd018..04e633d2 100644 --- a/test/test-events.js +++ b/test/test-events.js @@ -10,31 +10,31 @@ module.exports = async ({ os, browser }) => { expect(requests, "There should be two event requests").to.have.lengthOf(3); expect(requests[0].body.event, "Event should be 'event_123'").to.equal( - "event_123", + "event_123" ); expect(requests[1].body.event, "Event should be 'functionoutput'").to.equal( - "functionoutput", + "functionoutput" ); expect(requests[2].body.metadata, "Event should have metadata").to.contain( - '","bool":false,"int":20301,"string":"hi\'/301%20uas@#*0"}', + '","bool":false,"int":20301,"string":"hi\'/301%20uas@#*0"}' ); expect( new Date(JSON.parse(requests[2].body.metadata).date), - "Event should have a date in the last 5 minutes", + "Event should have a date in the last 5 minutes" ).to.greaterThan(new Date(Date.now() - 300000)); requests.map((request) => { expect( request, - "There are no event requests with body found", + "There are no event requests with body found" ).to.have.property("body"); expect( request.body, - "All required keys should be present", + "All required keys should be present" ).to.include.all.keys([ "version", "hostname", @@ -47,34 +47,34 @@ module.exports = async ({ os, browser }) => { expect( UUIDvalidate(request.body.id, 4), - "event id should be a valid UUIDv4", + "event id should be a valid UUIDv4" ).to.be.true; expect( UUIDvalidate(request.body.session_id, 4), - "session_id should be a valid UUIDv4", + "session_id should be a valid UUIDv4" ).to.be.true; expect( UUIDvalidate(request.body.page_id, 4), - "page_id should be a valid UUIDv4", + "page_id should be a valid UUIDv4" ).to.be.true; if (os === "ios" || browser === "safari") { expect( request.body.hostname, - "Hostname should be bs-local.com on OS X Safari", + "Hostname should be bs-local.com on OS X Safari" ).to.equal("bs-local.com:3000"); } else { expect( request.body.hostname, - "Hostname should be localhost on non iOS", + "Hostname should be localhost on non iOS" ).to.equal("localhost:3000"); } expect( parseInt(request.body.version, 10), - "Version should be a valid number", + "Version should be a valid number" ).to.be.a("number"); }); }; diff --git a/test/test-no-pushstate.js b/test/test-no-pushstate.js index 503a7209..0dda1a39 100644 --- a/test/test-no-pushstate.js +++ b/test/test-no-pushstate.js @@ -11,28 +11,28 @@ module.exports = async () => { expect( pageViewRequests, - "There are not enough page views requests found", + "There are not enough page views requests found" ).to.have.lengthOf(2); expect( pageViewRequests[0].body.unique, - "The first visit should be unique", + "The first visit should be unique" ).to.equal("true"); expect( pageViewRequests[1].body.unique, - "The second visit should not be unique", + "The second visit should not be unique" ).to.equal("false"); pageViewRequests.map((request) => { expect( request, - "There are no page view requests with body found", + "There are no page view requests with body found" ).to.have.property("body"); expect( request.body, - "All required keys should be present", + "All required keys should be present" ).to.include.all.keys([ "hostname", "https", @@ -53,7 +53,7 @@ module.exports = async () => { expect( parseInt(request.body.version, 10), - "Version should be a valid number", + "Version should be a valid number" ).to.be.a("number"); // We replace "https:" with "http:" string on CI diff --git a/test/test-one-beacon.js b/test/test-one-beacon.js index ff7cbaf8..03d6ee9b 100644 --- a/test/test-one-beacon.js +++ b/test/test-one-beacon.js @@ -9,24 +9,24 @@ module.exports = async () => { expect( beaconRequests, - "There should be 1 beacon type request", + "There should be 1 beacon type request" ).to.have.lengthOf(1); const request = beaconRequests[0]; expect( request.pathname, - "First beacon request should be send via GIF", + "First beacon request should be send via GIF" ).to.equal("/simple.gif"); expect( request, - "There are no beacon requests with body found", + "There are no beacon requests with body found" ).to.have.property("body"); expect( request.body, - "All required keys should be present", + "All required keys should be present" ).to.include.all.keys([ "hostname", "duration", @@ -37,21 +37,21 @@ module.exports = async () => { expect( UUIDvalidate(request.body.original_id, 4), - "original_id should be a valid UUIDv4", + "original_id should be a valid UUIDv4" ).to.be.true; expect( parseInt(request.body.scrolled, 10), - "Scrolled should be close to 35 percent", + "Scrolled should be close to 35 percent" ).to.be.closeTo(35, 5); expect( parseInt(request.body.duration, 10), - "Duration should be a valid number", + "Duration should be a valid number" ).to.be.a("number"); expect( parseInt(request.body.version, 10), - "Version should be a valid number", + "Version should be a valid number" ).to.be.a("number"); }; diff --git a/test/test-pushstate.js b/test/test-pushstate.js index 62e9540f..bd3781b5 100644 --- a/test/test-pushstate.js +++ b/test/test-pushstate.js @@ -11,23 +11,23 @@ module.exports = async () => { expect( pageViewRequests, - "There are not enough page views requests found", + "There are not enough page views requests found" ).to.have.lengthOf(2); expect([true, "true"], "The first visit should be unique").to.include( - pageViewRequests[0].body.unique, + pageViewRequests[0].body.unique ); expect([false, "false"], "The second visit should not be unique").to.include( - pageViewRequests[1].body.unique, + pageViewRequests[1].body.unique ); expect(pageViewRequests[0].body.query, "Query should exist").to.equal( - "project=project_x&utm_source=utm_source&medium=medium&ref=ref", + "project=project_x&utm_source=utm_source&medium=medium&ref=ref" ); expect(pageViewRequests[1].body.query, "Query should not exist").to.equal( - "project=project_x", + "project=project_x" ); // Seconds page referrer should be the first page (ending with /) @@ -36,12 +36,12 @@ module.exports = async () => { pageViewRequests.map((request) => { expect( request, - "There are no page view requests with body found", + "There are no page view requests with body found" ).to.have.property("body"); expect( request.body, - "All required keys should be present", + "All required keys should be present" ).to.include.all.keys([ "hostname", "https", @@ -63,7 +63,7 @@ module.exports = async () => { expect( parseInt(request.body.version, 10), - "Version should be a valid number", + "Version should be a valid number" ).to.be.a("number"); // We replace "https:" with "http:" string on CI From e7174096e8742c5de61b65738e67ef0ad7493c15 Mon Sep 17 00:00:00 2001 From: Adriaan van Rossum <1079135+adriaanvanrossum@users.noreply.github.com> Date: Tue, 27 May 2025 17:30:58 +0200 Subject: [PATCH 12/62] Save local changes [no ci] --- src/auto-events.js | 2 +- src/default.js | 60 ++++++++++++++++++++-------------------------- 2 files changed, 27 insertions(+), 35 deletions(-) diff --git a/src/auto-events.js b/src/auto-events.js index 29fdd9ef..af554a91 100644 --- a/src/auto-events.js +++ b/src/auto-events.js @@ -155,7 +155,7 @@ /^https?:\/\//i.test(link.href) && new RegExp( "\\.(" + (optionsLink.downloadsExtensions || []).join("|") + ")$", - "i", + "i" ).test(link.pathname) ) { collect = "download"; diff --git a/src/default.js b/src/default.js index 5f7576c2..27497ce5 100644 --- a/src/default.js +++ b/src/default.js @@ -345,24 +345,13 @@ Date.now(); }; - var cleanSubdomain = function (url) { - if (!url) return; - return url.replace( - /^(https?:\/\/)?((m|l|w{2,3}([0-9]+)?)\.)?([^?#]+)(.*)$/, - "$5" - ); - }; - // Customers can overwrite their hostname, here we check for that - var overwrittenHostname = cleanSubdomain( - overwriteOptions.hostname || attr(scriptElement, "hostname") - ); - - var definedHostname = cleanSubdomain( - overwrittenHostname || locationHostname - ); + var overwrittenHostname = + overwriteOptions.hostname || attr(scriptElement, "hostname"); + var definedHostname = overwrittenHostname || locationHostname; var basePayload = { + pullrequest: "54", version: version, hostname: definedHostname, }; @@ -498,13 +487,12 @@ // /** if botdetection **/ - var phantom = window.phantom; var bot = nav.webdriver || window.__nightmare || window.callPhantom || window._phantom || - (phantom && !phantom.solana) || + window.phantom || window.__polypane || window._bot || isBotAgent || @@ -596,9 +584,16 @@ var page = {}; var lastSendPath; + // Customers can overwrite their referrer, here we check for that + var overwrittenReferrer = + overwriteOptions.referrer || attr(scriptElement, "referrer"); + var getReferrer = function () { - return cleanSubdomain( - (doc.referrer || "").replace(locationHostname, definedHostname) + return ( + (overwrittenReferrer || doc.referrer || "") + .replace(locationHostname, definedHostname) + .replace(/^https?:\/\/((m|l|w{2,3}([0-9]+)?)\.)?([^?#]+)(.*)$/, "$4") + .replace(/^([^/]+)$/, "$1") || undefinedVar ); }; @@ -847,10 +842,7 @@ /** if uniques **/ // We set unique variable based on pushstate or back navigation, if no match we check the referrer - page.unique = - /__cf_/.test(getReferrer()) || isPushState || userNavigated - ? falseVar - : !sameSite; + page.unique = isPushState || userNavigated ? falseVar : !sameSite; /** endif **/ /** if metadata **/ @@ -961,17 +953,17 @@ /** if (or spa hash) **/ if (autoCollect) pageview(); - - /** if metadata **/ - window.sa_pageview = function (path, metadata) { - pageview(0, path, metadata); - }; - /** else **/ - window.sa_pageview = function (path) { - pageview(0, path); - }; - /** endif **/ - + else { + /** if metadata **/ + window.sa_pageview = function (path, metadata) { + pageview(0, path, metadata); + }; + /** else **/ + window.sa_pageview = function (path) { + pageview(0, path); + }; + /** endif **/ + } /** else **/ pageview(); /** endif **/ From 8845936936ad38819ece27843c0597f3f5961842 Mon Sep 17 00:00:00 2001 From: Adriaan <1079135+adriaandotcom@users.noreply.github.com> Date: Tue, 27 May 2025 23:42:35 +0200 Subject: [PATCH 13/62] Add jsdom unit tests --- README.md | 4 ++++ package.json | 6 +++-- test/unit/default.test.js | 48 +++++++++++++++++++++++++++++++++++++++ 3 files changed, 56 insertions(+), 2 deletions(-) create mode 100644 test/unit/default.test.js diff --git a/README.md b/README.md index e2d265fe..aeff5a37 100644 --- a/README.md +++ b/README.md @@ -28,6 +28,10 @@ Just run `npm run watch` and every file will be validated and compiled on save. The most important file of the repository is [`/src/default.js`](src/default.js) +## Unit tests + +Run `npm run test:unit` to execute a small set of tests without BrowserStack. + ## Device testing is sponsored by BrowserStack We run our public script with more than [50 browsers on many different (real) devices](https://github.com/simpleanalytics/scripts/blob/main/test/helpers/get-browsers.js). We support Internet Explorer 9 (not sure who is still using that) and up. Including many mobile browsers and less common devices. We get amazing sponsorship from [BrowserStack](https://www.browserstack.com/). Thanks, BrowserStack! diff --git a/package.json b/package.json index e9f75eee..8813b935 100644 --- a/package.json +++ b/package.json @@ -10,7 +10,8 @@ "pretest": "npm run build -- testing", "test": "node -r dotenv/config ./test/index.js", "posttest": "npm run build", - "prettier": "prettier --check ." + "prettier": "prettier --check .", + "test:unit": "mocha ./test/unit" }, "repository": { "type": "git", @@ -37,6 +38,7 @@ "request": "^2.88.0", "selenium-webdriver": "^4.3.1", "uglify-js": "^3.9.4", - "uuid-validate": "0.0.3" + "uuid-validate": "0.0.3", + "jsdom": "^21.1.0" } } diff --git a/test/unit/default.test.js b/test/unit/default.test.js new file mode 100644 index 00000000..f7992b72 --- /dev/null +++ b/test/unit/default.test.js @@ -0,0 +1,48 @@ +const { JSDOM } = require("jsdom"); +const { readFileSync } = require("fs"); +const vm = require("vm"); +const { expect } = require("chai"); + +describe("default script", function () { + it("sends pageview, event and beacon requests", function () { + const dom = new JSDOM("", { + url: "https://example.com/", + runScripts: "outside-only", + }); + + const sent = []; + dom.window.Image = function () { + return { + set src(url) { + sent.push({ type: "image", url }); + }, + }; + }; + dom.window.navigator.sendBeacon = function (url, data) { + sent.push({ type: "beacon", url, data }); + return true; + }; + + const script = readFileSync("dist/latest/latest.dev.js", "utf8"); + vm.runInContext(script, dom.getInternalVMContext()); + + dom.window.sa_event("unit_test"); + + dom.window.document.hidden = true; + dom.window.document.dispatchEvent(new dom.window.Event("visibilitychange")); + + const gif = sent.find( + (r) => r.type === "image" && /simple\.gif/.test(r.url) + ); + const eventReq = sent.find( + (r) => r.type === "image" && /event_unit_test/.test(r.url) + ); + const beacon = sent.find((r) => r.type === "beacon"); + + expect(gif, "pageview gif request").to.exist; + expect(eventReq, "event gif request").to.exist; + expect(beacon, "append beacon request").to.exist; + expect(beacon.url).to.match(/\/append$/); + expect(beacon.data).to.include('"type":"append"'); + }); +}); From 46992f68e537f4757583f737e38b2d56375a5ede Mon Sep 17 00:00:00 2001 From: Adriaan van Rossum <1079135+adriaanvanrossum@users.noreply.github.com> Date: Thu, 29 May 2025 14:20:11 +0200 Subject: [PATCH 14/62] Fix default test without Browserstack --- package-lock.json | 1081 ++++++++++++++++++++++++++++++++++++- test/unit/default.test.js | 102 +++- 2 files changed, 1140 insertions(+), 43 deletions(-) diff --git a/package-lock.json b/package-lock.json index 537811ca..4d04fd03 100644 --- a/package-lock.json +++ b/package-lock.json @@ -16,6 +16,7 @@ "eslint": "^6.7.2", "esprima": "^4.0.1", "handlebars": "^4.7.6", + "jsdom": "^21.1.0", "mocha": "^6.2.3", "nodemon": "^1.19.4", "prettier": "3.2.5", @@ -45,6 +46,22 @@ "js-tokens": "^4.0.0" } }, + "node_modules/@tootallnate/once": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", + "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", + "dev": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/abab": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", + "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==", + "deprecated": "Use your platform's native atob() and btoa() methods instead", + "dev": true + }, "node_modules/abbrev": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", @@ -63,12 +80,34 @@ "node": ">=0.4.0" } }, + "node_modules/acorn-globals": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-7.0.1.tgz", + "integrity": "sha512-umOSDSDrfHbTNPuNpC2NSnnA3LUrqpevPb4T9jRx4MagXNS0rs+gwiTcAvqCRmsD6utzsrzNt+ebm00SNWiC3Q==", + "dev": true, + "dependencies": { + "acorn": "^8.1.0", + "acorn-walk": "^8.0.2" + } + }, "node_modules/acorn-jsx": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.1.0.tgz", "integrity": "sha512-tMUqwBWfLFbJbizRmEcWSLw6HnFzfdJs2sOJEOwwtVPMoH/0Ay+E703oZz78VSXZiiDcZrQ5XKjPIUQixhmgVw==", "dev": true }, + "node_modules/acorn-walk": { + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", + "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", + "dev": true, + "dependencies": { + "acorn": "^8.11.0" + }, + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/agent-base": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", @@ -520,6 +559,19 @@ "node": ">=0.10.0" } }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "dev": true, + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", @@ -855,6 +907,18 @@ "node": ">=4" } }, + "node_modules/cssstyle": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-3.0.0.tgz", + "integrity": "sha512-N4u2ABATi3Qplzf0hWbVCdjenim8F3ojEXpBDF5hBpjzW182MjNGLqfmQ0SkSPeQ+V86ZXgeH8aXj6kayd4jgg==", + "dev": true, + "dependencies": { + "rrweb-cssom": "^0.6.0" + }, + "engines": { + "node": ">=14" + } + }, "node_modules/dashdash": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", @@ -867,6 +931,20 @@ "node": ">=0.10" } }, + "node_modules/data-urls": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-4.0.0.tgz", + "integrity": "sha512-/mMTei/JXPqvFqQtfyTowxmJVwr2PVAeCcDxyFf6LhoOu/09TX2OX3kb2wzi4DMXcfj4OItwDOnhl5oziPnT6g==", + "dev": true, + "dependencies": { + "abab": "^2.0.6", + "whatwg-mimetype": "^3.0.0", + "whatwg-url": "^12.0.0" + }, + "engines": { + "node": ">=14" + } + }, "node_modules/debug": { "version": "3.2.6", "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", @@ -891,6 +969,12 @@ "node": ">=0.10.0" } }, + "node_modules/decimal.js": { + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.5.0.tgz", + "integrity": "sha512-8vDa8Qxvr/+d94hSh5P3IJwI5t8/c0KsMp+g8bNw9cY2icONa5aPfvKeieW1WlG0WQYwwhJ7mjui2xtiePQSXw==", + "dev": true + }, "node_modules/decode-uri-component": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", @@ -1020,6 +1104,19 @@ "node": ">=6.0.0" } }, + "node_modules/domexception": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/domexception/-/domexception-4.0.0.tgz", + "integrity": "sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw==", + "deprecated": "Use your platform's native DOMException instead", + "dev": true, + "dependencies": { + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, "node_modules/dot-prop": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.0.tgz", @@ -1041,6 +1138,20 @@ "node": ">=8" } }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "dev": true, + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/duplexer": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", @@ -1069,6 +1180,18 @@ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true }, + "node_modules/entities": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.0.tgz", + "integrity": "sha512-aKstq2TDOndCn4diEyp9Uq/Flu2i1GlLkc6XIDQSDMuaFE3OPW5OphLCyQ5SpSJZTb4reN+kTcYru5yIfXoRPw==", + "dev": true, + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, "node_modules/es-abstract": { "version": "1.17.6", "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.6.tgz", @@ -1091,6 +1214,51 @@ "node": ">= 0.4" } }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "dev": true, + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "dev": true, + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/es-to-primitive": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", @@ -1114,6 +1282,36 @@ "node": ">=0.8.0" } }, + "node_modules/escodegen": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", + "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", + "dev": true, + "dependencies": { + "esprima": "^4.0.1", + "estraverse": "^5.2.0", + "esutils": "^2.0.2" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=6.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" + } + }, + "node_modules/escodegen/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, "node_modules/eslint": { "version": "6.7.2", "resolved": "https://registry.npmjs.org/eslint/-/eslint-6.7.2.tgz", @@ -1794,10 +1992,13 @@ } }, "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, "node_modules/functional-red-black-tree": { "version": "1.0.1", @@ -1823,6 +2024,43 @@ "node": "*" } }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "dev": true, + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "dev": true, + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/get-stream": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", @@ -1913,6 +2151,18 @@ "node": ">=8" } }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/got": { "version": "6.7.1", "resolved": "https://registry.npmjs.org/got/-/got-6.7.1.tgz", @@ -2013,12 +2263,30 @@ } }, "node_modules/has-symbols": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", - "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", "dev": true, "engines": { "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/has-value": { @@ -2060,6 +2328,18 @@ "node": ">=0.10.0" } }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/he": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", @@ -2069,6 +2349,55 @@ "he": "bin/he" } }, + "node_modules/html-encoding-sniffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz", + "integrity": "sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==", + "dev": true, + "dependencies": { + "whatwg-encoding": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/http-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", + "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", + "dev": true, + "dependencies": { + "@tootallnate/once": "2", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/http-proxy-agent/node_modules/debug": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/http-proxy-agent/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, "node_modules/http-signature": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", @@ -2535,6 +2864,12 @@ "node": ">=0.10.0" } }, + "node_modules/is-potential-custom-element-name": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", + "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", + "dev": true + }, "node_modules/is-promise": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", @@ -2665,6 +3000,81 @@ "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", "dev": true }, + "node_modules/jsdom": { + "version": "21.1.2", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-21.1.2.tgz", + "integrity": "sha512-sCpFmK2jv+1sjff4u7fzft+pUh2KSUbUrEHYHyfSIbGTIcmnjyp83qg6qLwdJ/I3LpTXx33ACxeRL7Lsyc6lGQ==", + "dev": true, + "dependencies": { + "abab": "^2.0.6", + "acorn": "^8.8.2", + "acorn-globals": "^7.0.0", + "cssstyle": "^3.0.0", + "data-urls": "^4.0.0", + "decimal.js": "^10.4.3", + "domexception": "^4.0.0", + "escodegen": "^2.0.0", + "form-data": "^4.0.0", + "html-encoding-sniffer": "^3.0.0", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.1", + "is-potential-custom-element-name": "^1.0.1", + "nwsapi": "^2.2.4", + "parse5": "^7.1.2", + "rrweb-cssom": "^0.6.0", + "saxes": "^6.0.0", + "symbol-tree": "^3.2.4", + "tough-cookie": "^4.1.2", + "w3c-xmlserializer": "^4.0.0", + "webidl-conversions": "^7.0.0", + "whatwg-encoding": "^2.0.0", + "whatwg-mimetype": "^3.0.0", + "whatwg-url": "^12.0.1", + "ws": "^8.13.0", + "xml-name-validator": "^4.0.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "canvas": "^2.5.0" + }, + "peerDependenciesMeta": { + "canvas": { + "optional": true + } + } + }, + "node_modules/jsdom/node_modules/form-data": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.2.tgz", + "integrity": "sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==", + "dev": true, + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/jsdom/node_modules/tough-cookie": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.4.tgz", + "integrity": "sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==", + "dev": true, + "dependencies": { + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.2.0", + "url-parse": "^1.5.3" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/json-schema": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", @@ -2848,6 +3258,15 @@ "node": ">=0.10.0" } }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/micromatch": { "version": "3.1.10", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", @@ -3178,6 +3597,12 @@ "node": ">=4" } }, + "node_modules/nwsapi": { + "version": "2.2.20", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.20.tgz", + "integrity": "sha512-/ieB+mDe4MrrKMT8z+mQL8klXydZWGR5Dowt4RAGKbJ3kIGEx3X4ljUo+6V73IXtUPWgfOlU5B9MlGxFO5T+cA==", + "dev": true + }, "node_modules/oauth-sign": { "version": "0.9.0", "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", @@ -3414,6 +3839,18 @@ "node": ">=6" } }, + "node_modules/parse5": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.3.0.tgz", + "integrity": "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==", + "dev": true, + "dependencies": { + "entities": "^6.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, "node_modules/pascalcase": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", @@ -3586,9 +4023,9 @@ "dev": true }, "node_modules/punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", "dev": true, "engines": { "node": ">=6" @@ -3603,6 +4040,12 @@ "node": ">=0.6" } }, + "node_modules/querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", + "dev": true + }, "node_modules/rc": { "version": "1.2.8", "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", @@ -3761,6 +4204,12 @@ "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", "dev": true }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", + "dev": true + }, "node_modules/resolve-from": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", @@ -3810,6 +4259,12 @@ "rimraf": "bin.js" } }, + "node_modules/rrweb-cssom": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.6.0.tgz", + "integrity": "sha512-APM0Gt1KoXBz0iIkkdB/kfvGOwC4UuJFeG/c+yV7wSc7q96cG/kJ0HiYCnzivD9SB53cLV1MlHFNfOuPaadYSw==", + "dev": true + }, "node_modules/run-async": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", @@ -3855,6 +4310,18 @@ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", "dev": true }, + "node_modules/saxes": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz", + "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==", + "dev": true, + "dependencies": { + "xmlchars": "^2.2.0" + }, + "engines": { + "node": ">=v12.22.7" + } + }, "node_modules/selenium-webdriver": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/selenium-webdriver/-/selenium-webdriver-4.3.1.tgz", @@ -4342,6 +4809,12 @@ "node": ">=4" } }, + "node_modules/symbol-tree": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", + "dev": true + }, "node_modules/table": { "version": "5.4.6", "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", @@ -4550,6 +5023,18 @@ "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", "dev": true }, + "node_modules/tr46": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-4.1.1.tgz", + "integrity": "sha512-2lv/66T7e5yNyhAAC4NaKe5nVavzuGJQVVtRYLyQ2OI8tsJ61PMLlelehb0wi2Hx6+hT/OJUWZcw8MjlSRnxvw==", + "dev": true, + "dependencies": { + "punycode": "^2.3.0" + }, + "engines": { + "node": ">=14" + } + }, "node_modules/tslib": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.10.0.tgz", @@ -4664,6 +5149,15 @@ "node": ">=4" } }, + "node_modules/universalify": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", + "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", + "dev": true, + "engines": { + "node": ">= 4.0.0" + } + }, "node_modules/unset-value": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", @@ -4767,6 +5261,16 @@ "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", "dev": true }, + "node_modules/url-parse": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", + "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", + "dev": true, + "dependencies": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, "node_modules/url-parse-lax": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", @@ -4829,6 +5333,73 @@ "extsprintf": "^1.2.0" } }, + "node_modules/w3c-xmlserializer": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-4.0.0.tgz", + "integrity": "sha512-d+BFHzbiCx6zGfz0HyQ6Rg69w9k19nviJspaj4yNscGjrHu94sVP+aRm75yEbCh+r2/yR+7q6hux9LVtbuTGBw==", + "dev": true, + "dependencies": { + "xml-name-validator": "^4.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/webidl-conversions": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", + "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/whatwg-encoding": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz", + "integrity": "sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==", + "dev": true, + "dependencies": { + "iconv-lite": "0.6.3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/whatwg-encoding/node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/whatwg-mimetype": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz", + "integrity": "sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/whatwg-url": { + "version": "12.0.1", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-12.0.1.tgz", + "integrity": "sha512-Ed/LrqB8EPlGxjS+TrsXcpUond1mhccS3pchLhzSgPCnTimUCKj3IZE75pAs5m6heB2U2TMerKFUXheyHY+VDQ==", + "dev": true, + "dependencies": { + "tr46": "^4.1.1", + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=14" + } + }, "node_modules/which": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", @@ -4968,16 +5539,16 @@ } }, "node_modules/ws": { - "version": "8.8.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.8.1.tgz", - "integrity": "sha512-bGy2JzvzkPowEJV++hF07hAD6niYSr0JzBNo/J29WsB57A2r7Wlc1UFcTR9IzrPvuNVO4B8LGqF8qcpsVOhJCA==", + "version": "8.18.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.2.tgz", + "integrity": "sha512-DMricUmwGZUVr++AEAe2uiVM7UoO9MAVZMDu05UQOaUII0lp+zOzLLU4Xqh/JvTqklB1T4uELaaPBKyjE1r4fQ==", "dev": true, "engines": { "node": ">=10.0.0" }, "peerDependencies": { "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" + "utf-8-validate": ">=5.0.2" }, "peerDependenciesMeta": { "bufferutil": { @@ -4997,6 +5568,21 @@ "node": ">=4" } }, + "node_modules/xml-name-validator": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz", + "integrity": "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", + "dev": true + }, "node_modules/y18n": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", @@ -5123,6 +5709,18 @@ "js-tokens": "^4.0.0" } }, + "@tootallnate/once": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", + "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", + "dev": true + }, + "abab": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", + "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==", + "dev": true + }, "abbrev": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", @@ -5135,12 +5733,31 @@ "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", "dev": true }, + "acorn-globals": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-7.0.1.tgz", + "integrity": "sha512-umOSDSDrfHbTNPuNpC2NSnnA3LUrqpevPb4T9jRx4MagXNS0rs+gwiTcAvqCRmsD6utzsrzNt+ebm00SNWiC3Q==", + "dev": true, + "requires": { + "acorn": "^8.1.0", + "acorn-walk": "^8.0.2" + } + }, "acorn-jsx": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.1.0.tgz", "integrity": "sha512-tMUqwBWfLFbJbizRmEcWSLw6HnFzfdJs2sOJEOwwtVPMoH/0Ay+E703oZz78VSXZiiDcZrQ5XKjPIUQixhmgVw==", "dev": true }, + "acorn-walk": { + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", + "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", + "dev": true, + "requires": { + "acorn": "^8.11.0" + } + }, "agent-base": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", @@ -5511,6 +6128,16 @@ "unset-value": "^1.0.0" } }, + "call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "dev": true, + "requires": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + } + }, "callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", @@ -5791,6 +6418,15 @@ "integrity": "sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4=", "dev": true }, + "cssstyle": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-3.0.0.tgz", + "integrity": "sha512-N4u2ABATi3Qplzf0hWbVCdjenim8F3ojEXpBDF5hBpjzW182MjNGLqfmQ0SkSPeQ+V86ZXgeH8aXj6kayd4jgg==", + "dev": true, + "requires": { + "rrweb-cssom": "^0.6.0" + } + }, "dashdash": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", @@ -5800,6 +6436,17 @@ "assert-plus": "^1.0.0" } }, + "data-urls": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-4.0.0.tgz", + "integrity": "sha512-/mMTei/JXPqvFqQtfyTowxmJVwr2PVAeCcDxyFf6LhoOu/09TX2OX3kb2wzi4DMXcfj4OItwDOnhl5oziPnT6g==", + "dev": true, + "requires": { + "abab": "^2.0.6", + "whatwg-mimetype": "^3.0.0", + "whatwg-url": "^12.0.0" + } + }, "debug": { "version": "3.2.6", "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", @@ -5823,6 +6470,12 @@ "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", "dev": true }, + "decimal.js": { + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.5.0.tgz", + "integrity": "sha512-8vDa8Qxvr/+d94hSh5P3IJwI5t8/c0KsMp+g8bNw9cY2icONa5aPfvKeieW1WlG0WQYwwhJ7mjui2xtiePQSXw==", + "dev": true + }, "decode-uri-component": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", @@ -5921,6 +6574,15 @@ "esutils": "^2.0.2" } }, + "domexception": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/domexception/-/domexception-4.0.0.tgz", + "integrity": "sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw==", + "dev": true, + "requires": { + "webidl-conversions": "^7.0.0" + } + }, "dot-prop": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.0.tgz", @@ -5936,6 +6598,17 @@ "integrity": "sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw==", "dev": true }, + "dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "dev": true, + "requires": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + } + }, "duplexer": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", @@ -5964,6 +6637,12 @@ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true }, + "entities": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.0.tgz", + "integrity": "sha512-aKstq2TDOndCn4diEyp9Uq/Flu2i1GlLkc6XIDQSDMuaFE3OPW5OphLCyQ5SpSJZTb4reN+kTcYru5yIfXoRPw==", + "dev": true + }, "es-abstract": { "version": "1.17.6", "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.6.tgz", @@ -5983,6 +6662,39 @@ "string.prototype.trimstart": "^1.0.1" } }, + "es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "dev": true + }, + "es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true + }, + "es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "dev": true, + "requires": { + "es-errors": "^1.3.0" + } + }, + "es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "dev": true, + "requires": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + } + }, "es-to-primitive": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", @@ -6000,6 +6712,26 @@ "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", "dev": true }, + "escodegen": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", + "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", + "dev": true, + "requires": { + "esprima": "^4.0.1", + "estraverse": "^5.2.0", + "esutils": "^2.0.2", + "source-map": "~0.6.1" + }, + "dependencies": { + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true + } + } + }, "eslint": { "version": "6.7.2", "resolved": "https://registry.npmjs.org/eslint/-/eslint-6.7.2.tgz", @@ -6547,9 +7279,9 @@ } }, "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", "dev": true }, "functional-red-black-tree": { @@ -6570,6 +7302,34 @@ "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=", "dev": true }, + "get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "dev": true, + "requires": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + } + }, + "get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "dev": true, + "requires": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + } + }, "get-stream": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", @@ -6644,6 +7404,12 @@ "type-fest": "^0.8.1" } }, + "gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "dev": true + }, "got": { "version": "6.7.1", "resolved": "https://registry.npmjs.org/got/-/got-6.7.1.tgz", @@ -6720,11 +7486,20 @@ "dev": true }, "has-symbols": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", - "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", "dev": true }, + "has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dev": true, + "requires": { + "has-symbols": "^1.0.3" + } + }, "has-value": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", @@ -6757,12 +7532,58 @@ } } }, + "hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dev": true, + "requires": { + "function-bind": "^1.1.2" + } + }, "he": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", "dev": true }, + "html-encoding-sniffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz", + "integrity": "sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==", + "dev": true, + "requires": { + "whatwg-encoding": "^2.0.0" + } + }, + "http-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", + "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", + "dev": true, + "requires": { + "@tootallnate/once": "2", + "agent-base": "6", + "debug": "4" + }, + "dependencies": { + "debug": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", + "dev": true, + "requires": { + "ms": "^2.1.3" + } + }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + } + } + }, "http-signature": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", @@ -7128,6 +7949,12 @@ "isobject": "^3.0.1" } }, + "is-potential-custom-element-name": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", + "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", + "dev": true + }, "is-promise": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", @@ -7234,6 +8061,66 @@ "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", "dev": true }, + "jsdom": { + "version": "21.1.2", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-21.1.2.tgz", + "integrity": "sha512-sCpFmK2jv+1sjff4u7fzft+pUh2KSUbUrEHYHyfSIbGTIcmnjyp83qg6qLwdJ/I3LpTXx33ACxeRL7Lsyc6lGQ==", + "dev": true, + "requires": { + "abab": "^2.0.6", + "acorn": "^8.8.2", + "acorn-globals": "^7.0.0", + "cssstyle": "^3.0.0", + "data-urls": "^4.0.0", + "decimal.js": "^10.4.3", + "domexception": "^4.0.0", + "escodegen": "^2.0.0", + "form-data": "^4.0.0", + "html-encoding-sniffer": "^3.0.0", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.1", + "is-potential-custom-element-name": "^1.0.1", + "nwsapi": "^2.2.4", + "parse5": "^7.1.2", + "rrweb-cssom": "^0.6.0", + "saxes": "^6.0.0", + "symbol-tree": "^3.2.4", + "tough-cookie": "^4.1.2", + "w3c-xmlserializer": "^4.0.0", + "webidl-conversions": "^7.0.0", + "whatwg-encoding": "^2.0.0", + "whatwg-mimetype": "^3.0.0", + "whatwg-url": "^12.0.1", + "ws": "^8.13.0", + "xml-name-validator": "^4.0.0" + }, + "dependencies": { + "form-data": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.2.tgz", + "integrity": "sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==", + "dev": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "mime-types": "^2.1.12" + } + }, + "tough-cookie": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.4.tgz", + "integrity": "sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==", + "dev": true, + "requires": { + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.2.0", + "url-parse": "^1.5.3" + } + } + } + }, "json-schema": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", @@ -7387,6 +8274,12 @@ "object-visit": "^1.0.0" } }, + "math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "dev": true + }, "micromatch": { "version": "3.1.10", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", @@ -7661,6 +8554,12 @@ "path-key": "^2.0.0" } }, + "nwsapi": { + "version": "2.2.20", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.20.tgz", + "integrity": "sha512-/ieB+mDe4MrrKMT8z+mQL8klXydZWGR5Dowt4RAGKbJ3kIGEx3X4ljUo+6V73IXtUPWgfOlU5B9MlGxFO5T+cA==", + "dev": true + }, "oauth-sign": { "version": "0.9.0", "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", @@ -7845,6 +8744,15 @@ "callsites": "^3.0.0" } }, + "parse5": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.3.0.tgz", + "integrity": "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==", + "dev": true, + "requires": { + "entities": "^6.0.0" + } + }, "pascalcase": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", @@ -7972,9 +8880,9 @@ "dev": true }, "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", "dev": true }, "qs": { @@ -7983,6 +8891,12 @@ "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", "dev": true }, + "querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", + "dev": true + }, "rc": { "version": "1.2.8", "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", @@ -8114,6 +9028,12 @@ "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", "dev": true }, + "requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", + "dev": true + }, "resolve-from": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", @@ -8151,6 +9071,12 @@ "glob": "^7.1.3" } }, + "rrweb-cssom": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.6.0.tgz", + "integrity": "sha512-APM0Gt1KoXBz0iIkkdB/kfvGOwC4UuJFeG/c+yV7wSc7q96cG/kJ0HiYCnzivD9SB53cLV1MlHFNfOuPaadYSw==", + "dev": true + }, "run-async": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", @@ -8190,6 +9116,15 @@ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", "dev": true }, + "saxes": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz", + "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==", + "dev": true, + "requires": { + "xmlchars": "^2.2.0" + } + }, "selenium-webdriver": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/selenium-webdriver/-/selenium-webdriver-4.3.1.tgz", @@ -8590,6 +9525,12 @@ "has-flag": "^3.0.0" } }, + "symbol-tree": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", + "dev": true + }, "table": { "version": "5.4.6", "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", @@ -8761,6 +9702,15 @@ } } }, + "tr46": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-4.1.1.tgz", + "integrity": "sha512-2lv/66T7e5yNyhAAC4NaKe5nVavzuGJQVVtRYLyQ2OI8tsJ61PMLlelehb0wi2Hx6+hT/OJUWZcw8MjlSRnxvw==", + "dev": true, + "requires": { + "punycode": "^2.3.0" + } + }, "tslib": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.10.0.tgz", @@ -8853,6 +9803,12 @@ "crypto-random-string": "^1.0.0" } }, + "universalify": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", + "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", + "dev": true + }, "unset-value": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", @@ -8938,6 +9894,16 @@ "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", "dev": true }, + "url-parse": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", + "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", + "dev": true, + "requires": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, "url-parse-lax": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", @@ -8988,6 +9954,57 @@ "extsprintf": "^1.2.0" } }, + "w3c-xmlserializer": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-4.0.0.tgz", + "integrity": "sha512-d+BFHzbiCx6zGfz0HyQ6Rg69w9k19nviJspaj4yNscGjrHu94sVP+aRm75yEbCh+r2/yR+7q6hux9LVtbuTGBw==", + "dev": true, + "requires": { + "xml-name-validator": "^4.0.0" + } + }, + "webidl-conversions": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", + "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", + "dev": true + }, + "whatwg-encoding": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz", + "integrity": "sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==", + "dev": true, + "requires": { + "iconv-lite": "0.6.3" + }, + "dependencies": { + "iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + } + } + } + }, + "whatwg-mimetype": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz", + "integrity": "sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==", + "dev": true + }, + "whatwg-url": { + "version": "12.0.1", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-12.0.1.tgz", + "integrity": "sha512-Ed/LrqB8EPlGxjS+TrsXcpUond1mhccS3pchLhzSgPCnTimUCKj3IZE75pAs5m6heB2U2TMerKFUXheyHY+VDQ==", + "dev": true, + "requires": { + "tr46": "^4.1.1", + "webidl-conversions": "^7.0.0" + } + }, "which": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", @@ -9105,9 +10122,9 @@ } }, "ws": { - "version": "8.8.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.8.1.tgz", - "integrity": "sha512-bGy2JzvzkPowEJV++hF07hAD6niYSr0JzBNo/J29WsB57A2r7Wlc1UFcTR9IzrPvuNVO4B8LGqF8qcpsVOhJCA==", + "version": "8.18.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.2.tgz", + "integrity": "sha512-DMricUmwGZUVr++AEAe2uiVM7UoO9MAVZMDu05UQOaUII0lp+zOzLLU4Xqh/JvTqklB1T4uELaaPBKyjE1r4fQ==", "dev": true, "requires": {} }, @@ -9117,6 +10134,18 @@ "integrity": "sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ=", "dev": true }, + "xml-name-validator": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz", + "integrity": "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==", + "dev": true + }, + "xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", + "dev": true + }, "y18n": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", diff --git a/test/unit/default.test.js b/test/unit/default.test.js index f7992b72..3e50a2f8 100644 --- a/test/unit/default.test.js +++ b/test/unit/default.test.js @@ -3,13 +3,45 @@ const { readFileSync } = require("fs"); const vm = require("vm"); const { expect } = require("chai"); +/** + * @typedef {'navigate' | 'reload' | 'back_forward' | 'prerender'} NavigationType + */ + +/** + * @type {Record} + */ +const NAVIGATION_TYPES = { + navigate: { + name: "navigate", + code: 0, + }, + reload: { + name: "reload", + code: 1, + }, + back_forward: { + name: "back_forward", + code: 2, + }, + prerender: { + name: "prerender", + code: 255, + }, +}; + describe("default script", function () { - it("sends pageview, event and beacon requests", function () { + it("sends pageview, event and beacon requests", function (done) { const dom = new JSDOM("", { url: "https://example.com/", runScripts: "outside-only", + pretendToBeVisual: true, }); + /** + * @type {NavigationType} + */ + const navigationType = "reload"; + const sent = []; dom.window.Image = function () { return { @@ -23,26 +55,62 @@ describe("default script", function () { return true; }; + // Mock the Performance API using Object.defineProperty + Object.defineProperty(dom.window, "performance", { + writable: true, + value: { + getEntriesByType: function (type) { + if (type === "navigation") { + return [ + { + type: NAVIGATION_TYPES[navigationType].name, + }, + ]; + } + return []; + }, + navigation: { + type: NAVIGATION_TYPES[navigationType].code, + }, + }, + }); + const script = readFileSync("dist/latest/latest.dev.js", "utf8"); vm.runInContext(script, dom.getInternalVMContext()); dom.window.sa_event("unit_test"); - dom.window.document.hidden = true; - dom.window.document.dispatchEvent(new dom.window.Event("visibilitychange")); - - const gif = sent.find( - (r) => r.type === "image" && /simple\.gif/.test(r.url) - ); - const eventReq = sent.find( - (r) => r.type === "image" && /event_unit_test/.test(r.url) - ); - const beacon = sent.find((r) => r.type === "beacon"); - - expect(gif, "pageview gif request").to.exist; - expect(eventReq, "event gif request").to.exist; - expect(beacon, "append beacon request").to.exist; - expect(beacon.url).to.match(/\/append$/); - expect(beacon.data).to.include('"type":"append"'); + // The script checks for 'onpagehide' in window to determine if it should send + // the beacon on visibilitychange. If 'onpagehide' doesn't exist, it sends immediately + // when the page becomes hidden. + if (!("onpagehide" in dom.window)) { + // If pagehide is not supported, the script sends the beacon on visibilitychange + dom.window.document.hidden = true; + dom.window.document.dispatchEvent( + new dom.window.Event("visibilitychange") + ); + } else { + // If pagehide is supported, we need to dispatch the pagehide event + dom.window.dispatchEvent(new dom.window.Event("pagehide")); + } + + // Give the beacon a moment to be sent + setTimeout(() => { + const gif = sent.find( + (r) => r.type === "image" && /simple\.gif/.test(r.url) + ); + const eventReq = sent.find( + (r) => r.type === "image" && /event=unit_test/.test(r.url) + ); + const beacon = sent.find((r) => r.type === "beacon"); + + expect(gif, "pageview gif request").to.exist; + expect(eventReq, "event gif request").to.exist; + expect(beacon, "append beacon request").to.exist; + expect(beacon.url).to.match(/\/append$/); + expect(beacon.data).to.include('"type":"append"'); + + done(); + }, 10); }); }); From 5dad1eab2432efdd33ba5b8ad3a477eb2fcbdd0d Mon Sep 17 00:00:00 2001 From: Adriaan van Rossum <1079135+adriaanvanrossum@users.noreply.github.com> Date: Thu, 29 May 2025 14:25:28 +0200 Subject: [PATCH 15/62] Add unit test to job --- .github/workflows/browserstack.yml | 50 +++++++++++++++++++++++------- 1 file changed, 39 insertions(+), 11 deletions(-) diff --git a/.github/workflows/browserstack.yml b/.github/workflows/browserstack.yml index 2a9d738f..f8c6292d 100644 --- a/.github/workflows/browserstack.yml +++ b/.github/workflows/browserstack.yml @@ -9,12 +9,40 @@ on: - main jobs: - build: + unit-tests: runs-on: ubuntu-latest strategy: matrix: - node-version: [16.16] + node-version: [22] + + steps: + - uses: actions/checkout@v4 + + - name: Use Node.js ${{ matrix.node-version }} + uses: actions/setup-node@v4 + with: + node-version: ${{ matrix.node-version }} + + - name: Run npm ci + run: npm ci + + - name: Build project + run: npm run build + + - name: Run unit tests + run: npm run test:unit + env: + CI: true + NODE_ENV: test + + browserstack: + runs-on: ubuntu-latest + needs: unit-tests + + strategy: + matrix: + node-version: [22] steps: - name: "BrowserStack Env Setup" @@ -30,13 +58,10 @@ jobs: local-logging-level: "all-logs" local-identifier: "random" - - uses: actions/checkout@v3 - with: - ref: ${{ github.head_ref }} - set-safe-directory: "/github/workspace" + - uses: actions/checkout@v4 - name: Prettier Action on PR - uses: creyD/prettier_action@v4.3 + uses: creyD/prettier_action@v4.5 with: prettier_options: "--write {**/*,*}.{js,hbs,html,json,md,yml,css,scss} !.github/workflows/**/* !dist/**/*" commit_message: "Run prettier via GitHub Action" @@ -45,15 +70,18 @@ jobs: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - name: Use Node.js ${{ matrix.node-version }} - uses: actions/setup-node@v1 + uses: actions/setup-node@v4 with: node-version: ${{ matrix.node-version }} - name: Run npm ci - run: sudo npm ci + run: npm ci + + - name: Build project + run: npm run build - - name: Run npm test with BrowserStack Local - run: npm run build && node ./test/index.js + - name: Run BrowserStack tests + run: node ./test/index.js env: CI: true NODE_ENV: test From 770470a31823bfd1227ae4ea7121702908faa423 Mon Sep 17 00:00:00 2001 From: Adriaan van Rossum <1079135+adriaanvanrossum@users.noreply.github.com> Date: Thu, 29 May 2025 14:29:04 +0200 Subject: [PATCH 16/62] Make sure all node js version are the same --- .github/workflows/browserstack.yml | 4 ++-- .nvmrc | 2 +- package.json | 3 +++ test/index.js | 2 +- 4 files changed, 7 insertions(+), 4 deletions(-) diff --git a/.github/workflows/browserstack.yml b/.github/workflows/browserstack.yml index f8c6292d..3613db57 100644 --- a/.github/workflows/browserstack.yml +++ b/.github/workflows/browserstack.yml @@ -14,7 +14,7 @@ jobs: strategy: matrix: - node-version: [22] + node-version: [22.16] steps: - uses: actions/checkout@v4 @@ -42,7 +42,7 @@ jobs: strategy: matrix: - node-version: [22] + node-version: [22.16] steps: - name: "BrowserStack Env Setup" diff --git a/.nvmrc b/.nvmrc index d4b25d08..f2a2bc61 100644 --- a/.nvmrc +++ b/.nvmrc @@ -1 +1 @@ -16.16 +22.16 diff --git a/package.json b/package.json index 8813b935..2809e6aa 100644 --- a/package.json +++ b/package.json @@ -3,6 +3,9 @@ "version": "9.0.0", "description": "Simple Analytics visitor facing scripts", "main": "compile.js", + "engines": { + "node": "22.16" + }, "scripts": { "playground": "./playground.sh", "watch": "node_modules/.bin/nodemon compile.js --ignore dist", diff --git a/test/index.js b/test/index.js index 8bafc945..5dfb276c 100644 --- a/test/index.js +++ b/test/index.js @@ -231,7 +231,7 @@ const getDeviceName = ({ suiteInstance.addTest( new Mocha.Test(`Test Node.js environment`, async function () { - expect(process.version, "Should use Node.js 16.16").to.match(/^v16\.16/); + expect(process.version, "Should use Node.js 22.16").to.match(/^v22\.16/); }) ); From 065dbb14c0c83a8258285a52c9ac507adcb7d8c6 Mon Sep 17 00:00:00 2001 From: Adriaan van Rossum <1079135+adriaanvanrossum@users.noreply.github.com> Date: Thu, 29 May 2025 14:55:59 +0200 Subject: [PATCH 17/62] Allow overwriting referrer --- src/default.js | 39 +++++++++++++++++++++------------------ 1 file changed, 21 insertions(+), 18 deletions(-) diff --git a/src/default.js b/src/default.js index 27497ce5..08d7cd9b 100644 --- a/src/default.js +++ b/src/default.js @@ -351,7 +351,6 @@ var definedHostname = overwrittenHostname || locationHostname; var basePayload = { - pullrequest: "54", version: version, hostname: definedHostname, }; @@ -487,12 +486,13 @@ // /** if botdetection **/ + var phantom = window.phantom; var bot = nav.webdriver || window.__nightmare || window.callPhantom || window._phantom || - window.phantom || + (phantom && !phantom.solana) || window.__polypane || window._bot || isBotAgent || @@ -584,11 +584,11 @@ var page = {}; var lastSendPath; - // Customers can overwrite their referrer, here we check for that - var overwrittenReferrer = - overwriteOptions.referrer || attr(scriptElement, "referrer"); - var getReferrer = function () { + // Customers can overwrite their referrer, here we check for that + var overwrittenReferrer = + overwriteOptions.referrer || attr(scriptElement, "referrer"); + return ( (overwrittenReferrer || doc.referrer || "") .replace(locationHostname, definedHostname) @@ -842,7 +842,10 @@ /** if uniques **/ // We set unique variable based on pushstate or back navigation, if no match we check the referrer - page.unique = isPushState || userNavigated ? falseVar : !sameSite; + page.unique = + /__cf_/.test(getReferrer()) || isPushState || userNavigated + ? falseVar + : !sameSite; /** endif **/ /** if metadata **/ @@ -953,17 +956,17 @@ /** if (or spa hash) **/ if (autoCollect) pageview(); - else { - /** if metadata **/ - window.sa_pageview = function (path, metadata) { - pageview(0, path, metadata); - }; - /** else **/ - window.sa_pageview = function (path) { - pageview(0, path); - }; - /** endif **/ - } + + /** if metadata **/ + window.sa_pageview = function (path, metadata) { + pageview(0, path, metadata); + }; + /** else **/ + window.sa_pageview = function (path) { + pageview(0, path); + }; + /** endif **/ + /** else **/ pageview(); /** endif **/ From e1702cf4c95eb88e096854e3bc58ff6f6a93611f Mon Sep 17 00:00:00 2001 From: Adriaan van Rossum <1079135+adriaanvanrossum@users.noreply.github.com> Date: Thu, 29 May 2025 16:02:21 +0200 Subject: [PATCH 18/62] Rename testing file --- .github/workflows/{browserstack.yml => testing.yml} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename .github/workflows/{browserstack.yml => testing.yml} (100%) diff --git a/.github/workflows/browserstack.yml b/.github/workflows/testing.yml similarity index 100% rename from .github/workflows/browserstack.yml rename to .github/workflows/testing.yml From 779661a5d4806750bb156951a08502c7fa18685f Mon Sep 17 00:00:00 2001 From: Adriaan van Rossum <1079135+adriaanvanrossum@users.noreply.github.com> Date: Thu, 29 May 2025 16:02:55 +0200 Subject: [PATCH 19/62] Run prettier in dry mode [no ci] --- .github/workflows/testing.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/testing.yml b/.github/workflows/testing.yml index 3613db57..ecf30315 100644 --- a/.github/workflows/testing.yml +++ b/.github/workflows/testing.yml @@ -63,6 +63,7 @@ jobs: - name: Prettier Action on PR uses: creyD/prettier_action@v4.5 with: + dry: true prettier_options: "--write {**/*,*}.{js,hbs,html,json,md,yml,css,scss} !.github/workflows/**/* !dist/**/*" commit_message: "Run prettier via GitHub Action" file_pattern: "." From dc35828f91fdcd077c62167e516f9307d6ef549c Mon Sep 17 00:00:00 2001 From: Adriaan <1079135+adriaandotcom@users.noreply.github.com> Date: Thu, 29 May 2025 16:13:54 +0200 Subject: [PATCH 20/62] Add AGENTS guidance --- AGENTS.md | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 AGENTS.md diff --git a/AGENTS.md b/AGENTS.md new file mode 100644 index 00000000..025d6a0f --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,14 @@ +# Agent Instructions + +This repository contains the public scripts for Simple Analytics. When making changes keep the following points in mind. + +## Development + +- Use **Node.js 22.16** (see `.nvmrc`). +- Run `npm run build` to compile the scripts. This generates the files in `dist/` which should be committed. +- Format code with Prettier before committing. You can run `npx prettier -w .`. +- Execute `npm run test:unit` to run the unit tests. + +## References + +Most work happens in `src/` with `compile.js` creating the distributable versions. Read `README.md` for more details about contributing and running scripts locally. From f99b45f84f237d18747723e17db11deb3af986b3 Mon Sep 17 00:00:00 2001 From: Adriaan van Rossum <1079135+adriaanvanrossum@users.noreply.github.com> Date: Thu, 29 May 2025 16:28:42 +0200 Subject: [PATCH 21/62] Improve AGENTS.md --- AGENTS.md | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/AGENTS.md b/AGENTS.md index 025d6a0f..57a07594 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -6,8 +6,15 @@ This repository contains the public scripts for Simple Analytics. When making ch - Use **Node.js 22.16** (see `.nvmrc`). - Run `npm run build` to compile the scripts. This generates the files in `dist/` which should be committed. -- Format code with Prettier before committing. You can run `npx prettier -w .`. -- Execute `npm run test:unit` to run the unit tests. +- Format code with Prettier before committing. You can run `npx prettier -w .` or validate with `npm run prettier`. + +## Testing + +- Execute `npm run test:unit` to run the unit tests +- When adding a new feature or fixing a bug, please add a test. +- For every change, run `npm run build` to ensure the test uses the latest compiled version. +- Ignore most files in the `dist/` directory when checking for diffs, just check `dist/latest/latest.dev.js` and `dist/latest/auto-events.js` (whichever is relevant). +- Only tests in `test/unit/` are relevant for the AI and agents (it can run without internet access). ## References From fbdd6ee2acfc7fc8b53759d3b354c193f3d9a52f Mon Sep 17 00:00:00 2001 From: Adriaan van Rossum <1079135+adriaanvanrossum@users.noreply.github.com> Date: Thu, 29 May 2025 16:29:27 +0200 Subject: [PATCH 22/62] Add .cursorrules [no ci] --- .cursorrules | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 .cursorrules diff --git a/.cursorrules b/.cursorrules new file mode 100644 index 00000000..ddb3f37c --- /dev/null +++ b/.cursorrules @@ -0,0 +1,2 @@ +- Check AGENTS.md for instructions specifically for AI +- Check README.md for instructions From 6bbf49adfe5126abbb10146462e05db5684b0f17 Mon Sep 17 00:00:00 2001 From: Adriaan <1079135+adriaandotcom@users.noreply.github.com> Date: Thu, 29 May 2025 17:32:47 +0200 Subject: [PATCH 23/62] Add modular unit tests and helpers --- dist/latest/latest.dev.js | 32 +++++---- test/unit/default.test.js | 116 --------------------------------- test/unit/helpers/dom.js | 78 ++++++++++++++++++++++ test/unit/helpers/index.js | 1 + test/unit/ignore-pages.test.js | 26 ++++++++ test/unit/metadata.test.js | 42 ++++++++++++ test/unit/pageview.test.js | 37 +++++++++++ 7 files changed, 204 insertions(+), 128 deletions(-) delete mode 100644 test/unit/default.test.js create mode 100644 test/unit/helpers/dom.js create mode 100644 test/unit/helpers/index.js create mode 100644 test/unit/ignore-pages.test.js create mode 100644 test/unit/metadata.test.js create mode 100644 test/unit/pageview.test.js diff --git a/dist/latest/latest.dev.js b/dist/latest/latest.dev.js index a2127a9e..06bf05c9 100644 --- a/dist/latest/latest.dev.js +++ b/dist/latest/latest.dev.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy friendly analytics (docs.simpleanalytics.com/script; 2023-05-03; ed1a; v11) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2025-05-29; 36a5; v12) */ /* eslint-env browser */ (function ( @@ -110,8 +110,8 @@ return Array.isArray(csv) ? csv : isString(csv) && csv.length - ? csv.split(/, ?/) - : []; + ? csv.split(/, ?/) + : []; }; var isObject = function (object) { @@ -432,12 +432,13 @@ // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS // + var phantom = window.phantom; var bot = nav.webdriver || window.__nightmare || window.callPhantom || window._phantom || - window.phantom || + (phantom && !phantom.solana) || window.__polypane || window._bot || isBotAgent || @@ -512,8 +513,12 @@ var lastSendPath; var getReferrer = function () { + // Customers can overwrite their referrer, here we check for that + var overwrittenReferrer = + overwriteOptions.referrer || attr(scriptElement, "referrer"); + return ( - (doc.referrer || "") + (overwrittenReferrer || doc.referrer || "") .replace(locationHostname, definedHostname) .replace(/^https?:\/\/((m|l|w{2,3}([0-9]+)?)\.)?([^?#]+)(.*)$/, "$4") .replace(/^([^/]+)$/, "$1") || undefinedVar @@ -738,7 +743,10 @@ : falseVar; // We set unique variable based on pushstate or back navigation, if no match we check the referrer - page.unique = isPushState || userNavigated ? falseVar : !sameSite; + page.unique = + /__cf_/.test(getReferrer()) || isPushState || userNavigated + ? falseVar + : !sameSite; metadata = appendMetadata(metadata, { type: pageviewText, @@ -841,11 +849,11 @@ } if (autoCollect) pageview(); - else { - window.sa_pageview = function (path, metadata) { - pageview(0, path, metadata); - }; - } + + window.sa_pageview = function (path, metadata) { + pageview(0, path, metadata); + }; + ///////////////////// // EVENTS @@ -938,6 +946,6 @@ {}, "simpleanalyticscdn.com", "queue.", - "cdn_latest_dev_11", + "cdn_latest_dev_12", "sa" ); diff --git a/test/unit/default.test.js b/test/unit/default.test.js deleted file mode 100644 index 3e50a2f8..00000000 --- a/test/unit/default.test.js +++ /dev/null @@ -1,116 +0,0 @@ -const { JSDOM } = require("jsdom"); -const { readFileSync } = require("fs"); -const vm = require("vm"); -const { expect } = require("chai"); - -/** - * @typedef {'navigate' | 'reload' | 'back_forward' | 'prerender'} NavigationType - */ - -/** - * @type {Record} - */ -const NAVIGATION_TYPES = { - navigate: { - name: "navigate", - code: 0, - }, - reload: { - name: "reload", - code: 1, - }, - back_forward: { - name: "back_forward", - code: 2, - }, - prerender: { - name: "prerender", - code: 255, - }, -}; - -describe("default script", function () { - it("sends pageview, event and beacon requests", function (done) { - const dom = new JSDOM("", { - url: "https://example.com/", - runScripts: "outside-only", - pretendToBeVisual: true, - }); - - /** - * @type {NavigationType} - */ - const navigationType = "reload"; - - const sent = []; - dom.window.Image = function () { - return { - set src(url) { - sent.push({ type: "image", url }); - }, - }; - }; - dom.window.navigator.sendBeacon = function (url, data) { - sent.push({ type: "beacon", url, data }); - return true; - }; - - // Mock the Performance API using Object.defineProperty - Object.defineProperty(dom.window, "performance", { - writable: true, - value: { - getEntriesByType: function (type) { - if (type === "navigation") { - return [ - { - type: NAVIGATION_TYPES[navigationType].name, - }, - ]; - } - return []; - }, - navigation: { - type: NAVIGATION_TYPES[navigationType].code, - }, - }, - }); - - const script = readFileSync("dist/latest/latest.dev.js", "utf8"); - vm.runInContext(script, dom.getInternalVMContext()); - - dom.window.sa_event("unit_test"); - - // The script checks for 'onpagehide' in window to determine if it should send - // the beacon on visibilitychange. If 'onpagehide' doesn't exist, it sends immediately - // when the page becomes hidden. - if (!("onpagehide" in dom.window)) { - // If pagehide is not supported, the script sends the beacon on visibilitychange - dom.window.document.hidden = true; - dom.window.document.dispatchEvent( - new dom.window.Event("visibilitychange") - ); - } else { - // If pagehide is supported, we need to dispatch the pagehide event - dom.window.dispatchEvent(new dom.window.Event("pagehide")); - } - - // Give the beacon a moment to be sent - setTimeout(() => { - const gif = sent.find( - (r) => r.type === "image" && /simple\.gif/.test(r.url) - ); - const eventReq = sent.find( - (r) => r.type === "image" && /event=unit_test/.test(r.url) - ); - const beacon = sent.find((r) => r.type === "beacon"); - - expect(gif, "pageview gif request").to.exist; - expect(eventReq, "event gif request").to.exist; - expect(beacon, "append beacon request").to.exist; - expect(beacon.url).to.match(/\/append$/); - expect(beacon.data).to.include('"type":"append"'); - - done(); - }, 10); - }); -}); diff --git a/test/unit/helpers/dom.js b/test/unit/helpers/dom.js new file mode 100644 index 00000000..b0f2bae3 --- /dev/null +++ b/test/unit/helpers/dom.js @@ -0,0 +1,78 @@ +const { JSDOM } = require("jsdom"); +const { readFileSync } = require("fs"); +const vm = require("vm"); + +const SCRIPT_PATH = "dist/latest/latest.dev.js"; + +/** + * @typedef {"navigate" | "reload" | "back_forward" | "prerender"} NavigationType + */ + +/** @type {Record} */ +const NAVIGATION_TYPES = { + navigate: { name: "navigate", code: 0 }, + reload: { name: "reload", code: 1 }, + back_forward: { name: "back_forward", code: 2 }, + prerender: { name: "prerender", code: 255 }, +}; + +function createDOM(options = {}) { + const { + url = "https://example.com/", + navigationType = "navigate", + settings, + beforeRun, + } = options; + const dom = new JSDOM("", { + url, + runScripts: "outside-only", + pretendToBeVisual: true, + }); + + if (settings) { + vm.runInContext( + `window.sa_settings = ${JSON.stringify(settings)}`, + dom.getInternalVMContext() + ); + } + + if (typeof beforeRun === "function") beforeRun(dom.getInternalVMContext()); + + const sent = []; + dom.window.Image = function () { + return { + set src(value) { + sent.push({ type: "image", url: value }); + }, + }; + }; + dom.window.navigator.sendBeacon = function (url, data) { + sent.push({ type: "beacon", url, data }); + return true; + }; + + Object.defineProperty(dom.window, "performance", { + writable: true, + value: { + getEntriesByType: function (type) { + if (type === "navigation") { + return [{ type: NAVIGATION_TYPES[navigationType].name }]; + } + return []; + }, + navigation: { type: NAVIGATION_TYPES[navigationType].code }, + }, + }); + + const script = readFileSync(SCRIPT_PATH, "utf8"); + vm.runInContext(script, dom.getInternalVMContext()); + + dom.sent = sent; + return dom; +} + +module.exports = { + createDOM, + SCRIPT_PATH, + NAVIGATION_TYPES, +}; diff --git a/test/unit/helpers/index.js b/test/unit/helpers/index.js new file mode 100644 index 00000000..385a0601 --- /dev/null +++ b/test/unit/helpers/index.js @@ -0,0 +1 @@ +module.exports = require("./dom"); diff --git a/test/unit/ignore-pages.test.js b/test/unit/ignore-pages.test.js new file mode 100644 index 00000000..df7b5387 --- /dev/null +++ b/test/unit/ignore-pages.test.js @@ -0,0 +1,26 @@ +const { expect } = require("chai"); +const { createDOM } = require("./helpers/dom"); + +describe("ignore pages", function () { + it("does not send a request for ignored paths", function (done) { + const dom = createDOM({ + settings: { autoCollect: false, ignorePages: "/ignore" }, + }); + + dom.window.sa_pageview("/ignore"); + dom.window.sa_pageview("/allowed"); + + setTimeout(() => { + const ignoreReq = dom.sent.find( + (r) => r.type === "image" && /path=%2Fignore/.test(r.url) + ); + const allowedReq = dom.sent.find( + (r) => r.type === "image" && /path=%2Fallowed/.test(r.url) + ); + + expect(ignoreReq, "request for ignored path").to.not.exist; + expect(allowedReq, "request for allowed path").to.exist; + done(); + }, 10); + }); +}); diff --git a/test/unit/metadata.test.js b/test/unit/metadata.test.js new file mode 100644 index 00000000..76981c86 --- /dev/null +++ b/test/unit/metadata.test.js @@ -0,0 +1,42 @@ +const { expect } = require("chai"); +const { createDOM } = require("./helpers/dom"); + +describe("metadata", function () { + it("collects metadata from global object and collector", function (done) { + const dom = createDOM({ + settings: { autoCollect: false, metadataCollector: "collector" }, + beforeRun(vmContext) { + const { runInContext } = require("vm"); + runInContext( + "window.sa_metadata = { fromGlobal: true };" + + "window.collector = function(data){ return { fromCollector: true, path: data.path }; };", + vmContext + ); + }, + }); + + const { runInContext } = require("vm"); + runInContext( + "window.manualMeta = { manual: true };", + dom.getInternalVMContext() + ); + dom.window.sa_pageview("/meta", dom.window.manualMeta); + + setTimeout(() => { + const req = dom.sent.find( + (r) => r.type === "image" && /path=%2Fmeta/.test(r.url) + ); + expect(req, "pageview request").to.exist; + const url = new URL(req.url); + const meta = JSON.parse( + decodeURIComponent(url.searchParams.get("metadata")) + ); + expect(meta).to.include({ + manual: true, + fromGlobal: true, + fromCollector: true, + }); + done(); + }, 10); + }); +}); diff --git a/test/unit/pageview.test.js b/test/unit/pageview.test.js new file mode 100644 index 00000000..c8432900 --- /dev/null +++ b/test/unit/pageview.test.js @@ -0,0 +1,37 @@ +const { expect } = require("chai"); +const { createDOM } = require("./helpers/dom"); + +describe("pageview", function () { + it("sends pageview, event and beacon requests", function (done) { + const dom = createDOM({ navigationType: "reload" }); + + dom.window.sa_event("unit_test"); + + if (!("onpagehide" in dom.window)) { + dom.window.document.hidden = true; + dom.window.document.dispatchEvent( + new dom.window.Event("visibilitychange") + ); + } else { + dom.window.dispatchEvent(new dom.window.Event("pagehide")); + } + + setTimeout(() => { + const gif = dom.sent.find( + (r) => r.type === "image" && /simple\.gif/.test(r.url) + ); + const eventReq = dom.sent.find( + (r) => r.type === "image" && /event=unit_test/.test(r.url) + ); + const beacon = dom.sent.find((r) => r.type === "beacon"); + + expect(gif, "pageview gif request").to.exist; + expect(eventReq, "event gif request").to.exist; + expect(beacon, "append beacon request").to.exist; + expect(beacon.url).to.match(/\/append$/); + expect(beacon.data).to.include('"type":"append"'); + + done(); + }, 10); + }); +}); From 6f0680197dd9818f8a31f020f79978d146a57b34 Mon Sep 17 00:00:00 2001 From: Adriaan van Rossum <1079135+adriaanvanrossum@users.noreply.github.com> Date: Thu, 29 May 2025 18:07:39 +0200 Subject: [PATCH 24/62] Run browserstack not every time, and add linting --- .eslintrc.js | 18 ++++++++++++++++ .github/workflows/testing.yml | 40 +++++++++++++++++++++++++---------- package.json | 1 + src/auto-events.js | 4 +++- 4 files changed, 51 insertions(+), 12 deletions(-) create mode 100644 .eslintrc.js diff --git a/.eslintrc.js b/.eslintrc.js new file mode 100644 index 00000000..87ea1889 --- /dev/null +++ b/.eslintrc.js @@ -0,0 +1,18 @@ +module.exports = { + env: { + browser: true, + commonjs: true, + es6: true, + node: true, + }, + extends: "eslint:recommended", + ignorePatterns: ["dist/"], + globals: { + Atomics: "readonly", + SharedArrayBuffer: "readonly", + }, + parserOptions: { + ecmaVersion: 2018, + }, + rules: {}, +}; diff --git a/.github/workflows/testing.yml b/.github/workflows/testing.yml index ecf30315..7398f8c0 100644 --- a/.github/workflows/testing.yml +++ b/.github/workflows/testing.yml @@ -5,10 +5,37 @@ on: types: [opened, synchronize] push: branches: - - master - main + workflow_dispatch: jobs: + prettier: + runs-on: ubuntu-latest + if: github.event_name == 'pull_request' + + strategy: + matrix: + node-version: [22.16] + + steps: + - uses: actions/checkout@v4 + + - name: Use Node.js ${{ matrix.node-version }} + uses: actions/setup-node@v4 + with: + node-version: ${{ matrix.node-version }} + + - name: Run npm ci + run: npm ci + + - name: Run npm prettier + continue-on-error: true + run: | + ./node_modules/.bin/prettier --check . || echo "::warning::Prettier found formatting issues. Fix it locally by running './node_modules/.bin/prettier --write .'" + + - name: Run ESLint + run: ./node_modules/.bin/eslint --ext .js . + unit-tests: runs-on: ubuntu-latest @@ -39,6 +66,7 @@ jobs: browserstack: runs-on: ubuntu-latest needs: unit-tests + if: github.event_name == 'push' || github.event_name == 'workflow_dispatch' strategy: matrix: @@ -60,16 +88,6 @@ jobs: - uses: actions/checkout@v4 - - name: Prettier Action on PR - uses: creyD/prettier_action@v4.5 - with: - dry: true - prettier_options: "--write {**/*,*}.{js,hbs,html,json,md,yml,css,scss} !.github/workflows/**/* !dist/**/*" - commit_message: "Run prettier via GitHub Action" - file_pattern: "." - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - - name: Use Node.js ${{ matrix.node-version }} uses: actions/setup-node@v4 with: diff --git a/package.json b/package.json index 2809e6aa..d2b32948 100644 --- a/package.json +++ b/package.json @@ -10,6 +10,7 @@ "playground": "./playground.sh", "watch": "node_modules/.bin/nodemon compile.js --ignore dist", "build": "node compile.js", + "lint": "./node_modules/.bin/eslint --ext .js .", "pretest": "npm run build -- testing", "test": "node -r dotenv/config ./test/index.js", "posttest": "npm run build", diff --git a/src/auto-events.js b/src/auto-events.js index af554a91..a61a614d 100644 --- a/src/auto-events.js +++ b/src/auto-events.js @@ -73,7 +73,7 @@ if (typeof optionsLink === "undefined") log("options object not found, please specify", "warn"); - window.saAutomatedLink = function saAutomatedLink(element, type) { + var saAutomatedLink = function saAutomatedLink(element, type) { try { if (!element) return log("no element found"); var sent = false; @@ -146,6 +146,8 @@ } }; + window.saAutomatedLink = saAutomatedLink; + function collectLink(link, onclick) { var collect = false; From b721ad0b386da84fdfe1c457083685ee816af1f7 Mon Sep 17 00:00:00 2001 From: Adriaan van Rossum <1079135+adriaanvanrossum@users.noreply.github.com> Date: Thu, 29 May 2025 18:09:13 +0200 Subject: [PATCH 25/62] Run browserstack not every time, for real --- .github/workflows/testing.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/testing.yml b/.github/workflows/testing.yml index 7398f8c0..06334675 100644 --- a/.github/workflows/testing.yml +++ b/.github/workflows/testing.yml @@ -66,7 +66,7 @@ jobs: browserstack: runs-on: ubuntu-latest needs: unit-tests - if: github.event_name == 'push' || github.event_name == 'workflow_dispatch' + if: (github.event_name == 'push' && github.ref == 'refs/heads/main') || github.event_name == 'workflow_dispatch' strategy: matrix: From 495be42448eb05799f531f5ebad33414f80e4e71 Mon Sep 17 00:00:00 2001 From: Adriaan van Rossum <1079135+adriaanvanrossum@users.noreply.github.com> Date: Thu, 29 May 2025 18:10:15 +0200 Subject: [PATCH 26/62] Require prettier for brwoserstack too --- .github/workflows/testing.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/testing.yml b/.github/workflows/testing.yml index 06334675..f63fddda 100644 --- a/.github/workflows/testing.yml +++ b/.github/workflows/testing.yml @@ -65,7 +65,7 @@ jobs: browserstack: runs-on: ubuntu-latest - needs: unit-tests + needs: [unit-tests, prettier] if: (github.event_name == 'push' && github.ref == 'refs/heads/main') || github.event_name == 'workflow_dispatch' strategy: From 6bb5c0d0df21957d4f94a9454d6348a629db0735 Mon Sep 17 00:00:00 2001 From: Adriaan van Rossum <1079135+adriaanvanrossum@users.noreply.github.com> Date: Thu, 29 May 2025 18:11:26 +0200 Subject: [PATCH 27/62] Rename prettier to linting --- .github/workflows/testing.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/testing.yml b/.github/workflows/testing.yml index f63fddda..256291e7 100644 --- a/.github/workflows/testing.yml +++ b/.github/workflows/testing.yml @@ -9,7 +9,7 @@ on: workflow_dispatch: jobs: - prettier: + linting: runs-on: ubuntu-latest if: github.event_name == 'pull_request' @@ -65,7 +65,7 @@ jobs: browserstack: runs-on: ubuntu-latest - needs: [unit-tests, prettier] + needs: [unit-tests, linting] if: (github.event_name == 'push' && github.ref == 'refs/heads/main') || github.event_name == 'workflow_dispatch' strategy: From 0a8a5ffaffebab14bcf3b5ebd3e1f6261e509f8d Mon Sep 17 00:00:00 2001 From: Adriaan <1079135+adriaandotcom@users.noreply.github.com> Date: Fri, 30 May 2025 09:42:51 +0200 Subject: [PATCH 28/62] chore: fix eslint errors --- .eslintrc.js | 8 +++++++- dist/latest/auto-events.js | 4 ++-- dist/latest/auto-events.js.map | 2 +- src/default.js | 3 +++ test/helpers/index.js | 1 - test/helpers/server.js | 2 +- test/index.js | 7 ++----- 7 files changed, 16 insertions(+), 11 deletions(-) diff --git a/.eslintrc.js b/.eslintrc.js index 87ea1889..992c6d64 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -12,7 +12,13 @@ module.exports = { SharedArrayBuffer: "readonly", }, parserOptions: { - ecmaVersion: 2018, + ecmaVersion: 2020, }, + overrides: [ + { + files: ["test/**/*.js"], + env: { mocha: true }, + }, + ], rules: {}, }; diff --git a/dist/latest/auto-events.js b/dist/latest/auto-events.js index df23dcae..ac96fc49 100644 --- a/dist/latest/auto-events.js +++ b/dist/latest/auto-events.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy friendly analytics (docs.simpleanalytics.com/script; 2023-05-03; 19c1; v11) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2025-05-29; 0a25; v12) */ -function r(t,e){var a,o=!1;h.downloads&&/^https?:\/\//i.test(t.href)&&new RegExp("\\.("+(h.downloadsExtensions||[]).join("|")+")$","i").test(t.pathname)?o="download":h.outbound&&/^https?:\/\//i.test(t.href)&&t.hostname!==m.location.hostname?o="outbound":h.emails&&/^mailto:/i.test(t.href)&&(o="email"),o&&(e?(a="saAutomatedLink(this, '"+o+"');",t.hasAttribute("target")&&"_self"!==t.getAttribute("target")||(a+=" return false;"),t.setAttribute("onclick",a)):t.addEventListener("click",function(t){saAutomatedLink(t.target,o)}))}function e(){try{for(var t=document.getElementsByTagName("a"),e=0;e -1,\n emails: collectTypes.indexOf(\"emails\") > -1,\n downloads: collectTypes.indexOf(\"downloads\") > -1,\n // Downloads: enter file extensions you want to collect\n downloadsExtensions: setting(\"extensions\", \"array\", [\n \"pdf\",\n \"csv\",\n \"docx\",\n \"xlsx\",\n \"zip\",\n \"doc\",\n \"xls\",\n ]),\n\n // All: use title attribute if set for event name (for all events)\n // THIS TAKES PRECEDENCE OVER OTHER SETTINGS BELOW\n title: setting(\"useTitle\", \"bool\", true),\n // Outbound: use full URL of the links? false for just the hostname\n outboundFullUrl: fullUrls,\n // Downloads: if taking event name from URL, use full URL or just filename (default)\n downloadsFullUrl: fullUrls,\n };\n\n var saGlobal = setting(\"saGlobal\", \"string\", \"sa_event\");\n\n // For compiling the script\n var optionsLink = options;\n\n if (typeof optionsLink === \"undefined\")\n log(\"options object not found, please specify\", \"warn\");\n\n window.saAutomatedLink = function saAutomatedLink(element, type) {\n try {\n if (!element) return log(\"no element found\");\n var sent = false;\n\n var callback = function () {\n if (!sent && !element.hasAttribute(\"target\"))\n document.location = element.getAttribute(\"href\");\n sent = true;\n };\n\n if (window[saGlobal] && window[saGlobal + \"_loaded\"]) {\n var hostname = element.hostname;\n var pathname = element.pathname;\n\n var event;\n var metadata = {\n title: element.getAttribute(\"title\") || undefined,\n };\n var url = element.href || undefined;\n\n var useTitle = false;\n if (optionsLink.title && element.hasAttribute(\"title\")) {\n var theTitle = element.getAttribute(\"title\").trim();\n if (theTitle != \"\") useTitle = true;\n }\n\n if (useTitle) {\n event = theTitle;\n } else {\n switch (type) {\n case \"outbound\": {\n event = hostname + (optionsLink.outboundFullUrl ? pathname : \"\");\n metadata.url = url;\n break;\n }\n case \"download\": {\n event = optionsLink.downloadsFullUrl\n ? hostname + pathname\n : pathname.split(\"/\").pop();\n metadata.url = url;\n break;\n }\n case \"email\": {\n var href = element.getAttribute(\"href\");\n event = (href.split(\":\")[1] || \"\").split(\"?\")[0];\n metadata.email = event;\n break;\n }\n }\n }\n\n var clean =\n type +\n \"_\" +\n event.replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_+|_+$)/g, \"\");\n\n window[saGlobal](clean, metadata, callback);\n\n log(\"collected \" + clean);\n\n return type === \"email\"\n ? callback()\n : window.setTimeout(callback, 5000);\n } else {\n log(saGlobal + \" is not defined\", \"warn\");\n return callback();\n }\n } catch (error) {\n log(error.message, \"warn\");\n }\n };\n\n function collectLink(link, onclick) {\n var collect = false;\n\n // Collect download clicks\n if (\n optionsLink.downloads &&\n /^https?:\\/\\//i.test(link.href) &&\n new RegExp(\n \"\\\\.(\" + (optionsLink.downloadsExtensions || []).join(\"|\") + \")$\",\n \"i\"\n ).test(link.pathname)\n ) {\n collect = \"download\";\n\n // Collect outbound links clicks\n } else if (\n optionsLink.outbound &&\n /^https?:\\/\\//i.test(link.href) &&\n link.hostname !== window.location.hostname\n ) {\n collect = \"outbound\";\n\n // Collect email clicks\n } else if (optionsLink.emails && /^mailto:/i.test(link.href)) {\n collect = \"email\";\n }\n\n if (!collect) return;\n\n if (onclick) {\n var onClickAttribute = \"saAutomatedLink(this, '\" + collect + \"');\";\n\n if (\n !link.hasAttribute(\"target\") ||\n link.getAttribute(\"target\") === \"_self\"\n )\n onClickAttribute += \" return false;\";\n\n link.setAttribute(\"onclick\", onClickAttribute);\n } else {\n link.addEventListener(\"click\", function (element) {\n saAutomatedLink(element.target, collect);\n });\n }\n }\n\n function onDOMContentLoaded() {\n try {\n var a = document.getElementsByTagName(\"a\");\n\n // Loop over all links on the page\n for (var i = 0; i < a.length; i++) {\n var link = a[i];\n var href = link.getAttribute(\"href\");\n\n // Skip links that don't have an href\n if (!href) continue;\n\n // We don't want to overwrite website behaviour so we check for the onclick attribute\n if (!link.getAttribute(\"onclick\") && !/^mailto:/.test(href)) {\n collectLink(link, true);\n } else {\n collectLink(link, false);\n }\n }\n } catch (error) {\n log(error.message, \"warn\");\n }\n }\n\n if (doc.readyState === \"ready\" || doc.readyState === \"complete\") {\n onDOMContentLoaded();\n } else {\n document.addEventListener(\"readystatechange\", function (event) {\n if (event.target.readyState === \"complete\") onDOMContentLoaded();\n });\n }\n})(window);\n"],"names":["collectLink","link","onclick","onClickAttribute","collect","optionsLink","downloads","test","href","RegExp","downloadsExtensions","join","pathname","outbound","hostname","window","location","emails","hasAttribute","getAttribute","setAttribute","addEventListener","element","saAutomatedLink","target","onDOMContentLoaded","a","document","getElementsByTagName","i","length","error","log","message","doc","scriptElement","setting","collectTypes","fullUrls","options","saGlobal","type","logger","console","warn","info","currentScript","querySelector","attribute","defaultValue","value","dataset","split","map","item","trim","filter","Boolean","indexOf","title","outboundFullUrl","downloadsFullUrl","sent","callback","theTitle","metadata","undefined","url","useTitle","event","pop","email","clean","replace","setTimeout","readyState"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"auto-events.source.js","sources":["auto-events.source.js"],"sourcesContent":["(function saAutomatedEvents(window) {\n // Skip server side rendered pages\n if (typeof window === \"undefined\") return;\n\n var log = function (message, type) {\n var logger = type === \"warn\" ? console.warn : console.info;\n return logger && logger(\"Simple Analytics auto events:\", message);\n };\n\n var doc = window.document;\n\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"auto-events.js\"]');\n\n var setting = function (attribute, type, defaultValue) {\n var value = scriptElement && scriptElement.dataset[attribute];\n\n // Booleans\n if (type === \"bool\" && (value === \"true\" || value === \"false\"))\n return value === \"true\";\n else if (type === \"bool\") return defaultValue;\n\n // Arrays\n if (type === \"array\" && value)\n return value\n .split(\",\")\n .map(function (item) {\n return item.trim();\n })\n .filter(Boolean);\n else if (type === \"array\") return defaultValue;\n\n return value || defaultValue;\n };\n\n var collectTypes = setting(\"collect\", \"array\", [\n \"outbound\",\n \"emails\",\n \"downloads\",\n ]);\n var fullUrls = setting(\"fullUrls\", \"bool\", false);\n\n var options = {\n // What to collect\n outbound: collectTypes.indexOf(\"outbound\") > -1,\n emails: collectTypes.indexOf(\"emails\") > -1,\n downloads: collectTypes.indexOf(\"downloads\") > -1,\n // Downloads: enter file extensions you want to collect\n downloadsExtensions: setting(\"extensions\", \"array\", [\n \"pdf\",\n \"csv\",\n \"docx\",\n \"xlsx\",\n \"zip\",\n \"doc\",\n \"xls\",\n ]),\n\n // All: use title attribute if set for event name (for all events)\n // THIS TAKES PRECEDENCE OVER OTHER SETTINGS BELOW\n title: setting(\"useTitle\", \"bool\", true),\n // Outbound: use full URL of the links? false for just the hostname\n outboundFullUrl: fullUrls,\n // Downloads: if taking event name from URL, use full URL or just filename (default)\n downloadsFullUrl: fullUrls,\n };\n\n var saGlobal = setting(\"saGlobal\", \"string\", \"sa_event\");\n\n // For compiling the script\n var optionsLink = options;\n\n if (typeof optionsLink === \"undefined\")\n log(\"options object not found, please specify\", \"warn\");\n\n var saAutomatedLink = function saAutomatedLink(element, type) {\n try {\n if (!element) return log(\"no element found\");\n var sent = false;\n\n var callback = function () {\n if (!sent && !element.hasAttribute(\"target\"))\n document.location = element.getAttribute(\"href\");\n sent = true;\n };\n\n if (window[saGlobal] && window[saGlobal + \"_loaded\"]) {\n var hostname = element.hostname;\n var pathname = element.pathname;\n\n var event;\n var metadata = {\n title: element.getAttribute(\"title\") || undefined,\n };\n var url = element.href || undefined;\n\n var useTitle = false;\n if (optionsLink.title && element.hasAttribute(\"title\")) {\n var theTitle = element.getAttribute(\"title\").trim();\n if (theTitle != \"\") useTitle = true;\n }\n\n if (useTitle) {\n event = theTitle;\n } else {\n switch (type) {\n case \"outbound\": {\n event = hostname + (optionsLink.outboundFullUrl ? pathname : \"\");\n metadata.url = url;\n break;\n }\n case \"download\": {\n event = optionsLink.downloadsFullUrl\n ? hostname + pathname\n : pathname.split(\"/\").pop();\n metadata.url = url;\n break;\n }\n case \"email\": {\n var href = element.getAttribute(\"href\");\n event = (href.split(\":\")[1] || \"\").split(\"?\")[0];\n metadata.email = event;\n break;\n }\n }\n }\n\n var clean =\n type +\n \"_\" +\n event.replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_+|_+$)/g, \"\");\n\n window[saGlobal](clean, metadata, callback);\n\n log(\"collected \" + clean);\n\n return type === \"email\"\n ? callback()\n : window.setTimeout(callback, 5000);\n } else {\n log(saGlobal + \" is not defined\", \"warn\");\n return callback();\n }\n } catch (error) {\n log(error.message, \"warn\");\n }\n };\n\n window.saAutomatedLink = saAutomatedLink;\n\n function collectLink(link, onclick) {\n var collect = false;\n\n // Collect download clicks\n if (\n optionsLink.downloads &&\n /^https?:\\/\\//i.test(link.href) &&\n new RegExp(\n \"\\\\.(\" + (optionsLink.downloadsExtensions || []).join(\"|\") + \")$\",\n \"i\"\n ).test(link.pathname)\n ) {\n collect = \"download\";\n\n // Collect outbound links clicks\n } else if (\n optionsLink.outbound &&\n /^https?:\\/\\//i.test(link.href) &&\n link.hostname !== window.location.hostname\n ) {\n collect = \"outbound\";\n\n // Collect email clicks\n } else if (optionsLink.emails && /^mailto:/i.test(link.href)) {\n collect = \"email\";\n }\n\n if (!collect) return;\n\n if (onclick) {\n var onClickAttribute = \"saAutomatedLink(this, '\" + collect + \"');\";\n\n if (\n !link.hasAttribute(\"target\") ||\n link.getAttribute(\"target\") === \"_self\"\n )\n onClickAttribute += \" return false;\";\n\n link.setAttribute(\"onclick\", onClickAttribute);\n } else {\n link.addEventListener(\"click\", function () {\n saAutomatedLink(link, collect);\n });\n }\n }\n\n function onDOMContentLoaded() {\n try {\n var a = document.getElementsByTagName(\"a\");\n\n // Loop over all links on the page\n for (var i = 0; i < a.length; i++) {\n var link = a[i];\n var href = link.getAttribute(\"href\");\n\n // Skip links that don't have an href\n if (!href) continue;\n\n // We don't want to overwrite website behaviour so we check for the onclick attribute\n if (!link.getAttribute(\"onclick\") && !/^mailto:/.test(href)) {\n collectLink(link, true);\n } else {\n collectLink(link, false);\n }\n }\n } catch (error) {\n log(error.message, \"warn\");\n }\n }\n\n if (doc.readyState === \"ready\" || doc.readyState === \"complete\") {\n onDOMContentLoaded();\n } else {\n document.addEventListener(\"readystatechange\", function (event) {\n if (event.target.readyState === \"complete\") onDOMContentLoaded();\n });\n }\n})(window);\n"],"names":["collectLink","link","onclick","onClickAttribute","collect","optionsLink","downloads","test","href","RegExp","downloadsExtensions","join","pathname","outbound","hostname","window","location","emails","hasAttribute","getAttribute","setAttribute","addEventListener","saAutomatedLink","onDOMContentLoaded","a","document","getElementsByTagName","i","length","error","log","message","doc","scriptElement","setting","collectTypes","fullUrls","options","saGlobal","type","logger","console","warn","info","currentScript","querySelector","attribute","defaultValue","value","dataset","split","map","item","trim","filter","Boolean","indexOf","title","outboundFullUrl","downloadsFullUrl","element","sent","callback","theTitle","metadata","undefined","url","useTitle","event","pop","email","clean","replace","setTimeout","readyState","target"],"mappings":"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"} diff --git a/src/default.js b/src/default.js index 08d7cd9b..816815a1 100644 --- a/src/default.js +++ b/src/default.js @@ -165,6 +165,7 @@ }).length === 0 ); /** else **/ + // eslint-disable-next-line no-unreachable return true; /** endif **/ }; @@ -253,6 +254,7 @@ if (ignore && !allowParams.length) return falseVar; /** else **/ if (ignore) return falseVar; + // eslint-disable-next-line no-redeclare var regex = "^((utm_)" + (strictUtm ? "" : "?") + @@ -498,6 +500,7 @@ isBotAgent || Math.random() == Math.random(); /** else **/ + // eslint-disable-next-line no-redeclare var bot = isBotAgent; /** endif **/ diff --git a/test/helpers/index.js b/test/helpers/index.js index 25544d7c..0d3c1768 100644 --- a/test/helpers/index.js +++ b/test/helpers/index.js @@ -1,5 +1,4 @@ const crypto = require("crypto"); -const { networkInterfaces: getNetworkInterfaces } = require("os"); const { DEBUG, SERVER_PORT } = require("../constants"); const { promisify } = require("util"); const { By, Key } = require("selenium-webdriver"); diff --git a/test/helpers/server.js b/test/helpers/server.js index 18ef4dfe..2c2d0122 100644 --- a/test/helpers/server.js +++ b/test/helpers/server.js @@ -1,7 +1,7 @@ const url = require("url"); const http = require("http"); const { readFileSync } = require("fs"); -const { SERVER_PORT, DEBUG, CI } = require("../constants"); +const { SERVER_PORT, DEBUG } = require("../constants"); const { getJSONBody } = require("./request"); const log = (...messages) => diff --git a/test/index.js b/test/index.js index 5dfb276c..de55a7ec 100644 --- a/test/index.js +++ b/test/index.js @@ -267,12 +267,14 @@ const getDeviceName = ({ if (nextDriver) { log(`Reusing next driver...`); driver = await nextDriver; + // eslint-disable-next-line require-atomic-updates nextDriver = null; } else { log(`Waiting to get ${browser.name}...`); driver = await getDriverWithTimeout(browser); } + // eslint-disable-next-line require-atomic-updates nextDriver = backgroundDriver; // Try again with new device when driver is not available @@ -328,8 +330,6 @@ const getDeviceName = ({ // Empty global REQUESTS global.REQUESTS = []; - let errorMessage = null; - try { await navigate({ ...browser, @@ -383,9 +383,6 @@ const getDeviceName = ({ }); await require("./test-events")(browser); - } catch (error) { - errorMessage = error.message; - throw error; } finally { // if (!driver) return; // try { From bfd91a4d1f73136e99689ab8ee3284bed14c60dc Mon Sep 17 00:00:00 2001 From: Adriaan <1079135+adriaandotcom@users.noreply.github.com> Date: Fri, 30 May 2025 09:45:41 +0200 Subject: [PATCH 29/62] feat(auto-events): skip automation when data-simple-event present --- dist/latest/auto-events.js | 4 ++-- dist/latest/auto-events.js.map | 2 +- src/auto-events.js | 1 + 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/dist/latest/auto-events.js b/dist/latest/auto-events.js index df23dcae..7575a1ef 100644 --- a/dist/latest/auto-events.js +++ b/dist/latest/auto-events.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy friendly analytics (docs.simpleanalytics.com/script; 2023-05-03; 19c1; v11) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2025-05-29; 7048; v12) */ -function r(t,e){var a,o=!1;h.downloads&&/^https?:\/\//i.test(t.href)&&new RegExp("\\.("+(h.downloadsExtensions||[]).join("|")+")$","i").test(t.pathname)?o="download":h.outbound&&/^https?:\/\//i.test(t.href)&&t.hostname!==m.location.hostname?o="outbound":h.emails&&/^mailto:/i.test(t.href)&&(o="email"),o&&(e?(a="saAutomatedLink(this, '"+o+"');",t.hasAttribute("target")&&"_self"!==t.getAttribute("target")||(a+=" return false;"),t.setAttribute("onclick",a)):t.addEventListener("click",function(t){saAutomatedLink(t.target,o)}))}function e(){try{for(var t=document.getElementsByTagName("a"),e=0;e -1,\n emails: collectTypes.indexOf(\"emails\") > -1,\n downloads: collectTypes.indexOf(\"downloads\") > -1,\n // Downloads: enter file extensions you want to collect\n downloadsExtensions: setting(\"extensions\", \"array\", [\n \"pdf\",\n \"csv\",\n \"docx\",\n \"xlsx\",\n \"zip\",\n \"doc\",\n \"xls\",\n ]),\n\n // All: use title attribute if set for event name (for all events)\n // THIS TAKES PRECEDENCE OVER OTHER SETTINGS BELOW\n title: setting(\"useTitle\", \"bool\", true),\n // Outbound: use full URL of the links? false for just the hostname\n outboundFullUrl: fullUrls,\n // Downloads: if taking event name from URL, use full URL or just filename (default)\n downloadsFullUrl: fullUrls,\n };\n\n var saGlobal = setting(\"saGlobal\", \"string\", \"sa_event\");\n\n // For compiling the script\n var optionsLink = options;\n\n if (typeof optionsLink === \"undefined\")\n log(\"options object not found, please specify\", \"warn\");\n\n window.saAutomatedLink = function saAutomatedLink(element, type) {\n try {\n if (!element) return log(\"no element found\");\n var sent = false;\n\n var callback = function () {\n if (!sent && !element.hasAttribute(\"target\"))\n document.location = element.getAttribute(\"href\");\n sent = true;\n };\n\n if (window[saGlobal] && window[saGlobal + \"_loaded\"]) {\n var hostname = element.hostname;\n var pathname = element.pathname;\n\n var event;\n var metadata = {\n title: element.getAttribute(\"title\") || undefined,\n };\n var url = element.href || undefined;\n\n var useTitle = false;\n if (optionsLink.title && element.hasAttribute(\"title\")) {\n var theTitle = element.getAttribute(\"title\").trim();\n if (theTitle != \"\") useTitle = true;\n }\n\n if (useTitle) {\n event = theTitle;\n } else {\n switch (type) {\n case \"outbound\": {\n event = hostname + (optionsLink.outboundFullUrl ? pathname : \"\");\n metadata.url = url;\n break;\n }\n case \"download\": {\n event = optionsLink.downloadsFullUrl\n ? hostname + pathname\n : pathname.split(\"/\").pop();\n metadata.url = url;\n break;\n }\n case \"email\": {\n var href = element.getAttribute(\"href\");\n event = (href.split(\":\")[1] || \"\").split(\"?\")[0];\n metadata.email = event;\n break;\n }\n }\n }\n\n var clean =\n type +\n \"_\" +\n event.replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_+|_+$)/g, \"\");\n\n window[saGlobal](clean, metadata, callback);\n\n log(\"collected \" + clean);\n\n return type === \"email\"\n ? callback()\n : window.setTimeout(callback, 5000);\n } else {\n log(saGlobal + \" is not defined\", \"warn\");\n return callback();\n }\n } catch (error) {\n log(error.message, \"warn\");\n }\n };\n\n function collectLink(link, onclick) {\n var collect = false;\n\n // Collect download clicks\n if (\n optionsLink.downloads &&\n /^https?:\\/\\//i.test(link.href) &&\n new RegExp(\n \"\\\\.(\" + (optionsLink.downloadsExtensions || []).join(\"|\") + \")$\",\n \"i\"\n ).test(link.pathname)\n ) {\n collect = \"download\";\n\n // Collect outbound links clicks\n } else if (\n optionsLink.outbound &&\n /^https?:\\/\\//i.test(link.href) &&\n link.hostname !== window.location.hostname\n ) {\n collect = \"outbound\";\n\n // Collect email clicks\n } else if (optionsLink.emails && /^mailto:/i.test(link.href)) {\n collect = \"email\";\n }\n\n if (!collect) return;\n\n if (onclick) {\n var onClickAttribute = \"saAutomatedLink(this, '\" + collect + \"');\";\n\n if (\n !link.hasAttribute(\"target\") ||\n link.getAttribute(\"target\") === \"_self\"\n )\n onClickAttribute += \" return false;\";\n\n link.setAttribute(\"onclick\", onClickAttribute);\n } else {\n link.addEventListener(\"click\", function (element) {\n saAutomatedLink(element.target, collect);\n });\n }\n }\n\n function onDOMContentLoaded() {\n try {\n var a = document.getElementsByTagName(\"a\");\n\n // Loop over all links on the page\n for (var i = 0; i < a.length; i++) {\n var link = a[i];\n var href = link.getAttribute(\"href\");\n\n // Skip links that don't have an href\n if (!href) continue;\n\n // We don't want to overwrite website behaviour so we check for the onclick attribute\n if (!link.getAttribute(\"onclick\") && !/^mailto:/.test(href)) {\n collectLink(link, true);\n } else {\n collectLink(link, false);\n }\n }\n } catch (error) {\n log(error.message, \"warn\");\n }\n }\n\n if (doc.readyState === \"ready\" || doc.readyState === \"complete\") {\n onDOMContentLoaded();\n } else {\n document.addEventListener(\"readystatechange\", function (event) {\n if (event.target.readyState === \"complete\") onDOMContentLoaded();\n });\n }\n})(window);\n"],"names":["collectLink","link","onclick","onClickAttribute","collect","optionsLink","downloads","test","href","RegExp","downloadsExtensions","join","pathname","outbound","hostname","window","location","emails","hasAttribute","getAttribute","setAttribute","addEventListener","element","saAutomatedLink","target","onDOMContentLoaded","a","document","getElementsByTagName","i","length","error","log","message","doc","scriptElement","setting","collectTypes","fullUrls","options","saGlobal","type","logger","console","warn","info","currentScript","querySelector","attribute","defaultValue","value","dataset","split","map","item","trim","filter","Boolean","indexOf","title","outboundFullUrl","downloadsFullUrl","sent","callback","theTitle","metadata","undefined","url","useTitle","event","pop","email","clean","replace","setTimeout","readyState"],"mappings":";;AAoJE,SAASA,EAAYC,EAAMC,GACzB,IA6BMC,EA7BFC,GAAU,EAIZC,EAAYC,WACZ,gBAAgBC,KAAKN,EAAKO,OAC1B,IAAIC,OACF,QAAUJ,EAAYK,qBAAuB,IAAIC,KAAK,KAAO,KAC7D,KACAJ,KAAKN,EAAKW,UAEZR,EAAU,WAIVC,EAAYQ,UACZ,gBAAgBN,KAAKN,EAAKO,OAC1BP,EAAKa,WAAaC,EAAOC,SAASF,SAElCV,EAAU,WAGDC,EAAYY,QAAU,YAAYV,KAAKN,EAAKO,QACrDJ,EAAU,SAGPA,IAEDF,GACEC,EAAmB,0BAA4BC,EAAU,MAG1DH,EAAKiB,aAAa,WACa,UAAhCjB,EAAKkB,aAAa,YAElBhB,GAAoB,kBAEtBF,EAAKmB,aAAa,UAAWjB,IAE7BF,EAAKoB,iBAAiB,QAAS,SAAUC,GACvCC,gBAAgBD,EAAQE,OAAQpB,MAKtC,SAASqB,IACP,IAIE,IAHA,IAAIC,EAAIC,SAASC,qBAAqB,KAG7BC,EAAI,EAAGA,EAAIH,EAAEI,OAAQD,IAAK,CACjC,IAAI5B,EAAOyB,EAAEG,GACTrB,EAAOP,EAAKkB,aAAa,QAGxBX,IAGAP,EAAKkB,aAAa,YAAe,WAAWZ,KAAKC,GAGpDR,EAAYC,GAAM,GAFlBD,EAAYC,GAAM,KAKtB,MAAO8B,GACPC,EAAID,EAAME,QAAS,SAtNzB,IAA4BlB,EAItBiB,EAKAE,EAEAC,EAGAC,EAqBAC,EAKAC,EAEAC,EAyBAC,EAGAnC,OApEkB,KAFIU,EAiOzBA,UA7NGiB,EAAM,SAAUC,EAASQ,GAC3B,IAAIC,EAAkB,SAATD,EAAkBE,QAAQC,KAAOD,QAAQE,KACtD,OAAOH,GAAUA,EAAO,gCAAiCT,IAGvDC,EAAMnB,EAAOY,SAEbQ,EACFD,EAAIY,eAAiBZ,EAAIa,cAAc,iCAuBrCV,GArBAD,EAAU,SAAUY,EAAWP,EAAMQ,GACvC,IAAIC,EAAQf,GAAiBA,EAAcgB,QAAQH,GAGnD,MAAa,SAATP,GAA8B,SAAVS,GAA8B,UAAVA,EAE1B,SAATT,EAAwBQ,EAGpB,UAATR,GAAoBS,EACfA,EACJE,MAAM,KACNC,IAAI,SAAUC,GACb,OAAOA,EAAKC,SAEbC,OAAOC,SACM,UAAThB,GAEFS,GAF2BD,EAXf,SAAVC,IAgBgB,UAAW,QAAS,CAC7C,WACA,SACA,cAEEZ,EAAWF,EAAQ,WAAY,QAAQ,GAEvCG,EAAU,CAEZ1B,UAA8C,EAApCwB,EAAaqB,QAAQ,YAC/BzC,QAA0C,EAAlCoB,EAAaqB,QAAQ,UAC7BpD,WAAgD,EAArC+B,EAAaqB,QAAQ,aAEhChD,oBAAqB0B,EAAQ,aAAc,QAAS,CAClD,MACA,MACA,OACA,OACA,MACA,MACA,QAKFuB,MAAOvB,EAAQ,WAAY,QAAQ,GAEnCwB,gBAAiBtB,EAEjBuB,iBAAkBvB,GAGhBE,EAAWJ,EAAQ,WAAY,SAAU,iBAKlB,KAFvB/B,EAAckC,IAGhBP,EAAI,2CAA4C,QAElDjB,EAAOQ,gBAAkB,SAAyBD,EAASmB,GACzD,IACE,IAAKnB,EAAS,OAAOU,EAAI,oBACzB,IAAI8B,GAAO,EAEPC,EAAW,WACRD,GAASxC,EAAQJ,aAAa,YACjCS,SAASX,SAAWM,EAAQH,aAAa,SAC3C2C,GAAO,GAGT,GAAI/C,EAAOyB,IAAazB,EAAOyB,EAAW,WAAY,CACpD,IAWMwB,EAXFlD,EAAWQ,EAAQR,SACnBF,EAAWU,EAAQV,SAGnBqD,EAAW,CACbN,MAAOrC,EAAQH,aAAa,UAAY+C,WAEtCC,EAAM7C,EAAQd,MAAQ0D,UAEtBE,GAAW,EAMf,GALI/D,EAAYsD,OAASrC,EAAQJ,aAAa,WAE5B,KADZ8C,EAAW1C,EAAQH,aAAa,SAASoC,UACzBa,GAAW,IAG7BA,EACFC,EAAQL,OAER,OAAQvB,GACN,IAAK,WACH4B,EAAQvD,GAAYT,EAAYuD,gBAAkBhD,EAAW,IAC7DqD,EAASE,IAAMA,EACf,MAEF,IAAK,WACHE,EAAQhE,EAAYwD,iBAChB/C,EAAWF,EACXA,EAASwC,MAAM,KAAKkB,MACxBL,EAASE,IAAMA,EACf,MAEF,IAAK,QACH,IACAE,GADW/C,EAAQH,aAAa,QAClBiC,MAAM,KAAK,IAAM,IAAIA,MAAM,KAAK,GAC9Ca,EAASM,MAAQF,EAMvB,IAAIG,EACF/B,EACA,IACA4B,EAAMI,QAAQ,eAAgB,KAAKA,QAAQ,aAAc,IAM3D,OAJA1D,EAAOyB,GAAUgC,EAAOP,EAAUF,GAElC/B,EAAI,aAAewC,GAEH,UAAT/B,EACHsB,IACAhD,EAAO2D,WAAWX,EAAU,KAGhC,OADA/B,EAAIQ,EAAW,kBAAmB,QAC3BuB,IAET,MAAOhC,GACPC,EAAID,EAAME,QAAS,UA0EA,UAAnBC,EAAIyC,YAA6C,aAAnBzC,EAAIyC,WACpClD,IAEAE,SAASN,iBAAiB,mBAAoB,SAAUgD,GACtB,aAA5BA,EAAM7C,OAAOmD,YAA2BlD"} \ No newline at end of file +{"version":3,"file":"auto-events.source.js","sources":["auto-events.source.js"],"sourcesContent":["(function saAutomatedEvents(window) {\n // Skip server side rendered pages\n if (typeof window === \"undefined\") return;\n\n var log = function (message, type) {\n var logger = type === \"warn\" ? console.warn : console.info;\n return logger && logger(\"Simple Analytics auto events:\", message);\n };\n\n var doc = window.document;\n\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"auto-events.js\"]');\n\n var setting = function (attribute, type, defaultValue) {\n var value = scriptElement && scriptElement.dataset[attribute];\n\n // Booleans\n if (type === \"bool\" && (value === \"true\" || value === \"false\"))\n return value === \"true\";\n else if (type === \"bool\") return defaultValue;\n\n // Arrays\n if (type === \"array\" && value)\n return value\n .split(\",\")\n .map(function (item) {\n return item.trim();\n })\n .filter(Boolean);\n else if (type === \"array\") return defaultValue;\n\n return value || defaultValue;\n };\n\n var collectTypes = setting(\"collect\", \"array\", [\n \"outbound\",\n \"emails\",\n \"downloads\",\n ]);\n var fullUrls = setting(\"fullUrls\", \"bool\", false);\n\n var options = {\n // What to collect\n outbound: collectTypes.indexOf(\"outbound\") > -1,\n emails: collectTypes.indexOf(\"emails\") > -1,\n downloads: collectTypes.indexOf(\"downloads\") > -1,\n // Downloads: enter file extensions you want to collect\n downloadsExtensions: setting(\"extensions\", \"array\", [\n \"pdf\",\n \"csv\",\n \"docx\",\n \"xlsx\",\n \"zip\",\n \"doc\",\n \"xls\",\n ]),\n\n // All: use title attribute if set for event name (for all events)\n // THIS TAKES PRECEDENCE OVER OTHER SETTINGS BELOW\n title: setting(\"useTitle\", \"bool\", true),\n // Outbound: use full URL of the links? false for just the hostname\n outboundFullUrl: fullUrls,\n // Downloads: if taking event name from URL, use full URL or just filename (default)\n downloadsFullUrl: fullUrls,\n };\n\n var saGlobal = setting(\"saGlobal\", \"string\", \"sa_event\");\n\n // For compiling the script\n var optionsLink = options;\n\n if (typeof optionsLink === \"undefined\")\n log(\"options object not found, please specify\", \"warn\");\n\n var saAutomatedLink = function saAutomatedLink(element, type) {\n try {\n if (!element) return log(\"no element found\");\n var sent = false;\n\n var callback = function () {\n if (!sent && !element.hasAttribute(\"target\"))\n document.location = element.getAttribute(\"href\");\n sent = true;\n };\n\n if (window[saGlobal] && window[saGlobal + \"_loaded\"]) {\n var hostname = element.hostname;\n var pathname = element.pathname;\n\n var event;\n var metadata = {\n title: element.getAttribute(\"title\") || undefined,\n };\n var url = element.href || undefined;\n\n var useTitle = false;\n if (optionsLink.title && element.hasAttribute(\"title\")) {\n var theTitle = element.getAttribute(\"title\").trim();\n if (theTitle != \"\") useTitle = true;\n }\n\n if (useTitle) {\n event = theTitle;\n } else {\n switch (type) {\n case \"outbound\": {\n event = hostname + (optionsLink.outboundFullUrl ? pathname : \"\");\n metadata.url = url;\n break;\n }\n case \"download\": {\n event = optionsLink.downloadsFullUrl\n ? hostname + pathname\n : pathname.split(\"/\").pop();\n metadata.url = url;\n break;\n }\n case \"email\": {\n var href = element.getAttribute(\"href\");\n event = (href.split(\":\")[1] || \"\").split(\"?\")[0];\n metadata.email = event;\n break;\n }\n }\n }\n\n var clean =\n type +\n \"_\" +\n event.replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_+|_+$)/g, \"\");\n\n window[saGlobal](clean, metadata, callback);\n\n log(\"collected \" + clean);\n\n return type === \"email\"\n ? callback()\n : window.setTimeout(callback, 5000);\n } else {\n log(saGlobal + \" is not defined\", \"warn\");\n return callback();\n }\n } catch (error) {\n log(error.message, \"warn\");\n }\n };\n\n window.saAutomatedLink = saAutomatedLink;\n\n function collectLink(link, onclick) {\n if (link.hasAttribute(\"data-simple-event\")) return;\n var collect = false;\n\n // Collect download clicks\n if (\n optionsLink.downloads &&\n /^https?:\\/\\//i.test(link.href) &&\n new RegExp(\n \"\\\\.(\" + (optionsLink.downloadsExtensions || []).join(\"|\") + \")$\",\n \"i\"\n ).test(link.pathname)\n ) {\n collect = \"download\";\n\n // Collect outbound links clicks\n } else if (\n optionsLink.outbound &&\n /^https?:\\/\\//i.test(link.href) &&\n link.hostname !== window.location.hostname\n ) {\n collect = \"outbound\";\n\n // Collect email clicks\n } else if (optionsLink.emails && /^mailto:/i.test(link.href)) {\n collect = \"email\";\n }\n\n if (!collect) return;\n\n if (onclick) {\n var onClickAttribute = \"saAutomatedLink(this, '\" + collect + \"');\";\n\n if (\n !link.hasAttribute(\"target\") ||\n link.getAttribute(\"target\") === \"_self\"\n )\n onClickAttribute += \" return false;\";\n\n link.setAttribute(\"onclick\", onClickAttribute);\n } else {\n link.addEventListener(\"click\", function () {\n saAutomatedLink(link, collect);\n });\n }\n }\n\n function onDOMContentLoaded() {\n try {\n var a = document.getElementsByTagName(\"a\");\n\n // Loop over all links on the page\n for (var i = 0; i < a.length; i++) {\n var link = a[i];\n var href = link.getAttribute(\"href\");\n\n // Skip links that don't have an href\n if (!href) continue;\n\n // We don't want to overwrite website behaviour so we check for the onclick attribute\n if (!link.getAttribute(\"onclick\") && !/^mailto:/.test(href)) {\n collectLink(link, true);\n } else {\n collectLink(link, false);\n }\n }\n } catch (error) {\n log(error.message, \"warn\");\n }\n }\n\n if (doc.readyState === \"ready\" || doc.readyState === \"complete\") {\n onDOMContentLoaded();\n } else {\n document.addEventListener(\"readystatechange\", function (event) {\n if (event.target.readyState === \"complete\") onDOMContentLoaded();\n });\n }\n})(window);\n"],"names":["collectLink","link","onclick","collect","onClickAttribute","hasAttribute","optionsLink","downloads","test","href","RegExp","downloadsExtensions","join","pathname","outbound","hostname","window","location","emails","getAttribute","setAttribute","addEventListener","saAutomatedLink","onDOMContentLoaded","a","document","getElementsByTagName","i","length","error","log","message","doc","scriptElement","setting","collectTypes","fullUrls","options","saGlobal","type","logger","console","warn","info","currentScript","querySelector","attribute","defaultValue","value","dataset","split","map","item","trim","filter","Boolean","indexOf","title","outboundFullUrl","downloadsFullUrl","element","sent","callback","theTitle","metadata","undefined","url","useTitle","event","pop","email","clean","replace","setTimeout","readyState","target"],"mappings":"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"} diff --git a/src/auto-events.js b/src/auto-events.js index a61a614d..3f08e13f 100644 --- a/src/auto-events.js +++ b/src/auto-events.js @@ -149,6 +149,7 @@ window.saAutomatedLink = saAutomatedLink; function collectLink(link, onclick) { + if (link.hasAttribute("data-simple-event")) return; var collect = false; // Collect download clicks From 912f482ee482669810933a9f42939e8f2aca68a3 Mon Sep 17 00:00:00 2001 From: Adriaan van Rossum <1079135+adriaanvanrossum@users.noreply.github.com> Date: Fri, 30 May 2025 09:51:29 +0200 Subject: [PATCH 30/62] Add manual build step --- .github/workflows/testing.yml | 58 +++++++++++++++++++++++------------ 1 file changed, 38 insertions(+), 20 deletions(-) diff --git a/.github/workflows/testing.yml b/.github/workflows/testing.yml index 256291e7..1604a756 100644 --- a/.github/workflows/testing.yml +++ b/.github/workflows/testing.yml @@ -1,29 +1,28 @@ name: Browserstack on: + workflow_dispatch: pull_request: types: [opened, synchronize] push: branches: - main - workflow_dispatch: + +env: + NODE_VERSION: 22.16 jobs: linting: runs-on: ubuntu-latest if: github.event_name == 'pull_request' - strategy: - matrix: - node-version: [22.16] - steps: - uses: actions/checkout@v4 - - name: Use Node.js ${{ matrix.node-version }} + - name: Use Node.js ${{ env.NODE_VERSION }} uses: actions/setup-node@v4 with: - node-version: ${{ matrix.node-version }} + node-version: ${{ env.NODE_VERSION }} - name: Run npm ci run: npm ci @@ -39,17 +38,13 @@ jobs: unit-tests: runs-on: ubuntu-latest - strategy: - matrix: - node-version: [22.16] - steps: - uses: actions/checkout@v4 - - name: Use Node.js ${{ matrix.node-version }} + - name: Use Node.js ${{ env.NODE_VERSION }} uses: actions/setup-node@v4 with: - node-version: ${{ matrix.node-version }} + node-version: ${{ env.NODE_VERSION }} - name: Run npm ci run: npm ci @@ -63,14 +58,37 @@ jobs: CI: true NODE_ENV: test - browserstack: + build: runs-on: ubuntu-latest - needs: [unit-tests, linting] + needs: unit-tests if: (github.event_name == 'push' && github.ref == 'refs/heads/main') || github.event_name == 'workflow_dispatch' - strategy: - matrix: - node-version: [22.16] + steps: + - uses: actions/checkout@v4 + + - name: Use Node.js ${{ env.NODE_VERSION }} + uses: actions/setup-node@v4 + with: + node-version: ${{ env.NODE_VERSION }} + + - name: Run npm ci + run: npm ci + + - name: Build project + run: npm run build + + - name: Commit build changes + run: | + git config --local user.email "action@github.com" + git config --local user.name "GitHub Action" + git add dist/ + git diff --staged --quiet || git commit -m "Update build artifacts [skip ci]" + git push + + browserstack: + runs-on: ubuntu-latest + needs: [unit-tests, linting, build] + if: (github.event_name == 'push' && github.ref == 'refs/heads/main') || github.event_name == 'workflow_dispatch' steps: - name: "BrowserStack Env Setup" @@ -88,10 +106,10 @@ jobs: - uses: actions/checkout@v4 - - name: Use Node.js ${{ matrix.node-version }} + - name: Use Node.js ${{ env.NODE_VERSION }} uses: actions/setup-node@v4 with: - node-version: ${{ matrix.node-version }} + node-version: ${{ env.NODE_VERSION }} - name: Run npm ci run: npm ci From 82fcbb44eac0a04c004241fb4df597d0e76b49e8 Mon Sep 17 00:00:00 2001 From: Adriaan van Rossum <1079135+adriaanvanrossum@users.noreply.github.com> Date: Fri, 30 May 2025 09:56:32 +0200 Subject: [PATCH 31/62] Rename to Testing Suite --- .github/workflows/testing.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/testing.yml b/.github/workflows/testing.yml index 1604a756..27ff514b 100644 --- a/.github/workflows/testing.yml +++ b/.github/workflows/testing.yml @@ -1,12 +1,12 @@ -name: Browserstack +name: Testing Suite on: - workflow_dispatch: pull_request: types: [opened, synchronize] push: branches: - main + workflow_dispatch: env: NODE_VERSION: 22.16 From 21ae5b7b00e602c7301c091d7d791025414a2681 Mon Sep 17 00:00:00 2001 From: Adriaan <1079135+adriaandotcom@users.noreply.github.com> Date: Fri, 30 May 2025 10:41:33 +0200 Subject: [PATCH 32/62] fix metadata reload in appendMetadata --- dist/latest/latest.dev.js | 4 ++-- src/default.js | 2 +- test/unit/metadata.test.js | 43 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 46 insertions(+), 3 deletions(-) diff --git a/dist/latest/latest.dev.js b/dist/latest/latest.dev.js index 06bf05c9..ce723764 100644 --- a/dist/latest/latest.dev.js +++ b/dist/latest/latest.dev.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2025-05-29; 36a5; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2025-05-30; 1686; v12) */ /* eslint-env browser */ (function ( @@ -191,8 +191,8 @@ attr(scriptElement, namespaceText) || defaultNamespace; - var metadataObject = window[namespace + "_metadata"]; var appendMetadata = function (metadata, data) { + var metadataObject = window[namespace + "_metadata"]; if (isObject(metadataObject)) metadata = assign(metadata, metadataObject); var metadataCollectorFunction = window[metadataCollector]; if (!isFunction(metadataCollectorFunction)) return metadata; diff --git a/src/default.js b/src/default.js index 816815a1..c9312144 100644 --- a/src/default.js +++ b/src/default.js @@ -206,8 +206,8 @@ defaultNamespace; /** if metadata **/ - var metadataObject = window[namespace + "_metadata"]; var appendMetadata = function (metadata, data) { + var metadataObject = window[namespace + "_metadata"]; if (isObject(metadataObject)) metadata = assign(metadata, metadataObject); var metadataCollectorFunction = window[metadataCollector]; if (!isFunction(metadataCollectorFunction)) return metadata; diff --git a/test/unit/metadata.test.js b/test/unit/metadata.test.js index 76981c86..b5270b62 100644 --- a/test/unit/metadata.test.js +++ b/test/unit/metadata.test.js @@ -39,4 +39,47 @@ describe("metadata", function () { done(); }, 10); }); + + it("reloads global metadata on each call", function (done) { + const dom = createDOM({ settings: { autoCollect: false } }); + const { runInContext } = require("vm"); + + runInContext( + "window.sa_metadata = { first: true };", + dom.getInternalVMContext() + ); + + dom.window.sa_pageview("/first"); + + setTimeout(() => { + let req = dom.sent.find( + (r) => r.type === "image" && /path=%2Ffirst/.test(r.url) + ); + expect(req, "first pageview request").to.exist; + let url = new URL(req.url); + let meta = JSON.parse( + decodeURIComponent(url.searchParams.get("metadata")) + ); + expect(meta).to.include({ first: true }); + + runInContext( + "window.sa_metadata = { second: true };", + dom.getInternalVMContext() + ); + + dom.window.sa_pageview("/second"); + + setTimeout(() => { + req = dom.sent.find( + (r) => r.type === "image" && /path=%2Fsecond/.test(r.url) + ); + expect(req, "second pageview request").to.exist; + url = new URL(req.url); + meta = JSON.parse(decodeURIComponent(url.searchParams.get("metadata"))); + expect(meta).to.include({ second: true }); + expect(meta).to.not.have.property("first"); + done(); + }, 10); + }, 10); + }); }); From 18354281a080715525fef1761d7f2963c335a536 Mon Sep 17 00:00:00 2001 From: Adriaan <1079135+adriaandotcom@users.noreply.github.com> Date: Fri, 30 May 2025 17:09:28 +0200 Subject: [PATCH 33/62] Bind sendBeacon calls --- dist/latest/latest.dev.js | 10 ++++++++-- package-lock.json | 3 +++ src/default.js | 7 ++++++- test/unit/pageview.test.js | 30 ++++++++++++++++++++++++++++++ 4 files changed, 47 insertions(+), 3 deletions(-) diff --git a/dist/latest/latest.dev.js b/dist/latest/latest.dev.js index 06bf05c9..c94f91c0 100644 --- a/dist/latest/latest.dev.js +++ b/dist/latest/latest.dev.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2025-05-29; 36a5; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2025-05-30; bf05; v12) */ /* eslint-env browser */ (function ( @@ -559,7 +559,13 @@ // sendData will assign payload to request sendData(append, undefinedVar, trueVar); } else { - nav.sendBeacon(fullApiUrl + "/append", stringify(append)); + try { + nav.sendBeacon + .bind(nav)(fullApiUrl + "/append", stringify(append)); + } catch (e) { + // Fallback for browsers throwing "Illegal invocation" when the URL is invalid + sendData(append, undefinedVar, trueVar); + } } }; diff --git a/package-lock.json b/package-lock.json index 4d04fd03..7c2d2440 100644 --- a/package-lock.json +++ b/package-lock.json @@ -24,6 +24,9 @@ "selenium-webdriver": "^4.3.1", "uglify-js": "^3.9.4", "uuid-validate": "0.0.3" + }, + "engines": { + "node": "22.16" } }, "node_modules/@babel/code-frame": { diff --git a/src/default.js b/src/default.js index 816815a1..6d9a3464 100644 --- a/src/default.js +++ b/src/default.js @@ -638,7 +638,12 @@ // sendData will assign payload to request sendData(append, undefinedVar, trueVar); } else { - nav.sendBeacon(fullApiUrl + "/append", stringify(append)); + try { + nav.sendBeacon.bind(nav)(fullApiUrl + "/append", stringify(append)); + } catch (e) { + // Fallback for browsers throwing "Illegal invocation" when the URL is invalid + sendData(append, undefinedVar, trueVar); + } } }; diff --git a/test/unit/pageview.test.js b/test/unit/pageview.test.js index c8432900..0459f479 100644 --- a/test/unit/pageview.test.js +++ b/test/unit/pageview.test.js @@ -34,4 +34,34 @@ describe("pageview", function () { done(); }, 10); }); + + it("falls back to pixel when sendBeacon fails", function (done) { + const dom = createDOM({ navigationType: "reload" }); + + dom.window.navigator.sendBeacon = function () { + throw new TypeError("Illegal invocation"); + }; + + dom.window.sa_event("unit_test"); + + if (!("onpagehide" in dom.window)) { + dom.window.document.hidden = true; + dom.window.document.dispatchEvent( + new dom.window.Event("visibilitychange") + ); + } else { + dom.window.dispatchEvent(new dom.window.Event("pagehide")); + } + + setTimeout(() => { + const beacon = dom.sent.find((r) => r.type === "beacon"); + const appendGif = dom.sent.find( + (r) => r.type === "image" && /type=append/.test(r.url) + ); + + expect(beacon, "append beacon request").to.not.exist; + expect(appendGif, "append gif request").to.exist; + done(); + }, 10); + }); }); From 7dc389fcc15aec8b1d9db8afc5aff85e48fb2827 Mon Sep 17 00:00:00 2001 From: Adriaan <1079135+adriaandotcom@users.noreply.github.com> Date: Fri, 30 May 2025 17:29:24 +0200 Subject: [PATCH 34/62] Add callback support to sa_pageview --- dist/latest/auto-events.js | 2 +- dist/latest/latest.dev.js | 38 ++++++++++++++++-------- src/default.js | 46 ++++++++++++++++++----------- test/unit/pageview-callback.test.js | 34 +++++++++++++++++++++ 4 files changed, 89 insertions(+), 31 deletions(-) create mode 100644 test/unit/pageview-callback.test.js diff --git a/dist/latest/auto-events.js b/dist/latest/auto-events.js index 7575a1ef..c8ac687e 100644 --- a/dist/latest/auto-events.js +++ b/dist/latest/auto-events.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2025-05-29; 7048; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2025-05-30; 7048; v12) */ function r(t,e){var a,n;t.hasAttribute("data-simple-event")||(a=!1,h.downloads&&/^https?:\/\//i.test(t.href)&&new RegExp("\\.("+(h.downloadsExtensions||[]).join("|")+")$","i").test(t.pathname)?a="download":h.outbound&&/^https?:\/\//i.test(t.href)&&t.hostname!==m.location.hostname?a="outbound":h.emails&&/^mailto:/i.test(t.href)&&(a="email"),a&&(e?(n="saAutomatedLink(this, '"+a+"');",t.hasAttribute("target")&&"_self"!==t.getAttribute("target")||(n+=" return false;"),t.setAttribute("onclick",n)):t.addEventListener("click",function(){g(t,a)})))}function e(){try{for(var t=document.getElementsByTagName("a"),e=0;e { + const req = dom.sent.find( + (r) => r.type === "image" && /path=%2Fcallback/.test(r.url) + ); + expect(req, "pageview request").to.exist; + expect(called, "callback called").to.be.true; + done(); + }, 10); + }); +}); From cba0b205aa981ffe6e55a042dff24ae0bb22b823 Mon Sep 17 00:00:00 2001 From: Adriaan van Rossum <1079135+adriaanvanrossum@users.noreply.github.com> Date: Fri, 13 Jun 2025 15:59:04 +0200 Subject: [PATCH 35/62] Checkout dist after test:unit --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index d2b32948..fab35be4 100644 --- a/package.json +++ b/package.json @@ -15,7 +15,7 @@ "test": "node -r dotenv/config ./test/index.js", "posttest": "npm run build", "prettier": "prettier --check .", - "test:unit": "mocha ./test/unit" + "test:unit": "npm run build -- testing && mocha ./test/unit && git checkout dist" }, "repository": { "type": "git", From 2d165c9a78b3c82173f0627a5cebc18086ebfa84 Mon Sep 17 00:00:00 2001 From: Adriaan <1079135+adriaandotcom@users.noreply.github.com> Date: Fri, 13 Jun 2025 16:00:33 +0200 Subject: [PATCH 36/62] Reuse query param filter for manual pageviews --- dist/latest/auto-events.js | 2 +- dist/latest/latest.dev.js | 24 +++++++++++++++++------- src/default.js | 19 +++++++++++++++---- test/unit/pageview-query.test.js | 22 ++++++++++++++++++++++ 4 files changed, 55 insertions(+), 12 deletions(-) create mode 100644 test/unit/pageview-query.test.js diff --git a/dist/latest/auto-events.js b/dist/latest/auto-events.js index c8ac687e..ad6fe1f0 100644 --- a/dist/latest/auto-events.js +++ b/dist/latest/auto-events.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2025-05-30; 7048; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2025-06-13; 7048; v12) */ function r(t,e){var a,n;t.hasAttribute("data-simple-event")||(a=!1,h.downloads&&/^https?:\/\//i.test(t.href)&&new RegExp("\\.("+(h.downloadsExtensions||[]).join("|")+")$","i").test(t.pathname)?a="download":h.outbound&&/^https?:\/\//i.test(t.href)&&t.hostname!==m.location.hostname?a="outbound":h.emails&&/^mailto:/i.test(t.href)&&(a="email"),a&&(e?(n="saAutomatedLink(this, '"+a+"');",t.hasAttribute("target")&&"_self"!==t.getAttribute("target")||(n+=" return false;"),t.setAttribute("onclick",n)):t.addEventListener("click",function(){g(t,a)})))}function e(){try{for(var t=document.getElementsByTagName("a"),e=0;e -1) { + // keep query from manual path + var parts = pathOverwrite.split("?"); + pathOverwrite = parts.shift(); + querySearch = "?" + parts.join("?"); + } // Obfuscate personal data in URL by dropping the search and hash var path = getPath(pathOverwrite); @@ -772,10 +779,13 @@ var triggerSendPageView = function () { fetchedHighEntropyValues = trueVar; + var delSrc = + isPushState || userNavigated || !collectMetricByString("r"); sendPageView( isPushState, - isPushState || userNavigated || !collectMetricByString("r"), // r = referrers + delSrc, // r = referrers sameSite, + querySearch ? getQueryParams(delSrc, querySearch) : undefinedVar, metadata, callback ); diff --git a/src/default.js b/src/default.js index 414bc66c..ab63e46b 100644 --- a/src/default.js +++ b/src/default.js @@ -232,9 +232,9 @@ overwriteOptions.strictUtm || attr(scriptElement, "strict-utm") == trueText; - var getQueryParams = function (ignoreSource) { + var getQueryParams = function (ignoreSource, overwriteSearch) { return ( - loc.search + (overwriteSearch || loc.search) .slice(1) .split("&") .filter(function (keyValue) { @@ -750,6 +750,7 @@ isPushState, deleteSourceInfo, sameSite, + query, metadata, callback ) { @@ -763,7 +764,7 @@ id: payload.page_id, type: pageviewText, referrer: !deleteSourceInfo || sameSite ? referrer : null, - query: getQueryParams(deleteSourceInfo), + query: query || getQueryParams(deleteSourceInfo), /** if metadata **/ metadata: stringify(metadata), @@ -788,6 +789,13 @@ ) { if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata; var callback = isFunction(callbackRaw) ? callbackRaw : function () {}; + var querySearch; + if (isString(pathOverwrite) && pathOverwrite.indexOf("?") > -1) { + // keep query from manual path + var parts = pathOverwrite.split("?"); + pathOverwrite = parts.shift(); + querySearch = "?" + parts.join("?"); + } // Obfuscate personal data in URL by dropping the search and hash var path = getPath(pathOverwrite); @@ -876,10 +884,13 @@ var triggerSendPageView = function () { fetchedHighEntropyValues = trueVar; + var delSrc = + isPushState || userNavigated || !collectMetricByString("r"); sendPageView( isPushState, - isPushState || userNavigated || !collectMetricByString("r"), // r = referrers + delSrc, // r = referrers sameSite, + querySearch ? getQueryParams(delSrc, querySearch) : undefinedVar, metadata, callback ); diff --git a/test/unit/pageview-query.test.js b/test/unit/pageview-query.test.js new file mode 100644 index 00000000..0f4478d3 --- /dev/null +++ b/test/unit/pageview-query.test.js @@ -0,0 +1,22 @@ +const { expect } = require("chai"); +const { createDOM } = require("./helpers/dom"); + +describe("pageview query", function () { + it("sends query params from manual path", function (done) { + const dom = createDOM({ + settings: { autoCollect: false, allowParams: "foo" }, + }); + + dom.window.sa_pageview("/manual?foo=bar"); + + setTimeout(() => { + const req = dom.sent.find( + (r) => r.type === "image" && /path=%2Fmanual/.test(r.url) + ); + expect(req, "pageview request").to.exist; + const url = new URL(req.url); + expect(url.searchParams.get("query")).to.equal("foo=bar"); + done(); + }, 10); + }); +}); From 8ed378618c1a9ebf1b14f5fa729926f6c3bc7fad Mon Sep 17 00:00:00 2001 From: Adriaan <1079135+adriaandotcom@users.noreply.github.com> Date: Fri, 13 Jun 2025 16:10:23 +0200 Subject: [PATCH 37/62] test: add metadata collector attr test --- dist/latest/auto-events.js | 2 +- dist/latest/latest.dev.js | 5 ++--- test/unit/metadata-attr.test.js | 33 +++++++++++++++++++++++++++++++++ 3 files changed, 36 insertions(+), 4 deletions(-) create mode 100644 test/unit/metadata-attr.test.js diff --git a/dist/latest/auto-events.js b/dist/latest/auto-events.js index 7575a1ef..df8e3ecf 100644 --- a/dist/latest/auto-events.js +++ b/dist/latest/auto-events.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2025-05-29; 7048; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2025-06-04; 7048; v12) */ function r(t,e){var a,n;t.hasAttribute("data-simple-event")||(a=!1,h.downloads&&/^https?:\/\//i.test(t.href)&&new RegExp("\\.("+(h.downloadsExtensions||[]).join("|")+")$","i").test(t.pathname)?a="download":h.outbound&&/^https?:\/\//i.test(t.href)&&t.hostname!==m.location.hostname?a="outbound":h.emails&&/^mailto:/i.test(t.href)&&(a="email"),a&&(e?(n="saAutomatedLink(this, '"+a+"');",t.hasAttribute("target")&&"_self"!==t.getAttribute("target")||(n+=" return false;"),t.setAttribute("onclick",n)):t.addEventListener("click",function(){g(t,a)})))}function e(){try{for(var t=document.getElementsByTagName("a"),e=0;e { + const req = dom.sent.find( + (r) => r.type === "image" && /path=%2Fattr/.test(r.url) + ); + expect(req, "pageview request").to.exist; + const url = new URL(req.url); + const meta = JSON.parse( + decodeURIComponent(url.searchParams.get("metadata")) + ); + expect(meta).to.include({ fromAttr: true }); + done(); + }, 10); + }); +}); From 571b372eb2e57d50a13dba19a23ad5c1feb7e12d Mon Sep 17 00:00:00 2001 From: Adriaan van Rossum <1079135+adriaanvanrossum@users.noreply.github.com> Date: Fri, 13 Jun 2025 16:11:44 +0200 Subject: [PATCH 38/62] Run npm run build --- dist/latest/auto-events.js | 2 +- dist/latest/cloudflare.js | 90 +++++++++++++++++++-------- dist/latest/custom/app.js | 4 +- dist/latest/custom/app.js.map | 2 +- dist/latest/custom/auto-events.js | 4 +- dist/latest/custom/auto-events.js.map | 2 +- dist/latest/custom/e.js | 4 +- dist/latest/custom/e.js.map | 2 +- dist/latest/custom/latest.dev.js | 90 +++++++++++++++++++-------- dist/latest/custom/latest.js | 4 +- dist/latest/custom/latest.js.map | 2 +- dist/latest/custom/light.js | 4 +- dist/latest/custom/light.js.map | 2 +- dist/latest/custom/proxy.js | 4 +- dist/latest/custom/proxy.js.map | 2 +- dist/latest/hello.js | 4 +- dist/latest/hello.js.map | 2 +- dist/latest/latest.dev.js | 2 +- dist/latest/latest.js | 4 +- dist/latest/latest.js.map | 2 +- dist/latest/light.js | 4 +- dist/latest/light.js.map | 2 +- dist/v12/app.js | 4 +- dist/v12/app.js.map | 2 +- dist/v12/auto-events.js | 4 +- dist/v12/auto-events.js.map | 2 +- dist/v12/custom/app.js | 4 +- dist/v12/custom/app.js.map | 2 +- dist/v12/custom/auto-events.js | 4 +- dist/v12/custom/auto-events.js.map | 2 +- dist/v12/custom/light.js | 4 +- dist/v12/custom/light.js.map | 2 +- dist/v12/custom/proxy.js | 4 +- dist/v12/custom/proxy.js.map | 2 +- dist/v12/light.js | 4 +- dist/v12/light.js.map | 2 +- 36 files changed, 176 insertions(+), 104 deletions(-) diff --git a/dist/latest/auto-events.js b/dist/latest/auto-events.js index 703dc2ad..ad6fe1f0 100644 --- a/dist/latest/auto-events.js +++ b/dist/latest/auto-events.js @@ -1,4 +1,4 @@ - +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2025-06-13; 7048; v12) */ function r(t,e){var a,n;t.hasAttribute("data-simple-event")||(a=!1,h.downloads&&/^https?:\/\//i.test(t.href)&&new RegExp("\\.("+(h.downloadsExtensions||[]).join("|")+")$","i").test(t.pathname)?a="download":h.outbound&&/^https?:\/\//i.test(t.href)&&t.hostname!==m.location.hostname?a="outbound":h.emails&&/^mailto:/i.test(t.href)&&(a="email"),a&&(e?(n="saAutomatedLink(this, '"+a+"');",t.hasAttribute("target")&&"_self"!==t.getAttribute("target")||(n+=" return false;"),t.setAttribute("onclick",n)):t.addEventListener("click",function(){g(t,a)})))}function e(){try{for(var t=document.getElementsByTagName("a"),e=0;e -1) { + // keep query from manual path + var parts = pathOverwrite.split("?"); + pathOverwrite = parts.shift(); + querySearch = "?" + parts.join("?"); + } // Obfuscate personal data in URL by dropping the search and hash var path = getPath(pathOverwrite); @@ -738,7 +767,10 @@ : falseVar; // We set unique variable based on pushstate or back navigation, if no match we check the referrer - page.unique = isPushState || userNavigated ? falseVar : !sameSite; + page.unique = + /__cf_/.test(getReferrer()) || isPushState || userNavigated + ? falseVar + : !sameSite; metadata = appendMetadata(metadata, { type: pageviewText, @@ -747,11 +779,15 @@ var triggerSendPageView = function () { fetchedHighEntropyValues = trueVar; + var delSrc = + isPushState || userNavigated || !collectMetricByString("r"); sendPageView( isPushState, - isPushState || userNavigated || !collectMetricByString("r"), // r = referrers + delSrc, // r = referrers sameSite, - metadata + querySearch ? getQueryParams(delSrc, querySearch) : undefinedVar, + metadata, + callback ); }; @@ -841,11 +877,11 @@ } if (autoCollect) pageview(); - else { - window.sa_pageview = function (path, metadata) { - pageview(0, path, metadata); - }; - } + + window.sa_pageview = function (path, metadata, callback) { + pageview(0, path, metadata, callback); + }; + ///////////////////// // EVENTS @@ -938,6 +974,6 @@ {"hostname":INSTALL_OPTIONS.hostname,"collectDnt":typeof INSTALL_OPTIONS.collect_dnt === 'boolean' ? INSTALL_OPTIONS.collect_dnt : null,"mode":INSTALL_OPTIONS.hash_mode ? 'hash' : 'normal',"strictUtm":INSTALL_OPTIONS.advanced_settings_toggle && INSTALL_OPTIONS.strict_utm,"allowParams":INSTALL_OPTIONS.advanced_settings_toggle && INSTALL_OPTIONS.allow_url_parameters,"nonUniqueHostnames":INSTALL_OPTIONS.advanced_settings_toggle && INSTALL_OPTIONS.non_unique_hostnames,"ignorePages":INSTALL_OPTIONS.advanced_settings_toggle && INSTALL_OPTIONS.ignore_pages,"namespace":INSTALL_OPTIONS.overwrite_namespace && INSTALL_OPTIONS.namespace}, INSTALL_OPTIONS.custom_domain || "queue.simpleanalyticscdn.com", "", - "cloudflare_11", + "cloudflare_12", "sa" ); diff --git a/dist/latest/custom/app.js b/dist/latest/custom/app.js index a3febd38..fe32c83b 100644 --- a/dist/latest/custom/app.js +++ b/dist/latest/custom/app.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy friendly analytics (docs.simpleanalytics.com/script; 2023-05-03; 527b; v11) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2025-06-13; f958; v12) */ -!function(l,t,e,n,p){try{var h=undefined,f=!0,d=!1,r="true",a="https:",m="pageview",u="event",i="error",o=l.console,c="doNotTrack",g=l.navigator,s=l.location,v=s.host,y=l.document,_=g.userAgent,w="Not sending request ",b=w+"when ",E=d,O=encodeURIComponent,x=decodeURIComponent,S=JSON.stringify,M=l.addEventListener,k="https://"+e,A=y.documentElement||{},q="language",$="Height",j="scroll",D=g.userAgentData,C=j+$,H="offset"+$,R="client"+$,P="pagehide",T="platform",U="platformVersion",I="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(_)&&!/(cubot)/i.test(_),N=l.screen,z=y.currentScript||y.querySelector('script[src*="'+e+'"]');p=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){p("Error in your "+t+" function:",e)},W=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},G=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},J=function(t,e){return t&&t.getAttribute("data-"+e)},L=function(t){return Array.isArray(t)?t:"string"==typeof t&&t.length?t.split(/, ?/):[]},Y=function(t){return t&&t.constructor===Object},Z=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},rt=function(t){return"function"==typeof t},at="namespace",it=t[at]||J(z,at)||"sa",ot=l[it+"_metadata"],ct=function(t,e){Y(ot)&&(t=Z(t,ot));var n=l[Mt];if(!rt(n))return t;try{return Z(t,n.call(l,Z(t,e)))}catch(r){F("metadata",r)}},st=t.strictUtm||J(z,"strict-utm")==r,ut=function(a){return s.search.slice(1).split("&").filter(function(t){var e=a||!tt("ut"),n=Ot.map(G).join("|"),r=e?"^("+n+")=":"^((utm_)"+(st?"":"?")+"(source|medium|content|term|campaign)"+(st?"":"|ref")+"|"+n+")=";return e&&!Ot.length?d:new RegExp(r).test(t)}).join("&")||h},lt=it+"_loaded";if(l[lt]==f)return p(w+"twice");l.sa_event_loaded=f,l[lt]=f;var pt=function(e,t,n){e=n?e:Z(qt,Dt,e),g.brave&&!n&&(e.brave=f),g._duckduckgoloader_&&!n&&(e.duck=f);var r=new Image;t&&(r.onerror=t,r.onload=t),r.src=k+"/simple.gif?"+Object.keys(e).filter(function(t){return e[t]!=h}).map(function(t){return O(t)+"="+O(e[t])}).join("&")+"&time="+Date.now()},ht=t.hostname||J(z,"hostname"),ft=ht||v,dt={version:"custom_app_11",hostname:ft};n=function(t){t=t.stack?t+" "+t.stack:t,p(t),pt(Z(dt,{type:i,error:t,path:s.pathname}),h,f)},M(i,function(t){t.filename&&-1"); +!function(d,t,e,n,m){try{var g=undefined,v=!0,y=!1,r="true",a="https:",_="pageview",u="event",i="error",o=d.console,c="doNotTrack",w=d.navigator,s=d.location,b=s.host,l=d.document,p=w.userAgent,f="Not sending request ",h=f+"when ",O=y,E=encodeURIComponent,x=decodeURIComponent,S=JSON.stringify,M=d.addEventListener,k="https://"+e,A=l.documentElement||{},q="language",$="Height",j="scroll",D=w.userAgentData,C=j+$,H="offset"+$,R="client"+$,P="pagehide",T="platform",U="platformVersion",I="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),N=d.screen,z=l.currentScript||l.querySelector('script[src*="'+e+'"]');m=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){m("Error in your "+t+" function:",e)},W=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},G=function(t){return"string"==typeof t},J=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},L=function(t,e){return t&&t.getAttribute("data-"+e)},Y=function(t){return Array.isArray(t)?t:G(t)&&t.length?t.split(/, ?/):[]},Z=function(t){return t&&t.constructor===Object},K=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},at=function(t){return"function"==typeof t},it="namespace",ot=t[it]||L(z,it)||"sa",ct=function(t,e){var n=d[ot+"_metadata"];Z(n)&&(t=K(t,n));var r=d[Mt];if(!at(r))return t;try{return K(t,r.call(d,K(t,e)))}catch(a){F("metadata",a)}},st=t.strictUtm||L(z,"strict-utm")==r,ut=function(a,t){return(t||s.search).slice(1).split("&").filter(function(t){var e=a||!et("ut"),n=Et.map(J).join("|"),r=e?"^("+n+")=":"^((utm_)"+(st?"":"?")+"(source|medium|content|term|campaign)"+(st?"":"|ref")+"|"+n+")=";return e&&!Et.length?y:new RegExp(r).test(t)}).join("&")||g},lt=ot+"_loaded";if(d[lt]==v)return m(f+"twice");d.sa_event_loaded=v,d[lt]=v;var pt=function(e,t,n){e=n?e:K($t,Ct,e),w.brave&&!n&&(e.brave=v),w._duckduckgoloader_&&!n&&(e.duck=v);var r=new Image;t&&(r.onerror=t,r.onload=t),r.src=k+"/simple.gif?"+Object.keys(e).filter(function(t){return e[t]!=g}).map(function(t){return E(t)+"="+E(e[t])}).join("&")+"&time="+Date.now()},ft=t.hostname||L(z,"hostname"),ht=ft||b,dt={version:"custom_app_12",hostname:ht};n=function(t){t=t.stack?t+" "+t.stack:t,m(t),pt(K(dt,{type:i,error:t,path:s.pathname}),g,v)},M(i,function(t){t.filename&&-1"); //# sourceMappingURL=app.js.map \ No newline at end of file diff --git a/dist/latest/custom/app.js.map b/dist/latest/custom/app.js.map index ea3f10aa..ec0c0c9b 100644 --- a/dist/latest/custom/app.js.map +++ b/dist/latest/custom/app.js.map @@ -1 +1 @@ -{"version":3,"file":"app.source.js","sources":["app.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var metadataObject = window[namespace + \"_metadata\"];\n var appendMetadata = function (metadata, data) {\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) return metadata;\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var getQueryParams = function (ignoreSource) {\n return (\n loc.search\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex).test(keyValue);\n })\n .join(\"&\") || undefinedVar\n );\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n window.phantom ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n return (\n (doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n nav.sendBeacon(fullApiUrl + \"/append\", stringify(append));\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n metadata\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n\n sendData({\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: getQueryParams(deleteSourceInfo),\n\n metadata: stringify(metadata),\n });\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (isPushState, pathOverwrite, metadata) {\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique = isPushState || userNavigated ? falseVar : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n sendPageView(\n isPushState,\n isPushState || userNavigated || !collectMetricByString(\"r\"), // r = referrers\n sameSite,\n metadata\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n else {\n window.sa_pageview = function (path, metadata) {\n pageview(0, path, metadata);\n };\n }\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_app_11\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","metadataObject","appendMetadata","metadata","data","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","search","keyValue","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","indexOf","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","bot","webdriver","__nightmare","callPhantom","_phantom","phantom","__polypane","_bot","collectDataOnLeave","ua","protocol","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","i","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","e","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","callbackRaw","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue","q"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"app.source.js","sources":["app.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) return metadata;\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n return (\n (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex).test(keyValue);\n })\n .join(\"&\") || undefinedVar\n );\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n query,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query || getQueryParams(deleteSourceInfo),\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch ? getQueryParams(delSrc, querySearch) : undefinedVar,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_app_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","search","keyValue","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","indexOf","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","protocol","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","i","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","query","currentPage","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue","q"],"mappings":"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"} \ No newline at end of file diff --git a/dist/latest/custom/auto-events.js b/dist/latest/custom/auto-events.js index df23dcae..ad6fe1f0 100644 --- a/dist/latest/custom/auto-events.js +++ b/dist/latest/custom/auto-events.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy friendly analytics (docs.simpleanalytics.com/script; 2023-05-03; 19c1; v11) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2025-06-13; 7048; v12) */ -function r(t,e){var a,o=!1;h.downloads&&/^https?:\/\//i.test(t.href)&&new RegExp("\\.("+(h.downloadsExtensions||[]).join("|")+")$","i").test(t.pathname)?o="download":h.outbound&&/^https?:\/\//i.test(t.href)&&t.hostname!==m.location.hostname?o="outbound":h.emails&&/^mailto:/i.test(t.href)&&(o="email"),o&&(e?(a="saAutomatedLink(this, '"+o+"');",t.hasAttribute("target")&&"_self"!==t.getAttribute("target")||(a+=" return false;"),t.setAttribute("onclick",a)):t.addEventListener("click",function(t){saAutomatedLink(t.target,o)}))}function e(){try{for(var t=document.getElementsByTagName("a"),e=0;e -1,\n emails: collectTypes.indexOf(\"emails\") > -1,\n downloads: collectTypes.indexOf(\"downloads\") > -1,\n // Downloads: enter file extensions you want to collect\n downloadsExtensions: setting(\"extensions\", \"array\", [\n \"pdf\",\n \"csv\",\n \"docx\",\n \"xlsx\",\n \"zip\",\n \"doc\",\n \"xls\",\n ]),\n\n // All: use title attribute if set for event name (for all events)\n // THIS TAKES PRECEDENCE OVER OTHER SETTINGS BELOW\n title: setting(\"useTitle\", \"bool\", true),\n // Outbound: use full URL of the links? false for just the hostname\n outboundFullUrl: fullUrls,\n // Downloads: if taking event name from URL, use full URL or just filename (default)\n downloadsFullUrl: fullUrls,\n };\n\n var saGlobal = setting(\"saGlobal\", \"string\", \"sa_event\");\n\n // For compiling the script\n var optionsLink = options;\n\n if (typeof optionsLink === \"undefined\")\n log(\"options object not found, please specify\", \"warn\");\n\n window.saAutomatedLink = function saAutomatedLink(element, type) {\n try {\n if (!element) return log(\"no element found\");\n var sent = false;\n\n var callback = function () {\n if (!sent && !element.hasAttribute(\"target\"))\n document.location = element.getAttribute(\"href\");\n sent = true;\n };\n\n if (window[saGlobal] && window[saGlobal + \"_loaded\"]) {\n var hostname = element.hostname;\n var pathname = element.pathname;\n\n var event;\n var metadata = {\n title: element.getAttribute(\"title\") || undefined,\n };\n var url = element.href || undefined;\n\n var useTitle = false;\n if (optionsLink.title && element.hasAttribute(\"title\")) {\n var theTitle = element.getAttribute(\"title\").trim();\n if (theTitle != \"\") useTitle = true;\n }\n\n if (useTitle) {\n event = theTitle;\n } else {\n switch (type) {\n case \"outbound\": {\n event = hostname + (optionsLink.outboundFullUrl ? pathname : \"\");\n metadata.url = url;\n break;\n }\n case \"download\": {\n event = optionsLink.downloadsFullUrl\n ? hostname + pathname\n : pathname.split(\"/\").pop();\n metadata.url = url;\n break;\n }\n case \"email\": {\n var href = element.getAttribute(\"href\");\n event = (href.split(\":\")[1] || \"\").split(\"?\")[0];\n metadata.email = event;\n break;\n }\n }\n }\n\n var clean =\n type +\n \"_\" +\n event.replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_+|_+$)/g, \"\");\n\n window[saGlobal](clean, metadata, callback);\n\n log(\"collected \" + clean);\n\n return type === \"email\"\n ? callback()\n : window.setTimeout(callback, 5000);\n } else {\n log(saGlobal + \" is not defined\", \"warn\");\n return callback();\n }\n } catch (error) {\n log(error.message, \"warn\");\n }\n };\n\n function collectLink(link, onclick) {\n var collect = false;\n\n // Collect download clicks\n if (\n optionsLink.downloads &&\n /^https?:\\/\\//i.test(link.href) &&\n new RegExp(\n \"\\\\.(\" + (optionsLink.downloadsExtensions || []).join(\"|\") + \")$\",\n \"i\"\n ).test(link.pathname)\n ) {\n collect = \"download\";\n\n // Collect outbound links clicks\n } else if (\n optionsLink.outbound &&\n /^https?:\\/\\//i.test(link.href) &&\n link.hostname !== window.location.hostname\n ) {\n collect = \"outbound\";\n\n // Collect email clicks\n } else if (optionsLink.emails && /^mailto:/i.test(link.href)) {\n collect = \"email\";\n }\n\n if (!collect) return;\n\n if (onclick) {\n var onClickAttribute = \"saAutomatedLink(this, '\" + collect + \"');\";\n\n if (\n !link.hasAttribute(\"target\") ||\n link.getAttribute(\"target\") === \"_self\"\n )\n onClickAttribute += \" return false;\";\n\n link.setAttribute(\"onclick\", onClickAttribute);\n } else {\n link.addEventListener(\"click\", function (element) {\n saAutomatedLink(element.target, collect);\n });\n }\n }\n\n function onDOMContentLoaded() {\n try {\n var a = document.getElementsByTagName(\"a\");\n\n // Loop over all links on the page\n for (var i = 0; i < a.length; i++) {\n var link = a[i];\n var href = link.getAttribute(\"href\");\n\n // Skip links that don't have an href\n if (!href) continue;\n\n // We don't want to overwrite website behaviour so we check for the onclick attribute\n if (!link.getAttribute(\"onclick\") && !/^mailto:/.test(href)) {\n collectLink(link, true);\n } else {\n collectLink(link, false);\n }\n }\n } catch (error) {\n log(error.message, \"warn\");\n }\n }\n\n if (doc.readyState === \"ready\" || doc.readyState === \"complete\") {\n onDOMContentLoaded();\n } else {\n document.addEventListener(\"readystatechange\", function (event) {\n if (event.target.readyState === \"complete\") onDOMContentLoaded();\n });\n }\n})(window);\n"],"names":["collectLink","link","onclick","onClickAttribute","collect","optionsLink","downloads","test","href","RegExp","downloadsExtensions","join","pathname","outbound","hostname","window","location","emails","hasAttribute","getAttribute","setAttribute","addEventListener","element","saAutomatedLink","target","onDOMContentLoaded","a","document","getElementsByTagName","i","length","error","log","message","doc","scriptElement","setting","collectTypes","fullUrls","options","saGlobal","type","logger","console","warn","info","currentScript","querySelector","attribute","defaultValue","value","dataset","split","map","item","trim","filter","Boolean","indexOf","title","outboundFullUrl","downloadsFullUrl","sent","callback","theTitle","metadata","undefined","url","useTitle","event","pop","email","clean","replace","setTimeout","readyState"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"auto-events.source.js","sources":["auto-events.source.js"],"sourcesContent":["(function saAutomatedEvents(window) {\n // Skip server side rendered pages\n if (typeof window === \"undefined\") return;\n\n var log = function (message, type) {\n var logger = type === \"warn\" ? console.warn : console.info;\n return logger && logger(\"Simple Analytics auto events:\", message);\n };\n\n var doc = window.document;\n\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"auto-events.js\"]');\n\n var setting = function (attribute, type, defaultValue) {\n var value = scriptElement && scriptElement.dataset[attribute];\n\n // Booleans\n if (type === \"bool\" && (value === \"true\" || value === \"false\"))\n return value === \"true\";\n else if (type === \"bool\") return defaultValue;\n\n // Arrays\n if (type === \"array\" && value)\n return value\n .split(\",\")\n .map(function (item) {\n return item.trim();\n })\n .filter(Boolean);\n else if (type === \"array\") return defaultValue;\n\n return value || defaultValue;\n };\n\n var collectTypes = setting(\"collect\", \"array\", [\n \"outbound\",\n \"emails\",\n \"downloads\",\n ]);\n var fullUrls = setting(\"fullUrls\", \"bool\", false);\n\n var options = {\n // What to collect\n outbound: collectTypes.indexOf(\"outbound\") > -1,\n emails: collectTypes.indexOf(\"emails\") > -1,\n downloads: collectTypes.indexOf(\"downloads\") > -1,\n // Downloads: enter file extensions you want to collect\n downloadsExtensions: setting(\"extensions\", \"array\", [\n \"pdf\",\n \"csv\",\n \"docx\",\n \"xlsx\",\n \"zip\",\n \"doc\",\n \"xls\",\n ]),\n\n // All: use title attribute if set for event name (for all events)\n // THIS TAKES PRECEDENCE OVER OTHER SETTINGS BELOW\n title: setting(\"useTitle\", \"bool\", true),\n // Outbound: use full URL of the links? false for just the hostname\n outboundFullUrl: fullUrls,\n // Downloads: if taking event name from URL, use full URL or just filename (default)\n downloadsFullUrl: fullUrls,\n };\n\n var saGlobal = setting(\"saGlobal\", \"string\", \"sa_event\");\n\n // For compiling the script\n var optionsLink = options;\n\n if (typeof optionsLink === \"undefined\")\n log(\"options object not found, please specify\", \"warn\");\n\n var saAutomatedLink = function saAutomatedLink(element, type) {\n try {\n if (!element) return log(\"no element found\");\n var sent = false;\n\n var callback = function () {\n if (!sent && !element.hasAttribute(\"target\"))\n document.location = element.getAttribute(\"href\");\n sent = true;\n };\n\n if (window[saGlobal] && window[saGlobal + \"_loaded\"]) {\n var hostname = element.hostname;\n var pathname = element.pathname;\n\n var event;\n var metadata = {\n title: element.getAttribute(\"title\") || undefined,\n };\n var url = element.href || undefined;\n\n var useTitle = false;\n if (optionsLink.title && element.hasAttribute(\"title\")) {\n var theTitle = element.getAttribute(\"title\").trim();\n if (theTitle != \"\") useTitle = true;\n }\n\n if (useTitle) {\n event = theTitle;\n } else {\n switch (type) {\n case \"outbound\": {\n event = hostname + (optionsLink.outboundFullUrl ? pathname : \"\");\n metadata.url = url;\n break;\n }\n case \"download\": {\n event = optionsLink.downloadsFullUrl\n ? hostname + pathname\n : pathname.split(\"/\").pop();\n metadata.url = url;\n break;\n }\n case \"email\": {\n var href = element.getAttribute(\"href\");\n event = (href.split(\":\")[1] || \"\").split(\"?\")[0];\n metadata.email = event;\n break;\n }\n }\n }\n\n var clean =\n type +\n \"_\" +\n event.replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_+|_+$)/g, \"\");\n\n window[saGlobal](clean, metadata, callback);\n\n log(\"collected \" + clean);\n\n return type === \"email\"\n ? callback()\n : window.setTimeout(callback, 5000);\n } else {\n log(saGlobal + \" is not defined\", \"warn\");\n return callback();\n }\n } catch (error) {\n log(error.message, \"warn\");\n }\n };\n\n window.saAutomatedLink = saAutomatedLink;\n\n function collectLink(link, onclick) {\n if (link.hasAttribute(\"data-simple-event\")) return;\n var collect = false;\n\n // Collect download clicks\n if (\n optionsLink.downloads &&\n /^https?:\\/\\//i.test(link.href) &&\n new RegExp(\n \"\\\\.(\" + (optionsLink.downloadsExtensions || []).join(\"|\") + \")$\",\n \"i\"\n ).test(link.pathname)\n ) {\n collect = \"download\";\n\n // Collect outbound links clicks\n } else if (\n optionsLink.outbound &&\n /^https?:\\/\\//i.test(link.href) &&\n link.hostname !== window.location.hostname\n ) {\n collect = \"outbound\";\n\n // Collect email clicks\n } else if (optionsLink.emails && /^mailto:/i.test(link.href)) {\n collect = \"email\";\n }\n\n if (!collect) return;\n\n if (onclick) {\n var onClickAttribute = \"saAutomatedLink(this, '\" + collect + \"');\";\n\n if (\n !link.hasAttribute(\"target\") ||\n link.getAttribute(\"target\") === \"_self\"\n )\n onClickAttribute += \" return false;\";\n\n link.setAttribute(\"onclick\", onClickAttribute);\n } else {\n link.addEventListener(\"click\", function () {\n saAutomatedLink(link, collect);\n });\n }\n }\n\n function onDOMContentLoaded() {\n try {\n var a = document.getElementsByTagName(\"a\");\n\n // Loop over all links on the page\n for (var i = 0; i < a.length; i++) {\n var link = a[i];\n var href = link.getAttribute(\"href\");\n\n // Skip links that don't have an href\n if (!href) continue;\n\n // We don't want to overwrite website behaviour so we check for the onclick attribute\n if (!link.getAttribute(\"onclick\") && !/^mailto:/.test(href)) {\n collectLink(link, true);\n } else {\n collectLink(link, false);\n }\n }\n } catch (error) {\n log(error.message, \"warn\");\n }\n }\n\n if (doc.readyState === \"ready\" || doc.readyState === \"complete\") {\n onDOMContentLoaded();\n } else {\n document.addEventListener(\"readystatechange\", function (event) {\n if (event.target.readyState === \"complete\") onDOMContentLoaded();\n });\n }\n})(window);\n"],"names":["collectLink","link","onclick","collect","onClickAttribute","hasAttribute","optionsLink","downloads","test","href","RegExp","downloadsExtensions","join","pathname","outbound","hostname","window","location","emails","getAttribute","setAttribute","addEventListener","saAutomatedLink","onDOMContentLoaded","a","document","getElementsByTagName","i","length","error","log","message","doc","scriptElement","setting","collectTypes","fullUrls","options","saGlobal","type","logger","console","warn","info","currentScript","querySelector","attribute","defaultValue","value","dataset","split","map","item","trim","filter","Boolean","indexOf","title","outboundFullUrl","downloadsFullUrl","element","sent","callback","theTitle","metadata","undefined","url","useTitle","event","pop","email","clean","replace","setTimeout","readyState","target"],"mappings":"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"} \ No newline at end of file diff --git a/dist/latest/custom/e.js b/dist/latest/custom/e.js index 2313f007..cf96e9f7 100644 --- a/dist/latest/custom/e.js +++ b/dist/latest/custom/e.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy friendly analytics (docs.simpleanalytics.com/script; 2023-05-03; e5db; v11) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2025-06-13; 2a6f; v12) */ -!function(l,t,e,n,p){try{var h=undefined,f=!0,d=!1,r="true",a="https:",m="pageview",u="event",i="error",o=l.console,c="doNotTrack",g=l.navigator,s=l.location,v=s.host,y=l.document,_=g.userAgent,w="Not sending request ",b=w+"when ",E=d,O=encodeURIComponent,x=decodeURIComponent,S=JSON.stringify,M=l.addEventListener,k="https://"+e,A=y.documentElement||{},q="language",$="Height",j="scroll",D=g.userAgentData,C=j+$,H="offset"+$,R="client"+$,P="pagehide",T="platform",U="platformVersion",I="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(_)&&!/(cubot)/i.test(_),N=l.screen,z=y.currentScript||y.querySelector('script[src*="'+e+'"]');p=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){p("Error in your "+t+" function:",e)},W=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},G=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},J=function(t,e){return t&&t.getAttribute("data-"+e)},L=function(t){return Array.isArray(t)?t:"string"==typeof t&&t.length?t.split(/, ?/):[]},Y=function(t){return t&&t.constructor===Object},Z=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},rt=function(t){return"function"==typeof t},at="namespace",it=t[at]||J(z,at)||"sa",ot=l[it+"_metadata"],ct=function(t,e){Y(ot)&&(t=Z(t,ot));var n=l[Mt];if(!rt(n))return t;try{return Z(t,n.call(l,Z(t,e)))}catch(r){F("metadata",r)}},st=t.strictUtm||J(z,"strict-utm")==r,ut=function(a){return s.search.slice(1).split("&").filter(function(t){var e=a||!tt("ut"),n=Ot.map(G).join("|"),r=e?"^("+n+")=":"^((utm_)"+(st?"":"?")+"(source|medium|content|term|campaign)"+(st?"":"|ref")+"|"+n+")=";return e&&!Ot.length?d:new RegExp(r).test(t)}).join("&")||h},lt=it+"_loaded";if(l[lt]==f)return p(w+"twice");l.sa_event_loaded=f,l[lt]=f;var pt=function(e,t,n){e=n?e:Z(qt,Dt,e),g.brave&&!n&&(e.brave=f),g._duckduckgoloader_&&!n&&(e.duck=f);var r=new Image;t&&(r.onerror=t,r.onload=t),r.src=k+"/simple.gif?"+Object.keys(e).filter(function(t){return e[t]!=h}).map(function(t){return O(t)+"="+O(e[t])}).join("&")+"&time="+Date.now()},ht=t.hostname||J(z,"hostname"),ft=ht||v,dt={version:"custom_events_11",hostname:ft};n=function(t){t=t.stack?t+" "+t.stack:t,p(t),pt(Z(dt,{type:i,error:t,path:s.pathname}),h,f)},M(i,function(t){t.filename&&-1"); +!function(d,t,e,n,m){try{var v=undefined,g=!0,y=!1,r="true",a="https:",_="pageview",u="event",i="error",o=d.console,c="doNotTrack",w=d.navigator,s=d.location,b=s.host,l=d.document,p=w.userAgent,f="Not sending request ",h=f+"when ",O=y,E=encodeURIComponent,x=decodeURIComponent,S=JSON.stringify,M=d.addEventListener,k="https://"+e,A=l.documentElement||{},q="language",$="Height",j="scroll",D=w.userAgentData,C=j+$,H="offset"+$,R="client"+$,P="pagehide",T="platform",U="platformVersion",I="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),N=d.screen,z=l.currentScript||l.querySelector('script[src*="'+e+'"]');m=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){m("Error in your "+t+" function:",e)},W=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},G=function(t){return"string"==typeof t},J=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},L=function(t,e){return t&&t.getAttribute("data-"+e)},Y=function(t){return Array.isArray(t)?t:G(t)&&t.length?t.split(/, ?/):[]},Z=function(t){return t&&t.constructor===Object},K=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},at=function(t){return"function"==typeof t},it="namespace",ot=t[it]||L(z,it)||"sa",ct=function(t,e){var n=d[ot+"_metadata"];Z(n)&&(t=K(t,n));var r=d[Mt];if(!at(r))return t;try{return K(t,r.call(d,K(t,e)))}catch(a){F("metadata",a)}},st=t.strictUtm||L(z,"strict-utm")==r,ut=function(a,t){return(t||s.search).slice(1).split("&").filter(function(t){var e=a||!et("ut"),n=Et.map(J).join("|"),r=e?"^("+n+")=":"^((utm_)"+(st?"":"?")+"(source|medium|content|term|campaign)"+(st?"":"|ref")+"|"+n+")=";return e&&!Et.length?y:new RegExp(r).test(t)}).join("&")||v},lt=ot+"_loaded";if(d[lt]==g)return m(f+"twice");d.sa_event_loaded=g,d[lt]=g;var pt=function(e,t,n){e=n?e:K($t,Ct,e),w.brave&&!n&&(e.brave=g),w._duckduckgoloader_&&!n&&(e.duck=g);var r=new Image;t&&(r.onerror=t,r.onload=t),r.src=k+"/simple.gif?"+Object.keys(e).filter(function(t){return e[t]!=v}).map(function(t){return E(t)+"="+E(e[t])}).join("&")+"&time="+Date.now()},ft=t.hostname||L(z,"hostname"),ht=ft||b,dt={version:"custom_events_12",hostname:ht};n=function(t){t=t.stack?t+" "+t.stack:t,m(t),pt(K(dt,{type:i,error:t,path:s.pathname}),v,g)},M(i,function(t){t.filename&&-1"); //# sourceMappingURL=e.js.map \ No newline at end of file diff --git a/dist/latest/custom/e.js.map b/dist/latest/custom/e.js.map index 3563f4bb..766a6866 100644 --- a/dist/latest/custom/e.js.map +++ b/dist/latest/custom/e.js.map @@ -1 +1 @@ -{"version":3,"file":"e.source.js","sources":["e.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var metadataObject = window[namespace + \"_metadata\"];\n var appendMetadata = function (metadata, data) {\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) return metadata;\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var getQueryParams = function (ignoreSource) {\n return (\n loc.search\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex).test(keyValue);\n })\n .join(\"&\") || undefinedVar\n );\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n window.phantom ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n return (\n (doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n nav.sendBeacon(fullApiUrl + \"/append\", stringify(append));\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n metadata\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n\n sendData({\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: getQueryParams(deleteSourceInfo),\n\n metadata: stringify(metadata),\n });\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (isPushState, pathOverwrite, metadata) {\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique = isPushState || userNavigated ? falseVar : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n sendPageView(\n isPushState,\n isPushState || userNavigated || !collectMetricByString(\"r\"), // r = referrers\n sameSite,\n metadata\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n else {\n window.sa_pageview = function (path, metadata) {\n pageview(0, path, metadata);\n };\n }\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_events_11\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","metadataObject","appendMetadata","metadata","data","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","search","keyValue","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","indexOf","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","bot","webdriver","__nightmare","callPhantom","_phantom","phantom","__polypane","_bot","collectDataOnLeave","ua","protocol","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","i","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","e","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","callbackRaw","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue","q"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"e.source.js","sources":["e.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) return metadata;\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n return (\n (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex).test(keyValue);\n })\n .join(\"&\") || undefinedVar\n );\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n query,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query || getQueryParams(deleteSourceInfo),\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch ? getQueryParams(delSrc, querySearch) : undefinedVar,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_events_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","search","keyValue","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","indexOf","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","protocol","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","i","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","query","currentPage","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue","q"],"mappings":"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"} \ No newline at end of file diff --git a/dist/latest/custom/latest.dev.js b/dist/latest/custom/latest.dev.js index 51d316c7..e961432d 100644 --- a/dist/latest/custom/latest.dev.js +++ b/dist/latest/custom/latest.dev.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy friendly analytics (docs.simpleanalytics.com/script; 2023-05-03; 761d; v11) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2025-06-13; 2f24; v12) */ /* eslint-env browser */ (function ( @@ -110,8 +110,8 @@ return Array.isArray(csv) ? csv : isString(csv) && csv.length - ? csv.split(/, ?/) - : []; + ? csv.split(/, ?/) + : []; }; var isObject = function (object) { @@ -191,8 +191,8 @@ attr(scriptElement, namespaceText) || defaultNamespace; - var metadataObject = window[namespace + "_metadata"]; var appendMetadata = function (metadata, data) { + var metadataObject = window[namespace + "_metadata"]; if (isObject(metadataObject)) metadata = assign(metadata, metadataObject); var metadataCollectorFunction = window[metadataCollector]; if (!isFunction(metadataCollectorFunction)) return metadata; @@ -216,9 +216,9 @@ overwriteOptions.strictUtm || attr(scriptElement, "strict-utm") == trueText; - var getQueryParams = function (ignoreSource) { + var getQueryParams = function (ignoreSource, overwriteSearch) { return ( - loc.search + (overwriteSearch || loc.search) .slice(1) .split("&") .filter(function (keyValue) { @@ -432,12 +432,13 @@ // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS // + var phantom = window.phantom; var bot = nav.webdriver || window.__nightmare || window.callPhantom || window._phantom || - window.phantom || + (phantom && !phantom.solana) || window.__polypane || window._bot || isBotAgent || @@ -512,8 +513,12 @@ var lastSendPath; var getReferrer = function () { + // Customers can overwrite their referrer, here we check for that + var overwrittenReferrer = + overwriteOptions.referrer || attr(scriptElement, "referrer"); + return ( - (doc.referrer || "") + (overwrittenReferrer || doc.referrer || "") .replace(locationHostname, definedHostname) .replace(/^https?:\/\/((m|l|w{2,3}([0-9]+)?)\.)?([^?#]+)(.*)$/, "$4") .replace(/^([^/]+)$/, "$1") || undefinedVar @@ -554,7 +559,12 @@ // sendData will assign payload to request sendData(append, undefinedVar, trueVar); } else { - nav.sendBeacon(fullApiUrl + "/append", stringify(append)); + try { + nav.sendBeacon.bind(nav)(fullApiUrl + "/append", stringify(append)); + } catch (e) { + // Fallback for browsers throwing "Illegal invocation" when the URL is invalid + sendData(append, undefinedVar, trueVar); + } } }; @@ -651,21 +661,26 @@ isPushState, deleteSourceInfo, sameSite, - metadata + query, + metadata, + callback ) { if (isPushState) sendOnLeave("" + payload.page_id, trueVar); if (collectDataOnLeave) payload.page_id = uuid(); var currentPage = definedHostname + getPath(); - sendData({ - id: payload.page_id, - type: pageviewText, - referrer: !deleteSourceInfo || sameSite ? referrer : null, - query: getQueryParams(deleteSourceInfo), + sendData( + { + id: payload.page_id, + type: pageviewText, + referrer: !deleteSourceInfo || sameSite ? referrer : null, + query: query || getQueryParams(deleteSourceInfo), - metadata: stringify(metadata), - }); + metadata: stringify(metadata), + }, + callback + ); previousReferrer = referrer; referrer = currentPage; @@ -675,7 +690,21 @@ var sameSite, userNavigated; - var pageview = function (isPushState, pathOverwrite, metadata) { + var pageview = function ( + isPushState, + pathOverwrite, + metadata, + callbackRaw + ) { + if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata; + var callback = isFunction(callbackRaw) ? callbackRaw : function () {}; + var querySearch; + if (isString(pathOverwrite) && pathOverwrite.indexOf("?") > -1) { + // keep query from manual path + var parts = pathOverwrite.split("?"); + pathOverwrite = parts.shift(); + querySearch = "?" + parts.join("?"); + } // Obfuscate personal data in URL by dropping the search and hash var path = getPath(pathOverwrite); @@ -738,7 +767,10 @@ : falseVar; // We set unique variable based on pushstate or back navigation, if no match we check the referrer - page.unique = isPushState || userNavigated ? falseVar : !sameSite; + page.unique = + /__cf_/.test(getReferrer()) || isPushState || userNavigated + ? falseVar + : !sameSite; metadata = appendMetadata(metadata, { type: pageviewText, @@ -747,11 +779,15 @@ var triggerSendPageView = function () { fetchedHighEntropyValues = trueVar; + var delSrc = + isPushState || userNavigated || !collectMetricByString("r"); sendPageView( isPushState, - isPushState || userNavigated || !collectMetricByString("r"), // r = referrers + delSrc, // r = referrers sameSite, - metadata + querySearch ? getQueryParams(delSrc, querySearch) : undefinedVar, + metadata, + callback ); }; @@ -841,11 +877,11 @@ } if (autoCollect) pageview(); - else { - window.sa_pageview = function (path, metadata) { - pageview(0, path, metadata); - }; - } + + window.sa_pageview = function (path, metadata, callback) { + pageview(0, path, metadata, callback); + }; + ///////////////////// // EVENTS @@ -938,6 +974,6 @@ {}, "", "", - "custom_latest_dev_11", + "custom_latest_dev_12", "sa" ); diff --git a/dist/latest/custom/latest.js b/dist/latest/custom/latest.js index 003984e2..41ceef76 100644 --- a/dist/latest/custom/latest.js +++ b/dist/latest/custom/latest.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy friendly analytics (docs.simpleanalytics.com/script; 2023-05-03; b8c6; v11) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2025-06-13; 11f1; v12) */ -!function(l,t,e,n,p){try{var h=undefined,f=!0,d=!1,r="true",a="https:",m="pageview",u="event",i="error",o=l.console,c="doNotTrack",g=l.navigator,s=l.location,v=s.host,y=l.document,_=g.userAgent,w="Not sending request ",b=w+"when ",E=d,O=encodeURIComponent,x=decodeURIComponent,S=JSON.stringify,M=l.addEventListener,k="https://"+e,A=y.documentElement||{},q="language",$="Height",j="scroll",D=g.userAgentData,C=j+$,H="offset"+$,R="client"+$,P="pagehide",T="platform",U="platformVersion",I="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(_)&&!/(cubot)/i.test(_),N=l.screen,z=y.currentScript||y.querySelector('script[src*="'+e+'"]');p=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){p("Error in your "+t+" function:",e)},W=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},G=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},J=function(t,e){return t&&t.getAttribute("data-"+e)},L=function(t){return Array.isArray(t)?t:"string"==typeof t&&t.length?t.split(/, ?/):[]},Y=function(t){return t&&t.constructor===Object},Z=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},rt=function(t){return"function"==typeof t},at="namespace",it=t[at]||J(z,at)||"sa",ot=l[it+"_metadata"],ct=function(t,e){Y(ot)&&(t=Z(t,ot));var n=l[Mt];if(!rt(n))return t;try{return Z(t,n.call(l,Z(t,e)))}catch(r){F("metadata",r)}},st=t.strictUtm||J(z,"strict-utm")==r,ut=function(a){return s.search.slice(1).split("&").filter(function(t){var e=a||!tt("ut"),n=Ot.map(G).join("|"),r=e?"^("+n+")=":"^((utm_)"+(st?"":"?")+"(source|medium|content|term|campaign)"+(st?"":"|ref")+"|"+n+")=";return e&&!Ot.length?d:new RegExp(r).test(t)}).join("&")||h},lt=it+"_loaded";if(l[lt]==f)return p(w+"twice");l.sa_event_loaded=f,l[lt]=f;var pt=function(e,t,n){e=n?e:Z(qt,Dt,e),g.brave&&!n&&(e.brave=f),g._duckduckgoloader_&&!n&&(e.duck=f);var r=new Image;t&&(r.onerror=t,r.onload=t),r.src=k+"/simple.gif?"+Object.keys(e).filter(function(t){return e[t]!=h}).map(function(t){return O(t)+"="+O(e[t])}).join("&")+"&time="+Date.now()},ht=t.hostname||J(z,"hostname"),ft=ht||v,dt={version:"custom_latest_11",hostname:ft};n=function(t){t=t.stack?t+" "+t.stack:t,p(t),pt(Z(dt,{type:i,error:t,path:s.pathname}),h,f)},M(i,function(t){t.filename&&-1"); +!function(d,t,e,n,m){try{var g=undefined,v=!0,y=!1,r="true",a="https:",_="pageview",u="event",i="error",o=d.console,c="doNotTrack",w=d.navigator,s=d.location,b=s.host,l=d.document,p=w.userAgent,f="Not sending request ",h=f+"when ",O=y,E=encodeURIComponent,x=decodeURIComponent,S=JSON.stringify,M=d.addEventListener,k="https://"+e,A=l.documentElement||{},q="language",$="Height",j="scroll",D=w.userAgentData,C=j+$,H="offset"+$,R="client"+$,P="pagehide",T="platform",U="platformVersion",I="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),N=d.screen,z=l.currentScript||l.querySelector('script[src*="'+e+'"]');m=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){m("Error in your "+t+" function:",e)},W=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},G=function(t){return"string"==typeof t},J=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},L=function(t,e){return t&&t.getAttribute("data-"+e)},Y=function(t){return Array.isArray(t)?t:G(t)&&t.length?t.split(/, ?/):[]},Z=function(t){return t&&t.constructor===Object},K=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},at=function(t){return"function"==typeof t},it="namespace",ot=t[it]||L(z,it)||"sa",ct=function(t,e){var n=d[ot+"_metadata"];Z(n)&&(t=K(t,n));var r=d[Mt];if(!at(r))return t;try{return K(t,r.call(d,K(t,e)))}catch(a){F("metadata",a)}},st=t.strictUtm||L(z,"strict-utm")==r,ut=function(a,t){return(t||s.search).slice(1).split("&").filter(function(t){var e=a||!et("ut"),n=Et.map(J).join("|"),r=e?"^("+n+")=":"^((utm_)"+(st?"":"?")+"(source|medium|content|term|campaign)"+(st?"":"|ref")+"|"+n+")=";return e&&!Et.length?y:new RegExp(r).test(t)}).join("&")||g},lt=ot+"_loaded";if(d[lt]==v)return m(f+"twice");d.sa_event_loaded=v,d[lt]=v;var pt=function(e,t,n){e=n?e:K($t,Ct,e),w.brave&&!n&&(e.brave=v),w._duckduckgoloader_&&!n&&(e.duck=v);var r=new Image;t&&(r.onerror=t,r.onload=t),r.src=k+"/simple.gif?"+Object.keys(e).filter(function(t){return e[t]!=g}).map(function(t){return E(t)+"="+E(e[t])}).join("&")+"&time="+Date.now()},ft=t.hostname||L(z,"hostname"),ht=ft||b,dt={version:"custom_latest_12",hostname:ht};n=function(t){t=t.stack?t+" "+t.stack:t,m(t),pt(K(dt,{type:i,error:t,path:s.pathname}),g,v)},M(i,function(t){t.filename&&-1"); //# sourceMappingURL=latest.js.map \ No newline at end of file diff --git a/dist/latest/custom/latest.js.map b/dist/latest/custom/latest.js.map index f5c01b23..e9767ce5 100644 --- a/dist/latest/custom/latest.js.map +++ b/dist/latest/custom/latest.js.map @@ -1 +1 @@ -{"version":3,"file":"latest.source.js","sources":["latest.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var metadataObject = window[namespace + \"_metadata\"];\n var appendMetadata = function (metadata, data) {\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) return metadata;\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var getQueryParams = function (ignoreSource) {\n return (\n loc.search\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex).test(keyValue);\n })\n .join(\"&\") || undefinedVar\n );\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n window.phantom ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n return (\n (doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n nav.sendBeacon(fullApiUrl + \"/append\", stringify(append));\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n metadata\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n\n sendData({\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: getQueryParams(deleteSourceInfo),\n\n metadata: stringify(metadata),\n });\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (isPushState, pathOverwrite, metadata) {\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique = isPushState || userNavigated ? falseVar : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n sendPageView(\n isPushState,\n isPushState || userNavigated || !collectMetricByString(\"r\"), // r = referrers\n sameSite,\n metadata\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n else {\n window.sa_pageview = function (path, metadata) {\n pageview(0, path, metadata);\n };\n }\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_latest_11\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","metadataObject","appendMetadata","metadata","data","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","search","keyValue","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","indexOf","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","bot","webdriver","__nightmare","callPhantom","_phantom","phantom","__polypane","_bot","collectDataOnLeave","ua","protocol","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","i","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","e","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","callbackRaw","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue","q"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"latest.source.js","sources":["latest.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) return metadata;\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n return (\n (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex).test(keyValue);\n })\n .join(\"&\") || undefinedVar\n );\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n query,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query || getQueryParams(deleteSourceInfo),\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch ? getQueryParams(delSrc, querySearch) : undefinedVar,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_latest_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","search","keyValue","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","indexOf","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","protocol","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","i","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","query","currentPage","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue","q"],"mappings":"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"} \ No newline at end of file diff --git a/dist/latest/custom/light.js b/dist/latest/custom/light.js index 20bf335c..b3a77933 100644 --- a/dist/latest/custom/light.js +++ b/dist/latest/custom/light.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy friendly analytics (docs.simpleanalytics.com/script; 2023-05-03; a797; v11) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2025-06-13; 971c; v12) */ -!function(s,e,t,u){try{var i=undefined,n="https:",r=s.console,a="doNotTrack",p=s.navigator,c=s.location,d=c.host,o=s.document,l=p.userAgent,m="Not sending request ",f=!1,g=encodeURIComponent,h=decodeURIComponent,v=JSON.stringify,y=s.addEventListener,_="https://"+t,w=(o.documentElement,"language"),b=p.userAgentData,O="platform",S="platformVersion",k="https://docs.simpleanalytics.com",j=/(bot|spider|crawl)/i.test(l)&&!/(cubot)/i.test(l),E=o.currentScript||o.querySelector('script[src*="'+t+'"]');u=function(){var e=[].slice.call(arguments);return e.unshift("Simple Analytics:"),Function.prototype.apply.call(r.warn,r,e)};var x=function(e,t){return e&&e.getAttribute("data-"+t)},A=function(){for(var e,t,n,r={},a=arguments,o=0;o>e/4).toString(16)})}catch(r){return e.replace(n,function(e){var t=16*Math.random()|0;return(e<2?t:3&t|8).toString(16)})}},I="namespace",N=e[I]||x(E,I)||"sa",R=e.strictUtm||"true"==x(E,"strict-utm"),U=N+"_loaded";if(1==s[U])return u(m+"twice");s.sa_event_loaded=!0,s[U]=!0;var V,B=function(t,e,n){t=n?t:A(F,J,t),p.brave&&!n&&(t.brave=!0),p._duckduckgoloader_&&!n&&(t.duck=!0),(new Image).src=_+"/simple.gif?"+Object.keys(t).filter(function(e){return t[e]!=i}).map(function(e){return g(e)+"="+g(t[e])}).join("&")+"&time="+Date.now()},C=e.hostname||x(E,"hostname"),H=C||d,T={version:"custom_light_11",hostname:H};e.mode||x(E,"mode");try{V=Intl.DateTimeFormat().resolvedOptions().timeZone}catch(Q){u(Q)}j&&(T.bot=!0);var F=A(T,{ua:l,https:c.protocol==n,timezone:V,page_id:D(),session_id:D()});if(F.sri=!1,b&&(F.mobile=b.mobile,F.brands=v(b.brands)),H!==d&&(F.hostname_original=d),a in p&&"1"==p[a])return u("Not sending request when "+a+" is enabled. See "+k+"/dnt");-1!=d.indexOf(".")&&!/^[0-9.:]+$/.test(d)||C||u("Set hostname on "+d+". See "+k+"/overwrite-domain-name");var z,J={},L=(o.referrer||"").replace(d,H).replace(/^https?:\/\/((m|l|w{2,3}([0-9]+)?)\.)?([^?#]+)(.*)$/,"$4").replace(/^([^/]+)$/,"$1")||i,M=function(e,t){var n=A(T,{type:"append",original_id:t?e:F.page_id});t||!p.sendBeacon?B(n,0,!0):p.sendBeacon(_+"/append",v(n))};y("pagehide",M,!1);var P,Z,G=function(e){var t="";try{t=e||h(c.pathname)}catch(Q){u(Q)}return t},K=function(e,t,n,r){e&&M(""+F.page_id,!0),F.page_id=D();var a,o=H+G();B({id:F.page_id,type:"pageview",referrer:!t||n?L:null,query:(a=t,c.search.slice(1).split("&").filter(function(e){return!a&&new RegExp("^((utm_)"+(R?"":"?")+"(source|medium|content|term|campaign)"+(R?"":"|ref")+")=").test(e)}).join("&")||i)}),L=o,0};!function(e,t){var n=G(t);if(n&&z!=n){z=n,J.path=n,p[w]&&(J[w]=p[w]);var r,a=s.performance,o="navigation";try{r=a.getEntriesByType(o)[0].type}catch(Q){u(Q)}Z=r?-1<["reload","back_forward"].indexOf(r):a&&a[o]&&-1<[1,2].indexOf(a[o].type),P=!!L&&L.split("/")[0]==d;var i=function(){f=!0,K(e,e||Z||!1,P)};if(f)i();else try{b&&"function"==typeof b.getHighEntropyValues?b.getHighEntropyValues([O,S]).then(function(e){F.os_name=e[O],F.os_version=e[S],i()})["catch"](i):i()}catch(c){i()}}}()}catch(W){u(W)}}(window,{},""); +!function(l,e,t,f){try{var m=undefined,n="https:",r=l.console,a="doNotTrack",g=l.navigator,i=l.location,h=i.host,o=l.document,c=g.userAgent,s="Not sending request ",v=!1,u=encodeURIComponent,p=decodeURIComponent,d=JSON.stringify,y=l.addEventListener,_="https://"+t,b=(o.documentElement,"language"),w=g.userAgentData,O="platform",S="platformVersion",j="https://docs.simpleanalytics.com",k=/(bot|spider|crawl)/i.test(c)&&!/(cubot)/i.test(c),x=o.currentScript||o.querySelector('script[src*="'+t+'"]');f=function(){var e=[].slice.call(arguments);return e.unshift("Simple Analytics:"),Function.prototype.apply.call(r.warn,r,e)};var E=function(e){return"string"==typeof e},A=function(e,t){return e&&e.getAttribute("data-"+t)},$=function(){for(var e,t,n,r={},a=arguments,i=0;i>e/4).toString(16)})}catch(r){return e.replace(n,function(e){var t=16*Math.random()|0;return(e<2?t:3&t|8).toString(16)})}},N=function(e){return"function"==typeof e},R="namespace",U=e[R]||A(x,R)||"sa",V=e.strictUtm||"true"==A(x,"strict-utm"),B=function(t,e){return(e||i.search).slice(1).split("&").filter(function(e){return!t&&new RegExp("^((utm_)"+(V?"":"?")+"(source|medium|content|term|campaign)"+(V?"":"|ref")+")=").test(e)}).join("&")||m},C=U+"_loaded";if(1==l[C])return f(s+"twice");l.sa_event_loaded=!0,l[C]=!0;var H,T=function(t,e,n){t=n?t:$(L,P,t),g.brave&&!n&&(t.brave=!0),g._duckduckgoloader_&&!n&&(t.duck=!0),(new Image).src=_+"/simple.gif?"+Object.keys(t).filter(function(e){return t[e]!=m}).map(function(e){return u(e)+"="+u(t[e])}).join("&")+"&time="+Date.now()},F=e.hostname||A(x,"hostname"),z=F||h,J={version:"custom_light_12",hostname:z};e.mode||A(x,"mode");try{H=Intl.DateTimeFormat().resolvedOptions().timeZone}catch(X){f(X)}k&&(J.bot=!0);var L=$(J,{ua:c,https:i.protocol==n,timezone:H,page_id:I(),session_id:I()});if(L.sri=!1,w&&(L.mobile=w.mobile,L.brands=d(w.brands)),z!==h&&(L.hostname_original=h),a in g&&"1"==g[a])return f("Not sending request when "+a+" is enabled. See "+j+"/dnt");-1!=h.indexOf(".")&&!/^[0-9.:]+$/.test(h)||F||f("Set hostname on "+h+". See "+j+"/overwrite-domain-name");var M,P={},Z=(e.referrer||A(x,"referrer")||o.referrer||"").replace(h,z).replace(/^https?:\/\/((m|l|w{2,3}([0-9]+)?)\.)?([^?#]+)(.*)$/,"$4").replace(/^([^/]+)$/,"$1")||m,G=function(e,t){var n=$(J,{type:"append",original_id:t?e:L.page_id});if(t||!g.sendBeacon)T(n,0,!0);else try{g.sendBeacon.bind(g)(_+"/append",d(n))}catch(r){T(n,0,!0)}};y("pagehide",G,!1);var K,Q,W=function(e){var t="";try{t=e||p(i.pathname)}catch(X){f(X)}return t};!function(t,e,n,r){!r&&N(n)&&(r=n);var a,i;N(r);E(e)&&-1"); //# sourceMappingURL=light.js.map \ No newline at end of file diff --git a/dist/latest/custom/light.js.map b/dist/latest/custom/light.js.map index b68cba95..825c7d38 100644 --- a/dist/latest/custom/light.js.map +++ b/dist/latest/custom/light.js.map @@ -1 +1 @@ -{"version":3,"file":"light.source.js","sources":["light.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n\n var collectMetricByString = function (metricAbbreviation) {\n return true;\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var getQueryParams = function (ignoreSource) {\n return (\n loc.search\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n if (ignore) return falseVar;\n var regex =\n \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \")=\";\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex).test(keyValue);\n })\n .join(\"&\") || undefinedVar\n );\n };\n\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n\n\n\n\n\n\n\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var bot = isBotAgent;\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n return (\n (doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n nav.sendBeacon(fullApiUrl + \"/append\", stringify(append));\n }\n };\n\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n\n\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n metadata\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n\n sendData({\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: getQueryParams(deleteSourceInfo),\n\n });\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (isPushState, pathOverwrite, metadata) {\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n sameSite = referrer\n ? referrer.split(slash)[0] == locationHostname\n : falseVar;\n\n\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n sendPageView(\n isPushState,\n isPushState || userNavigated || !collectMetricByString(\"r\"), // r = referrers\n sameSite,\n metadata\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n\n\n pageview();\n\n } catch (e) {\n warn(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_light_11\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","warn","undefinedVar","undefined","https","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","language","documentElement","uaData","userAgentData","platformText","platformVersionText","docsUrl","isBotAgent","test","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","attr","attribute","getAttribute","assign","obj","prop","object","to","arg","index","length","nextSource","constructor","Object","nextKey","hasOwnProperty","settings","sa_settings","logSettings","keys","Date","now","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","replace","c","getRandomValues","Uint8Array","toString","error","r","Math","random","namespaceText","namespace","strictUtm","loadedVariable","sa_event_loaded","timezone","sendData","data","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","Image","src","filter","key","map","join","overwrittenHostname","hostname","definedHostname","basePayload","version","mode","Intl","DateTimeFormat","resolvedOptions","timeZone","bot","ua","protocol","page_id","session_id","sri","mobile","brands","hostname_original","indexOf","lastSendPath","referrer","sendOnLeave","id","push","append","type","original_id","sendBeacon","sameSite","userNavigated","getPath","overwrite","path","pathname","sendPageView","isPushState","deleteSourceInfo","metadata","ignoreSource","currentPage","query","search","split","keyValue","RegExp","pages","pathOverwrite","performaceEntryType","perf","performance","navigationText","getEntriesByType","triggerSendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","e","pageview"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"light.source.js","sources":["light.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n\n var collectMetricByString = function (metricAbbreviation) {\n // eslint-disable-next-line no-unreachable\n return true;\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n return (\n (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n if (ignore) return falseVar;\n // eslint-disable-next-line no-redeclare\n var regex =\n \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \")=\";\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex).test(keyValue);\n })\n .join(\"&\") || undefinedVar\n );\n };\n\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n\n\n\n\n\n\n\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n // eslint-disable-next-line no-redeclare\n var bot = isBotAgent;\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n\n\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n query,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query || getQueryParams(deleteSourceInfo),\n\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n sameSite = referrer\n ? referrer.split(slash)[0] == locationHostname\n : falseVar;\n\n\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch ? getQueryParams(delSrc, querySearch) : undefinedVar,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n\n\n pageview();\n\n } catch (e) {\n warn(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_light_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","warn","undefinedVar","undefined","https","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","language","documentElement","uaData","userAgentData","platformText","platformVersionText","docsUrl","isBotAgent","test","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","isString","string","attr","attribute","getAttribute","assign","obj","prop","object","to","arg","index","length","nextSource","constructor","Object","nextKey","hasOwnProperty","settings","sa_settings","logSettings","keys","Date","now","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","replace","c","getRandomValues","Uint8Array","toString","error","r","Math","random","isFunction","func","namespaceText","namespace","strictUtm","getQueryParams","ignoreSource","overwriteSearch","search","split","filter","keyValue","RegExp","join","loadedVariable","sa_event_loaded","timezone","sendData","data","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","Image","src","key","map","overwrittenHostname","hostname","definedHostname","basePayload","version","mode","Intl","DateTimeFormat","resolvedOptions","timeZone","bot","ua","protocol","page_id","session_id","sri","mobile","brands","hostname_original","indexOf","lastSendPath","referrer","sendOnLeave","id","push","append","type","original_id","sendBeacon","bind","e","sameSite","userNavigated","getPath","overwrite","path","pathname","isPushState","pathOverwrite","metadata","callbackRaw","querySearch","parts","shift","performaceEntryType","perf","performance","navigationText","getEntriesByType","triggerSendPageView","delSrc","deleteSourceInfo","query","currentPage","pages","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","pageview"],"mappings":"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"} \ No newline at end of file diff --git a/dist/latest/custom/proxy.js b/dist/latest/custom/proxy.js index 3c4bf08d..425a1a94 100644 --- a/dist/latest/custom/proxy.js +++ b/dist/latest/custom/proxy.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy friendly analytics (docs.simpleanalytics.com/script; 2023-05-03; 9b4d; v11) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2025-06-13; 47e3; v12) */ -!function(l,t,e,n,p){try{var h=undefined,f=!0,d=!1,r="true",a="https:",m="pageview",u="event",i="error",o=l.console,c="doNotTrack",g=l.navigator,s=l.location,v=s.host,y=l.document,_=g.userAgent,w="Not sending request ",b=w+"when ",x=d,E=encodeURIComponent,O=decodeURIComponent,S=JSON.stringify,M=l.addEventListener,k="https://"+e,A=y.documentElement||{},q="language",$="Height",j="scroll",D=g.userAgentData,C=j+$,H="offset"+$,P="client"+$,R="pagehide",T="platform",U="platformVersion",I="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(_)&&!/(cubot)/i.test(_),N=l.screen,z=y.currentScript||y.querySelector('script[src*="'+e+'"]');p=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){p("Error in your "+t+" function:",e)},W=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},G=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},J=function(t,e){return t&&t.getAttribute("data-"+e)},L=function(t){return Array.isArray(t)?t:"string"==typeof t&&t.length?t.split(/, ?/):[]},Y=function(t){return t&&t.constructor===Object},Z=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},rt=function(t){return"function"==typeof t},at="namespace",it=t[at]||J(z,at)||"sa",ot=l[it+"_metadata"],ct=function(t,e){Y(ot)&&(t=Z(t,ot));var n=l[Mt];if(!rt(n))return t;try{return Z(t,n.call(l,Z(t,e)))}catch(r){F("metadata",r)}},st=t.strictUtm||J(z,"strict-utm")==r,ut=function(a){return s.search.slice(1).split("&").filter(function(t){var e=a||!tt("ut"),n=Et.map(G).join("|"),r=e?"^("+n+")=":"^((utm_)"+(st?"":"?")+"(source|medium|content|term|campaign)"+(st?"":"|ref")+"|"+n+")=";return e&&!Et.length?d:new RegExp(r).test(t)}).join("&")||h},lt=it+"_loaded";if(l[lt]==f)return p(w+"twice");l.sa_event_loaded=f,l[lt]=f;var pt=function(e,t,n){e=n?e:Z(qt,Dt,e),g.brave&&!n&&(e.brave=f),g._duckduckgoloader_&&!n&&(e.duck=f);var r=new Image;t&&(r.onerror=t,r.onload=t),r.src=k+"/simple.gif?"+Object.keys(e).filter(function(t){return e[t]!=h}).map(function(t){return E(t)+"="+E(e[t])}).join("&")+"&time="+Date.now()},ht=t.hostname||J(z,"hostname"),ft=ht||v,dt={version:"custom_proxy_11",hostname:ft};n=function(t){t=t.stack?t+" "+t.stack:t,p(t),pt(Z(dt,{type:i,error:t,path:s.pathname}),h,f)},M(i,function(t){t.filename&&-1"); +!function(d,t,e,n,m){try{var g=undefined,v=!0,y=!1,r="true",a="https:",_="pageview",u="event",i="error",o=d.console,c="doNotTrack",w=d.navigator,s=d.location,b=s.host,l=d.document,p=w.userAgent,f="Not sending request ",h=f+"when ",x=y,O=encodeURIComponent,E=decodeURIComponent,S=JSON.stringify,M=d.addEventListener,k="https://"+e,A=l.documentElement||{},q="language",$="Height",j="scroll",D=w.userAgentData,C=j+$,H="offset"+$,P="client"+$,R="pagehide",T="platform",U="platformVersion",I="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),N=d.screen,z=l.currentScript||l.querySelector('script[src*="'+e+'"]');m=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){m("Error in your "+t+" function:",e)},W=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},G=function(t){return"string"==typeof t},J=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},L=function(t,e){return t&&t.getAttribute("data-"+e)},Y=function(t){return Array.isArray(t)?t:G(t)&&t.length?t.split(/, ?/):[]},Z=function(t){return t&&t.constructor===Object},K=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},at=function(t){return"function"==typeof t},it="namespace",ot=t[it]||L(z,it)||"sa",ct=function(t,e){var n=d[ot+"_metadata"];Z(n)&&(t=K(t,n));var r=d[Mt];if(!at(r))return t;try{return K(t,r.call(d,K(t,e)))}catch(a){F("metadata",a)}},st=t.strictUtm||L(z,"strict-utm")==r,ut=function(a,t){return(t||s.search).slice(1).split("&").filter(function(t){var e=a||!et("ut"),n=Ot.map(J).join("|"),r=e?"^("+n+")=":"^((utm_)"+(st?"":"?")+"(source|medium|content|term|campaign)"+(st?"":"|ref")+"|"+n+")=";return e&&!Ot.length?y:new RegExp(r).test(t)}).join("&")||g},lt=ot+"_loaded";if(d[lt]==v)return m(f+"twice");d.sa_event_loaded=v,d[lt]=v;var pt=function(e,t,n){e=n?e:K($t,Ct,e),w.brave&&!n&&(e.brave=v),w._duckduckgoloader_&&!n&&(e.duck=v);var r=new Image;t&&(r.onerror=t,r.onload=t),r.src=k+"/simple.gif?"+Object.keys(e).filter(function(t){return e[t]!=g}).map(function(t){return O(t)+"="+O(e[t])}).join("&")+"&time="+Date.now()},ft=t.hostname||L(z,"hostname"),ht=ft||b,dt={version:"custom_proxy_12",hostname:ht};n=function(t){t=t.stack?t+" "+t.stack:t,m(t),pt(K(dt,{type:i,error:t,path:s.pathname}),g,v)},M(i,function(t){t.filename&&-1"); //# sourceMappingURL=proxy.js.map \ No newline at end of file diff --git a/dist/latest/custom/proxy.js.map b/dist/latest/custom/proxy.js.map index 88f16711..be577226 100644 --- a/dist/latest/custom/proxy.js.map +++ b/dist/latest/custom/proxy.js.map @@ -1 +1 @@ -{"version":3,"file":"proxy.source.js","sources":["proxy.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var metadataObject = window[namespace + \"_metadata\"];\n var appendMetadata = function (metadata, data) {\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) return metadata;\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var getQueryParams = function (ignoreSource) {\n return (\n loc.search\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex).test(keyValue);\n })\n .join(\"&\") || undefinedVar\n );\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n window.phantom ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n return (\n (doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n nav.sendBeacon(fullApiUrl + \"/append\", stringify(append));\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n metadata\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n\n sendData({\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: getQueryParams(deleteSourceInfo),\n\n metadata: stringify(metadata),\n });\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (isPushState, pathOverwrite, metadata) {\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique = isPushState || userNavigated ? falseVar : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n sendPageView(\n isPushState,\n isPushState || userNavigated || !collectMetricByString(\"r\"), // r = referrers\n sameSite,\n metadata\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n else {\n window.sa_pageview = function (path, metadata) {\n pageview(0, path, metadata);\n };\n }\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_proxy_11\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","metadataObject","appendMetadata","metadata","data","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","search","keyValue","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","indexOf","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","bot","webdriver","__nightmare","callPhantom","_phantom","phantom","__polypane","_bot","collectDataOnLeave","ua","protocol","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","i","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","e","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","callbackRaw","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue","q"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"proxy.source.js","sources":["proxy.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) return metadata;\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n return (\n (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex).test(keyValue);\n })\n .join(\"&\") || undefinedVar\n );\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n query,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query || getQueryParams(deleteSourceInfo),\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch ? getQueryParams(delSrc, querySearch) : undefinedVar,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_proxy_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","search","keyValue","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","indexOf","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","protocol","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","i","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","query","currentPage","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue","q"],"mappings":"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"} \ No newline at end of file diff --git a/dist/latest/hello.js b/dist/latest/hello.js index 289727ae..a7e48d06 100644 --- a/dist/latest/hello.js +++ b/dist/latest/hello.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy friendly analytics (docs.simpleanalytics.com/script; 2023-05-03; f60b) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2025-06-13; 82c5) */ -!function(l,t,e,n,p){try{var h=undefined,f=!0,d=!1,r="true",a="https:",m="pageview",u="event",i="error",o=l.console,c="doNotTrack",g=l.navigator,s=l.location,v=s.host,y=l.document,_=g.userAgent,w="Not sending request ",b=w+"when ",E=d,O=encodeURIComponent,x=decodeURIComponent,S=JSON.stringify,M=l.addEventListener,k="https://queue."+e,q=y.documentElement||{},A="language",$="Height",j="scroll",D=g.userAgentData,C=j+$,R="offset"+$,H="client"+$,P="pagehide",T="platform",U="platformVersion",I="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(_)&&!/(cubot)/i.test(_),N=l.screen,z=y.currentScript||y.querySelector('script[src*="'+e+'"]');p=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){p("Error in your "+t+" function:",e)},W=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},G=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},J=function(t,e){return t&&t.getAttribute("data-"+e)},L=function(t){return Array.isArray(t)?t:"string"==typeof t&&t.length?t.split(/, ?/):[]},Y=function(t){return t&&t.constructor===Object},Z=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},rt=function(t){return"function"==typeof t},at="namespace",it=t[at]||J(z,at)||"sa",ot=l[it+"_metadata"],ct=function(t,e){Y(ot)&&(t=Z(t,ot));var n=l[Mt];if(!rt(n))return t;try{return Z(t,n.call(l,Z(t,e)))}catch(r){F("metadata",r)}},st=t.strictUtm||J(z,"strict-utm")==r,ut=function(a){return s.search.slice(1).split("&").filter(function(t){var e=a||!tt("ut"),n=Ot.map(G).join("|"),r=e?"^("+n+")=":"^((utm_)"+(st?"":"?")+"(source|medium|content|term|campaign)"+(st?"":"|ref")+"|"+n+")=";return e&&!Ot.length?d:new RegExp(r).test(t)}).join("&")||h},lt=it+"_loaded";if(l[lt]==f)return p(w+"twice");l.sa_event_loaded=f,l[lt]=f;var pt=function(e,t,n){e=n?e:Z(At,Dt,e),g.brave&&!n&&(e.brave=f),g._duckduckgoloader_&&!n&&(e.duck=f);var r=new Image;t&&(r.onerror=t,r.onload=t),r.src=k+"/simple.gif?"+Object.keys(e).filter(function(t){return e[t]!=h}).map(function(t){return O(t)+"="+O(e[t])}).join("&")+"&time="+Date.now()},ht=t.hostname||J(z,"hostname"),ft=ht||v,dt={version:"cdn_hello_11",hostname:ft};n=function(t){t=t.stack?t+" "+t.stack:t,p(t),pt(Z(dt,{type:i,error:t,path:s.pathname}),h,f)},M(i,function(t){t.filename&&-1>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},at=function(t){return"function"==typeof t},it="namespace",ot=t[it]||L(z,it)||"sa",ct=function(t,e){var n=d[ot+"_metadata"];Z(n)&&(t=K(t,n));var r=d[Mt];if(!at(r))return t;try{return K(t,r.call(d,K(t,e)))}catch(a){F("metadata",a)}},st=t.strictUtm||L(z,"strict-utm")==r,ut=function(a,t){return(t||s.search).slice(1).split("&").filter(function(t){var e=a||!et("ut"),n=Et.map(J).join("|"),r=e?"^("+n+")=":"^((utm_)"+(st?"":"?")+"(source|medium|content|term|campaign)"+(st?"":"|ref")+"|"+n+")=";return e&&!Et.length?y:new RegExp(r).test(t)}).join("&")||v},lt=ot+"_loaded";if(d[lt]==g)return m(f+"twice");d.sa_event_loaded=g,d[lt]=g;var pt=function(e,t,n){e=n?e:K($t,Ct,e),w.brave&&!n&&(e.brave=g),w._duckduckgoloader_&&!n&&(e.duck=g);var r=new Image;t&&(r.onerror=t,r.onload=t),r.src=k+"/simple.gif?"+Object.keys(e).filter(function(t){return e[t]!=v}).map(function(t){return E(t)+"="+E(e[t])}).join("&")+"&time="+Date.now()},ft=t.hostname||L(z,"hostname"),ht=ft||b,dt={version:"cdn_hello_12",hostname:ht};n=function(t){t=t.stack?t+" "+t.stack:t,m(t),pt(K(dt,{type:i,error:t,path:s.pathname}),v,g)},M(i,function(t){t.filename&&-1> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var metadataObject = window[namespace + \"_metadata\"];\n var appendMetadata = function (metadata, data) {\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) return metadata;\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var getQueryParams = function (ignoreSource) {\n return (\n loc.search\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex).test(keyValue);\n })\n .join(\"&\") || undefinedVar\n );\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n window.phantom ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n return (\n (doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n nav.sendBeacon(fullApiUrl + \"/append\", stringify(append));\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n metadata\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n\n sendData({\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: getQueryParams(deleteSourceInfo),\n\n metadata: stringify(metadata),\n });\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (isPushState, pathOverwrite, metadata) {\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique = isPushState || userNavigated ? falseVar : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n sendPageView(\n isPushState,\n isPushState || userNavigated || !collectMetricByString(\"r\"), // r = referrers\n sameSite,\n metadata\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n else {\n window.sa_pageview = function (path, metadata) {\n pageview(0, path, metadata);\n };\n }\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"simpleanalyticscdn.com\",\n \"queue.\",\n \"cdn_hello_11\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","protocol","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","metadataObject","appendMetadata","metadata","data","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","search","keyValue","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","indexOf","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","bot","webdriver","__nightmare","callPhantom","_phantom","phantom","__polypane","_bot","collectDataOnLeave","ua","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","i","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","e","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","callbackRaw","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue","q"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"hello.source.js","sources":["hello.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) return metadata;\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n return (\n (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex).test(keyValue);\n })\n .join(\"&\") || undefinedVar\n );\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n query,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query || getQueryParams(deleteSourceInfo),\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch ? getQueryParams(delSrc, querySearch) : undefinedVar,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"simpleanalyticscdn.com\",\n \"queue.\",\n \"cdn_hello_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","protocol","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","search","keyValue","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","indexOf","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","i","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","query","currentPage","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue","q"],"mappings":"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"} \ No newline at end of file diff --git a/dist/latest/latest.dev.js b/dist/latest/latest.dev.js index 0c74bca4..87bfa138 100644 --- a/dist/latest/latest.dev.js +++ b/dist/latest/latest.dev.js @@ -1,4 +1,4 @@ - +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2025-06-13; a5d8; v12) */ /* eslint-env browser */ (function ( diff --git a/dist/latest/latest.js b/dist/latest/latest.js index 15d59a31..dfc727c5 100644 --- a/dist/latest/latest.js +++ b/dist/latest/latest.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy friendly analytics (docs.simpleanalytics.com/script; 2023-05-03; f270; v11) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2025-06-13; ea5c; v12) */ -!function(l,t,e,n,p){try{var h=undefined,f=!0,d=!1,r="true",a="https:",m="pageview",u="event",i="error",o=l.console,c="doNotTrack",g=l.navigator,s=l.location,v=s.host,y=l.document,_=g.userAgent,w="Not sending request ",b=w+"when ",E=d,O=encodeURIComponent,x=decodeURIComponent,S=JSON.stringify,M=l.addEventListener,k="https://queue."+e,q=y.documentElement||{},A="language",$="Height",j="scroll",D=g.userAgentData,C=j+$,R="offset"+$,H="client"+$,P="pagehide",T="platform",U="platformVersion",I="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(_)&&!/(cubot)/i.test(_),N=l.screen,z=y.currentScript||y.querySelector('script[src*="'+e+'"]');p=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){p("Error in your "+t+" function:",e)},W=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},G=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},J=function(t,e){return t&&t.getAttribute("data-"+e)},L=function(t){return Array.isArray(t)?t:"string"==typeof t&&t.length?t.split(/, ?/):[]},Y=function(t){return t&&t.constructor===Object},Z=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},rt=function(t){return"function"==typeof t},at="namespace",it=t[at]||J(z,at)||"sa",ot=l[it+"_metadata"],ct=function(t,e){Y(ot)&&(t=Z(t,ot));var n=l[Mt];if(!rt(n))return t;try{return Z(t,n.call(l,Z(t,e)))}catch(r){F("metadata",r)}},st=t.strictUtm||J(z,"strict-utm")==r,ut=function(a){return s.search.slice(1).split("&").filter(function(t){var e=a||!tt("ut"),n=Ot.map(G).join("|"),r=e?"^("+n+")=":"^((utm_)"+(st?"":"?")+"(source|medium|content|term|campaign)"+(st?"":"|ref")+"|"+n+")=";return e&&!Ot.length?d:new RegExp(r).test(t)}).join("&")||h},lt=it+"_loaded";if(l[lt]==f)return p(w+"twice");l.sa_event_loaded=f,l[lt]=f;var pt=function(e,t,n){e=n?e:Z(At,Dt,e),g.brave&&!n&&(e.brave=f),g._duckduckgoloader_&&!n&&(e.duck=f);var r=new Image;t&&(r.onerror=t,r.onload=t),r.src=k+"/simple.gif?"+Object.keys(e).filter(function(t){return e[t]!=h}).map(function(t){return O(t)+"="+O(e[t])}).join("&")+"&time="+Date.now()},ht=t.hostname||J(z,"hostname"),ft=ht||v,dt={version:"cdn_latest_11",hostname:ft};n=function(t){t=t.stack?t+" "+t.stack:t,p(t),pt(Z(dt,{type:i,error:t,path:s.pathname}),h,f)},M(i,function(t){t.filename&&-1>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},at=function(t){return"function"==typeof t},it="namespace",ot=t[it]||L(z,it)||"sa",ct=function(t,e){var n=d[ot+"_metadata"];Z(n)&&(t=K(t,n));var r=d[Mt];if(!at(r))return t;try{return K(t,r.call(d,K(t,e)))}catch(a){F("metadata",a)}},st=t.strictUtm||L(z,"strict-utm")==r,ut=function(a,t){return(t||s.search).slice(1).split("&").filter(function(t){var e=a||!et("ut"),n=Et.map(J).join("|"),r=e?"^("+n+")=":"^((utm_)"+(st?"":"?")+"(source|medium|content|term|campaign)"+(st?"":"|ref")+"|"+n+")=";return e&&!Et.length?y:new RegExp(r).test(t)}).join("&")||v},lt=ot+"_loaded";if(d[lt]==g)return m(f+"twice");d.sa_event_loaded=g,d[lt]=g;var pt=function(e,t,n){e=n?e:K($t,Ct,e),w.brave&&!n&&(e.brave=g),w._duckduckgoloader_&&!n&&(e.duck=g);var r=new Image;t&&(r.onerror=t,r.onload=t),r.src=k+"/simple.gif?"+Object.keys(e).filter(function(t){return e[t]!=v}).map(function(t){return E(t)+"="+E(e[t])}).join("&")+"&time="+Date.now()},ft=t.hostname||L(z,"hostname"),ht=ft||b,dt={version:"cdn_latest_12",hostname:ht};n=function(t){t=t.stack?t+" "+t.stack:t,m(t),pt(K(dt,{type:i,error:t,path:s.pathname}),v,g)},M(i,function(t){t.filename&&-1> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var metadataObject = window[namespace + \"_metadata\"];\n var appendMetadata = function (metadata, data) {\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) return metadata;\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var getQueryParams = function (ignoreSource) {\n return (\n loc.search\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex).test(keyValue);\n })\n .join(\"&\") || undefinedVar\n );\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n window.phantom ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n return (\n (doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n nav.sendBeacon(fullApiUrl + \"/append\", stringify(append));\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n metadata\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n\n sendData({\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: getQueryParams(deleteSourceInfo),\n\n metadata: stringify(metadata),\n });\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (isPushState, pathOverwrite, metadata) {\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique = isPushState || userNavigated ? falseVar : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n sendPageView(\n isPushState,\n isPushState || userNavigated || !collectMetricByString(\"r\"), // r = referrers\n sameSite,\n metadata\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n else {\n window.sa_pageview = function (path, metadata) {\n pageview(0, path, metadata);\n };\n }\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"simpleanalyticscdn.com\",\n \"queue.\",\n \"cdn_latest_11\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","protocol","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","metadataObject","appendMetadata","metadata","data","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","search","keyValue","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","indexOf","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","bot","webdriver","__nightmare","callPhantom","_phantom","phantom","__polypane","_bot","collectDataOnLeave","ua","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","i","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","e","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","callbackRaw","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue","q"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"latest.source.js","sources":["latest.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) return metadata;\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n return (\n (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex).test(keyValue);\n })\n .join(\"&\") || undefinedVar\n );\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n query,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query || getQueryParams(deleteSourceInfo),\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch ? getQueryParams(delSrc, querySearch) : undefinedVar,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"simpleanalyticscdn.com\",\n \"queue.\",\n \"cdn_latest_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","protocol","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","search","keyValue","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","indexOf","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","i","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","query","currentPage","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue","q"],"mappings":"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"} \ No newline at end of file diff --git a/dist/latest/light.js b/dist/latest/light.js index 1e539119..4b71c465 100644 --- a/dist/latest/light.js +++ b/dist/latest/light.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy friendly analytics (docs.simpleanalytics.com/script; 2023-05-03; c569; v11) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2025-06-13; bc2f; v12) */ -!function(s,e,t,u){try{var i=undefined,n="https:",r=s.console,a="doNotTrack",p=s.navigator,c=s.location,d=c.host,o=s.document,l=p.userAgent,m="Not sending request ",f=!1,g=encodeURIComponent,h=decodeURIComponent,v=JSON.stringify,y=s.addEventListener,_="https://queue."+t,w=(o.documentElement,"language"),b=p.userAgentData,O="platform",S="platformVersion",k="https://docs.simpleanalytics.com",j=/(bot|spider|crawl)/i.test(l)&&!/(cubot)/i.test(l),E=o.currentScript||o.querySelector('script[src*="'+t+'"]');u=function(){var e=[].slice.call(arguments);return e.unshift("Simple Analytics:"),Function.prototype.apply.call(r.warn,r,e)};var q=function(e,t){return e&&e.getAttribute("data-"+t)},A=function(){for(var e,t,n,r={},a=arguments,o=0;o>e/4).toString(16)})}catch(r){return e.replace(n,function(e){var t=16*Math.random()|0;return(e<2?t:3&t|8).toString(16)})}},I="namespace",N=e[I]||q(E,I)||"sa",R=e.strictUtm||"true"==q(E,"strict-utm"),U=N+"_loaded";if(1==s[U])return u(m+"twice");s.sa_event_loaded=!0,s[U]=!0;var V,B=function(t,e,n){t=n?t:A(H,J,t),p.brave&&!n&&(t.brave=!0),p._duckduckgoloader_&&!n&&(t.duck=!0),(new Image).src=_+"/simple.gif?"+Object.keys(t).filter(function(e){return t[e]!=i}).map(function(e){return g(e)+"="+g(t[e])}).join("&")+"&time="+Date.now()},C=e.hostname||q(E,"hostname"),T=C||d,F={version:"cdn_light_11",hostname:T};e.mode||q(E,"mode");try{V=Intl.DateTimeFormat().resolvedOptions().timeZone}catch(Q){u(Q)}j&&(F.bot=!0);var H=A(F,{ua:l,https:c.protocol==n,timezone:V,page_id:D(),session_id:D()});if(H.sri=!1,b&&(H.mobile=b.mobile,H.brands=v(b.brands)),T!==d&&(H.hostname_original=d),a in p&&"1"==p[a])return u("Not sending request when "+a+" is enabled. See "+k+"/dnt");-1!=d.indexOf(".")&&!/^[0-9.:]+$/.test(d)||C||u("Set hostname on "+d+". See "+k+"/overwrite-domain-name");var z,J={},L=(o.referrer||"").replace(d,T).replace(/^https?:\/\/((m|l|w{2,3}([0-9]+)?)\.)?([^?#]+)(.*)$/,"$4").replace(/^([^/]+)$/,"$1")||i,M=function(e,t){var n=A(F,{type:"append",original_id:t?e:H.page_id});t||!p.sendBeacon?B(n,0,!0):p.sendBeacon(_+"/append",v(n))};y("pagehide",M,!1);var P,Z,G=function(e){var t="";try{t=e||h(c.pathname)}catch(Q){u(Q)}return t},K=function(e,t,n,r){e&&M(""+H.page_id,!0),H.page_id=D();var a,o=T+G();B({id:H.page_id,type:"pageview",referrer:!t||n?L:null,query:(a=t,c.search.slice(1).split("&").filter(function(e){return!a&&new RegExp("^((utm_)"+(R?"":"?")+"(source|medium|content|term|campaign)"+(R?"":"|ref")+")=").test(e)}).join("&")||i)}),L=o,0};!function(e,t){var n=G(t);if(n&&z!=n){z=n,J.path=n,p[w]&&(J[w]=p[w]);var r,a=s.performance,o="navigation";try{r=a.getEntriesByType(o)[0].type}catch(Q){u(Q)}Z=r?-1<["reload","back_forward"].indexOf(r):a&&a[o]&&-1<[1,2].indexOf(a[o].type),P=!!L&&L.split("/")[0]==d;var i=function(){f=!0,K(e,e||Z||!1,P)};if(f)i();else try{b&&"function"==typeof b.getHighEntropyValues?b.getHighEntropyValues([O,S]).then(function(e){H.os_name=e[O],H.os_version=e[S],i()})["catch"](i):i()}catch(c){i()}}}()}catch(W){u(W)}}(window,{},"simpleanalyticscdn.com"); +!function(l,e,t,f){try{var m=undefined,n="https:",r=l.console,a="doNotTrack",g=l.navigator,i=l.location,h=i.host,o=l.document,c=g.userAgent,s="Not sending request ",v=!1,u=encodeURIComponent,p=decodeURIComponent,d=JSON.stringify,y=l.addEventListener,_="https://queue."+t,b=(o.documentElement,"language"),w=g.userAgentData,O="platform",S="platformVersion",j="https://docs.simpleanalytics.com",k=/(bot|spider|crawl)/i.test(c)&&!/(cubot)/i.test(c),E=o.currentScript||o.querySelector('script[src*="'+t+'"]');f=function(){var e=[].slice.call(arguments);return e.unshift("Simple Analytics:"),Function.prototype.apply.call(r.warn,r,e)};var q=function(e){return"string"==typeof e},x=function(e,t){return e&&e.getAttribute("data-"+t)},A=function(){for(var e,t,n,r={},a=arguments,i=0;i>e/4).toString(16)})}catch(r){return e.replace(n,function(e){var t=16*Math.random()|0;return(e<2?t:3&t|8).toString(16)})}},N=function(e){return"function"==typeof e},R="namespace",U=e[R]||x(E,R)||"sa",V=e.strictUtm||"true"==x(E,"strict-utm"),B=function(t,e){return(e||i.search).slice(1).split("&").filter(function(e){return!t&&new RegExp("^((utm_)"+(V?"":"?")+"(source|medium|content|term|campaign)"+(V?"":"|ref")+")=").test(e)}).join("&")||m},C=U+"_loaded";if(1==l[C])return f(s+"twice");l.sa_event_loaded=!0,l[C]=!0;var T,F=function(t,e,n){t=n?t:A(L,P,t),g.brave&&!n&&(t.brave=!0),g._duckduckgoloader_&&!n&&(t.duck=!0),(new Image).src=_+"/simple.gif?"+Object.keys(t).filter(function(e){return t[e]!=m}).map(function(e){return u(e)+"="+u(t[e])}).join("&")+"&time="+Date.now()},H=e.hostname||x(E,"hostname"),z=H||h,J={version:"cdn_light_12",hostname:z};e.mode||x(E,"mode");try{T=Intl.DateTimeFormat().resolvedOptions().timeZone}catch(X){f(X)}k&&(J.bot=!0);var L=A(J,{ua:c,https:i.protocol==n,timezone:T,page_id:I(),session_id:I()});if(L.sri=!1,w&&(L.mobile=w.mobile,L.brands=d(w.brands)),z!==h&&(L.hostname_original=h),a in g&&"1"==g[a])return f("Not sending request when "+a+" is enabled. See "+j+"/dnt");-1!=h.indexOf(".")&&!/^[0-9.:]+$/.test(h)||H||f("Set hostname on "+h+". See "+j+"/overwrite-domain-name");var M,P={},Z=(e.referrer||x(E,"referrer")||o.referrer||"").replace(h,z).replace(/^https?:\/\/((m|l|w{2,3}([0-9]+)?)\.)?([^?#]+)(.*)$/,"$4").replace(/^([^/]+)$/,"$1")||m,G=function(e,t){var n=A(J,{type:"append",original_id:t?e:L.page_id});if(t||!g.sendBeacon)F(n,0,!0);else try{g.sendBeacon.bind(g)(_+"/append",d(n))}catch(r){F(n,0,!0)}};y("pagehide",G,!1);var K,Q,W=function(e){var t="";try{t=e||p(i.pathname)}catch(X){f(X)}return t};!function(t,e,n,r){!r&&N(n)&&(r=n);var a,i;N(r);q(e)&&-1> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var getQueryParams = function (ignoreSource) {\n return (\n loc.search\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n if (ignore) return falseVar;\n var regex =\n \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \")=\";\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex).test(keyValue);\n })\n .join(\"&\") || undefinedVar\n );\n };\n\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n\n\n\n\n\n\n\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var bot = isBotAgent;\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n return (\n (doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n nav.sendBeacon(fullApiUrl + \"/append\", stringify(append));\n }\n };\n\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n\n\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n metadata\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n\n sendData({\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: getQueryParams(deleteSourceInfo),\n\n });\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (isPushState, pathOverwrite, metadata) {\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n sameSite = referrer\n ? referrer.split(slash)[0] == locationHostname\n : falseVar;\n\n\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n sendPageView(\n isPushState,\n isPushState || userNavigated || !collectMetricByString(\"r\"), // r = referrers\n sameSite,\n metadata\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n\n\n pageview();\n\n } catch (e) {\n warn(e);\n }\n})(\n window,\n {},\n \"simpleanalyticscdn.com\",\n \"queue.\",\n \"cdn_light_11\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","warn","undefinedVar","undefined","https","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","protocol","language","documentElement","uaData","userAgentData","platformText","platformVersionText","docsUrl","isBotAgent","test","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","attr","attribute","getAttribute","assign","obj","prop","object","to","arg","index","length","nextSource","constructor","Object","nextKey","hasOwnProperty","settings","sa_settings","logSettings","keys","Date","now","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","replace","c","getRandomValues","Uint8Array","toString","error","r","Math","random","namespaceText","namespace","strictUtm","loadedVariable","sa_event_loaded","timezone","sendData","data","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","Image","src","filter","key","map","join","overwrittenHostname","hostname","definedHostname","basePayload","version","mode","Intl","DateTimeFormat","resolvedOptions","timeZone","bot","ua","page_id","session_id","sri","mobile","brands","hostname_original","indexOf","lastSendPath","referrer","sendOnLeave","id","push","append","type","original_id","sendBeacon","sameSite","userNavigated","getPath","overwrite","path","pathname","sendPageView","isPushState","deleteSourceInfo","metadata","ignoreSource","currentPage","query","search","split","keyValue","RegExp","pages","pathOverwrite","performaceEntryType","perf","performance","navigationText","getEntriesByType","triggerSendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","e","pageview"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"light.source.js","sources":["light.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n\n var collectMetricByString = function (metricAbbreviation) {\n // eslint-disable-next-line no-unreachable\n return true;\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n return (\n (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n if (ignore) return falseVar;\n // eslint-disable-next-line no-redeclare\n var regex =\n \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \")=\";\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex).test(keyValue);\n })\n .join(\"&\") || undefinedVar\n );\n };\n\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n\n\n\n\n\n\n\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n // eslint-disable-next-line no-redeclare\n var bot = isBotAgent;\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n\n\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n query,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query || getQueryParams(deleteSourceInfo),\n\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n sameSite = referrer\n ? referrer.split(slash)[0] == locationHostname\n : falseVar;\n\n\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch ? getQueryParams(delSrc, querySearch) : undefinedVar,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n\n\n pageview();\n\n } catch (e) {\n warn(e);\n }\n})(\n window,\n {},\n \"simpleanalyticscdn.com\",\n \"queue.\",\n \"cdn_light_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","warn","undefinedVar","undefined","https","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","protocol","language","documentElement","uaData","userAgentData","platformText","platformVersionText","docsUrl","isBotAgent","test","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","isString","string","attr","attribute","getAttribute","assign","obj","prop","object","to","arg","index","length","nextSource","constructor","Object","nextKey","hasOwnProperty","settings","sa_settings","logSettings","keys","Date","now","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","replace","c","getRandomValues","Uint8Array","toString","error","r","Math","random","isFunction","func","namespaceText","namespace","strictUtm","getQueryParams","ignoreSource","overwriteSearch","search","split","filter","keyValue","RegExp","join","loadedVariable","sa_event_loaded","timezone","sendData","data","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","Image","src","key","map","overwrittenHostname","hostname","definedHostname","basePayload","version","mode","Intl","DateTimeFormat","resolvedOptions","timeZone","bot","ua","page_id","session_id","sri","mobile","brands","hostname_original","indexOf","lastSendPath","referrer","sendOnLeave","id","push","append","type","original_id","sendBeacon","bind","e","sameSite","userNavigated","getPath","overwrite","path","pathname","isPushState","pathOverwrite","metadata","callbackRaw","querySearch","parts","shift","performaceEntryType","perf","performance","navigationText","getEntriesByType","triggerSendPageView","delSrc","deleteSourceInfo","query","currentPage","pages","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","pageview"],"mappings":"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"} \ No newline at end of file diff --git a/dist/v12/app.js b/dist/v12/app.js index f418e37a..ca9e00c6 100644 --- a/dist/v12/app.js +++ b/dist/v12/app.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy friendly analytics (docs.simpleanalytics.com/script; 2024-03-07; b254; SRI-version; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2025-06-13; 79b7; SRI-version; v12) */ -!function(l,t,e,n,p){try{var f=undefined,h=!0,d=!1,r="true",a="https:",m="pageview",u="event",i="error",o=l.console,c="doNotTrack",g=l.navigator,s=l.location,v=s.host,y=l.document,_=g.userAgent,w="Not sending request ",b=w+"when ",E=d,O=encodeURIComponent,x=decodeURIComponent,S=JSON.stringify,M=l.addEventListener,k="https://queue."+e,q=y.documentElement||{},A="language",j="Height",D="scroll",$=g.userAgentData,C=D+j,R="offset"+j,H="client"+j,P="pagehide",T="platform",U="platformVersion",I="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(_)&&!/(cubot)/i.test(_),N=l.screen,z=y.currentScript||y.querySelector('script[src*="'+e+'"]');p=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){p("Error in your "+t+" function:",e)},W=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},G=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},J=function(t,e){return t&&t.getAttribute("data-"+e)},L=function(t){return Array.isArray(t)?t:"string"==typeof t&&t.length?t.split(/, ?/):[]},Y=function(t){return t&&t.constructor===Object},Z=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},rt=function(t){return"function"==typeof t},at="namespace",it=t[at]||J(z,at)||"sa",ot=l[it+"_metadata"],ct=function(t,e){Y(ot)&&(t=Z(t,ot));var n=l[kt];if(!rt(n))return t;try{return Z(t,n.call(l,Z(t,e)))}catch(r){F("metadata",r)}},st=t.strictUtm||J(z,"strict-utm")==r,ut=function(a){return s.search.slice(1).split("&").filter(function(t){var e=a||!tt("ut"),n=xt.map(G).join("|"),r=e?"^("+n+")=":"^((utm_)"+(st?"":"?")+"(source|medium|content|term|campaign)"+(st?"":"|ref")+"|"+n+")=";return e&&!xt.length?d:new RegExp(r).test(t)}).join("&")||f},lt=it+"_loaded";if(l[lt]==h)return p(w+"twice");l.sa_event_loaded=h,l[lt]=h;var pt=function(e,t,n){e=n?e:Z(Dt,Rt,e),g.brave&&!n&&(e.brave=h),g._duckduckgoloader_&&!n&&(e.duck=h);var r=new Image;t&&(r.onerror=t,r.onload=t),r.src=k+"/simple.gif?"+Object.keys(e).filter(function(t){return e[t]!=f}).map(function(t){return O(t)+"="+O(e[t])}).join("&")+"&time="+Date.now()},ft=function(t){if(t)return t.replace(/^(https?:\/\/)?((m|l|w{2,3}([0-9]+)?)\.)?([^?#]+)(.*)$/,"$5")},ht=ft(t.hostname||J(z,"hostname")),dt=ft(ht||v),mt={version:"cdn_latest_12",hostname:dt};n=function(t){t=t.stack?t+" "+t.stack:t,p(t),pt(Z(mt,{type:i,error:t,path:s.pathname}),f,h)},M(i,function(t){t.filename&&-1>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},at=function(t){return"function"==typeof t},it="namespace",ot=t[it]||L(z,it)||"sa",ct=function(t,e){var n=d[ot+"_metadata"];Z(n)&&(t=K(t,n));var r=d[Mt];if(!at(r))return t;try{return K(t,r.call(d,K(t,e)))}catch(a){F("metadata",a)}},st=t.strictUtm||L(z,"strict-utm")==r,ut=function(a,t){return(t||s.search).slice(1).split("&").filter(function(t){var e=a||!et("ut"),n=Et.map(J).join("|"),r=e?"^("+n+")=":"^((utm_)"+(st?"":"?")+"(source|medium|content|term|campaign)"+(st?"":"|ref")+"|"+n+")=";return e&&!Et.length?y:new RegExp(r).test(t)}).join("&")||v},lt=ot+"_loaded";if(d[lt]==g)return m(f+"twice");d.sa_event_loaded=g,d[lt]=g;var pt=function(e,t,n){e=n?e:K($t,Ct,e),w.brave&&!n&&(e.brave=g),w._duckduckgoloader_&&!n&&(e.duck=g);var r=new Image;t&&(r.onerror=t,r.onload=t),r.src=k+"/simple.gif?"+Object.keys(e).filter(function(t){return e[t]!=v}).map(function(t){return E(t)+"="+E(e[t])}).join("&")+"&time="+Date.now()},ft=t.hostname||L(z,"hostname"),ht=ft||b,dt={version:"cdn_latest_12",hostname:ht};n=function(t){t=t.stack?t+" "+t.stack:t,m(t),pt(K(dt,{type:i,error:t,path:s.pathname}),v,g)},M(i,function(t){t.filename&&-1> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var metadataObject = window[namespace + \"_metadata\"];\n var appendMetadata = function (metadata, data) {\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) return metadata;\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var getQueryParams = function (ignoreSource) {\n return (\n loc.search\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex).test(keyValue);\n })\n .join(\"&\") || undefinedVar\n );\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n var cleanSubdomain = function (url) {\n if (!url) return;\n return url.replace(\n /^(https?:\\/\\/)?((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/,\n \"$5\"\n );\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname = cleanSubdomain(\n overwriteOptions.hostname || attr(scriptElement, \"hostname\")\n );\n\n var definedHostname = cleanSubdomain(\n overwrittenHostname || locationHostname\n );\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = trueVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n return cleanSubdomain(\n (doc.referrer || \"\").replace(locationHostname, definedHostname)\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n nav.sendBeacon(fullApiUrl + \"/append\", stringify(append));\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n metadata\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n\n sendData({\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: getQueryParams(deleteSourceInfo),\n\n metadata: stringify(metadata),\n });\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (isPushState, pathOverwrite, metadata) {\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n sendPageView(\n isPushState,\n isPushState || userNavigated || !collectMetricByString(\"r\"), // r = referrers\n sameSite,\n metadata\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata) {\n pageview(0, path, metadata);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"simpleanalyticscdn.com\",\n \"queue.\",\n \"cdn_latest_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","protocol","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","metadataObject","appendMetadata","metadata","data","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","search","keyValue","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","cleanSubdomain","url","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","indexOf","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","i","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","e","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","callbackRaw","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue","q"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"app.js","sources":["app.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) return metadata;\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n return (\n (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex).test(keyValue);\n })\n .join(\"&\") || undefinedVar\n );\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = trueVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n query,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query || getQueryParams(deleteSourceInfo),\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch ? getQueryParams(delSrc, querySearch) : undefinedVar,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"simpleanalyticscdn.com\",\n \"queue.\",\n \"cdn_latest_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","protocol","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","search","keyValue","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","indexOf","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","i","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","query","currentPage","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue","q"],"mappings":"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"} \ No newline at end of file diff --git a/dist/v12/auto-events.js b/dist/v12/auto-events.js index 847ff7cd..6ad6c9b7 100644 --- a/dist/v12/auto-events.js +++ b/dist/v12/auto-events.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy friendly analytics (docs.simpleanalytics.com/script; 2024-03-07; 1cc1; SRI-version; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2025-06-13; 7048; SRI-version; v12) */ -function r(t,e){var a,o=!1;h.downloads&&/^https?:\/\//i.test(t.href)&&new RegExp("\\.("+(h.downloadsExtensions||[]).join("|")+")$","i").test(t.pathname)?o="download":h.outbound&&/^https?:\/\//i.test(t.href)&&t.hostname!==m.location.hostname?o="outbound":h.emails&&/^mailto:/i.test(t.href)&&(o="email"),o&&(e?(a="saAutomatedLink(this, '"+o+"');",t.hasAttribute("target")&&"_self"!==t.getAttribute("target")||(a+=" return false;"),t.setAttribute("onclick",a)):t.addEventListener("click",function(){saAutomatedLink(t,o)}))}function e(){try{for(var t=document.getElementsByTagName("a"),e=0;e -1,\n emails: collectTypes.indexOf(\"emails\") > -1,\n downloads: collectTypes.indexOf(\"downloads\") > -1,\n // Downloads: enter file extensions you want to collect\n downloadsExtensions: setting(\"extensions\", \"array\", [\n \"pdf\",\n \"csv\",\n \"docx\",\n \"xlsx\",\n \"zip\",\n \"doc\",\n \"xls\",\n ]),\n\n // All: use title attribute if set for event name (for all events)\n // THIS TAKES PRECEDENCE OVER OTHER SETTINGS BELOW\n title: setting(\"useTitle\", \"bool\", true),\n // Outbound: use full URL of the links? false for just the hostname\n outboundFullUrl: fullUrls,\n // Downloads: if taking event name from URL, use full URL or just filename (default)\n downloadsFullUrl: fullUrls,\n };\n\n var saGlobal = setting(\"saGlobal\", \"string\", \"sa_event\");\n\n // For compiling the script\n var optionsLink = options;\n\n if (typeof optionsLink === \"undefined\")\n log(\"options object not found, please specify\", \"warn\");\n\n window.saAutomatedLink = function saAutomatedLink(element, type) {\n try {\n if (!element) return log(\"no element found\");\n var sent = false;\n\n var callback = function () {\n if (!sent && !element.hasAttribute(\"target\"))\n document.location = element.getAttribute(\"href\");\n sent = true;\n };\n\n if (window[saGlobal] && window[saGlobal + \"_loaded\"]) {\n var hostname = element.hostname;\n var pathname = element.pathname;\n\n var event;\n var metadata = {\n title: element.getAttribute(\"title\") || undefined,\n };\n var url = element.href || undefined;\n\n var useTitle = false;\n if (optionsLink.title && element.hasAttribute(\"title\")) {\n var theTitle = element.getAttribute(\"title\").trim();\n if (theTitle != \"\") useTitle = true;\n }\n\n if (useTitle) {\n event = theTitle;\n } else {\n switch (type) {\n case \"outbound\": {\n event = hostname + (optionsLink.outboundFullUrl ? pathname : \"\");\n metadata.url = url;\n break;\n }\n case \"download\": {\n event = optionsLink.downloadsFullUrl\n ? hostname + pathname\n : pathname.split(\"/\").pop();\n metadata.url = url;\n break;\n }\n case \"email\": {\n var href = element.getAttribute(\"href\");\n event = (href.split(\":\")[1] || \"\").split(\"?\")[0];\n metadata.email = event;\n break;\n }\n }\n }\n\n var clean =\n type +\n \"_\" +\n event.replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_+|_+$)/g, \"\");\n\n window[saGlobal](clean, metadata, callback);\n\n log(\"collected \" + clean);\n\n return type === \"email\"\n ? callback()\n : window.setTimeout(callback, 5000);\n } else {\n log(saGlobal + \" is not defined\", \"warn\");\n return callback();\n }\n } catch (error) {\n log(error.message, \"warn\");\n }\n };\n\n function collectLink(link, onclick) {\n var collect = false;\n\n // Collect download clicks\n if (\n optionsLink.downloads &&\n /^https?:\\/\\//i.test(link.href) &&\n new RegExp(\n \"\\\\.(\" + (optionsLink.downloadsExtensions || []).join(\"|\") + \")$\",\n \"i\"\n ).test(link.pathname)\n ) {\n collect = \"download\";\n\n // Collect outbound links clicks\n } else if (\n optionsLink.outbound &&\n /^https?:\\/\\//i.test(link.href) &&\n link.hostname !== window.location.hostname\n ) {\n collect = \"outbound\";\n\n // Collect email clicks\n } else if (optionsLink.emails && /^mailto:/i.test(link.href)) {\n collect = \"email\";\n }\n\n if (!collect) return;\n\n if (onclick) {\n var onClickAttribute = \"saAutomatedLink(this, '\" + collect + \"');\";\n\n if (\n !link.hasAttribute(\"target\") ||\n link.getAttribute(\"target\") === \"_self\"\n )\n onClickAttribute += \" return false;\";\n\n link.setAttribute(\"onclick\", onClickAttribute);\n } else {\n link.addEventListener(\"click\", function () {\n saAutomatedLink(link, collect);\n });\n }\n }\n\n function onDOMContentLoaded() {\n try {\n var a = document.getElementsByTagName(\"a\");\n\n // Loop over all links on the page\n for (var i = 0; i < a.length; i++) {\n var link = a[i];\n var href = link.getAttribute(\"href\");\n\n // Skip links that don't have an href\n if (!href) continue;\n\n // We don't want to overwrite website behaviour so we check for the onclick attribute\n if (!link.getAttribute(\"onclick\") && !/^mailto:/.test(href)) {\n collectLink(link, true);\n } else {\n collectLink(link, false);\n }\n }\n } catch (error) {\n log(error.message, \"warn\");\n }\n }\n\n if (doc.readyState === \"ready\" || doc.readyState === \"complete\") {\n onDOMContentLoaded();\n } else {\n document.addEventListener(\"readystatechange\", function (event) {\n if (event.target.readyState === \"complete\") onDOMContentLoaded();\n });\n }\n})(window);\n"],"names":["collectLink","link","onclick","onClickAttribute","collect","optionsLink","downloads","test","href","RegExp","downloadsExtensions","join","pathname","outbound","hostname","window","location","emails","hasAttribute","getAttribute","setAttribute","addEventListener","saAutomatedLink","onDOMContentLoaded","a","document","getElementsByTagName","i","length","error","log","message","doc","scriptElement","setting","collectTypes","fullUrls","options","saGlobal","type","logger","console","warn","info","currentScript","querySelector","attribute","defaultValue","value","dataset","split","map","item","trim","filter","Boolean","indexOf","title","outboundFullUrl","downloadsFullUrl","element","sent","callback","theTitle","metadata","undefined","url","useTitle","event","pop","email","clean","replace","setTimeout","readyState","target"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"auto-events.source.js","sources":["auto-events.source.js"],"sourcesContent":["(function saAutomatedEvents(window) {\n // Skip server side rendered pages\n if (typeof window === \"undefined\") return;\n\n var log = function (message, type) {\n var logger = type === \"warn\" ? console.warn : console.info;\n return logger && logger(\"Simple Analytics auto events:\", message);\n };\n\n var doc = window.document;\n\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"auto-events.js\"]');\n\n var setting = function (attribute, type, defaultValue) {\n var value = scriptElement && scriptElement.dataset[attribute];\n\n // Booleans\n if (type === \"bool\" && (value === \"true\" || value === \"false\"))\n return value === \"true\";\n else if (type === \"bool\") return defaultValue;\n\n // Arrays\n if (type === \"array\" && value)\n return value\n .split(\",\")\n .map(function (item) {\n return item.trim();\n })\n .filter(Boolean);\n else if (type === \"array\") return defaultValue;\n\n return value || defaultValue;\n };\n\n var collectTypes = setting(\"collect\", \"array\", [\n \"outbound\",\n \"emails\",\n \"downloads\",\n ]);\n var fullUrls = setting(\"fullUrls\", \"bool\", false);\n\n var options = {\n // What to collect\n outbound: collectTypes.indexOf(\"outbound\") > -1,\n emails: collectTypes.indexOf(\"emails\") > -1,\n downloads: collectTypes.indexOf(\"downloads\") > -1,\n // Downloads: enter file extensions you want to collect\n downloadsExtensions: setting(\"extensions\", \"array\", [\n \"pdf\",\n \"csv\",\n \"docx\",\n \"xlsx\",\n \"zip\",\n \"doc\",\n \"xls\",\n ]),\n\n // All: use title attribute if set for event name (for all events)\n // THIS TAKES PRECEDENCE OVER OTHER SETTINGS BELOW\n title: setting(\"useTitle\", \"bool\", true),\n // Outbound: use full URL of the links? false for just the hostname\n outboundFullUrl: fullUrls,\n // Downloads: if taking event name from URL, use full URL or just filename (default)\n downloadsFullUrl: fullUrls,\n };\n\n var saGlobal = setting(\"saGlobal\", \"string\", \"sa_event\");\n\n // For compiling the script\n var optionsLink = options;\n\n if (typeof optionsLink === \"undefined\")\n log(\"options object not found, please specify\", \"warn\");\n\n var saAutomatedLink = function saAutomatedLink(element, type) {\n try {\n if (!element) return log(\"no element found\");\n var sent = false;\n\n var callback = function () {\n if (!sent && !element.hasAttribute(\"target\"))\n document.location = element.getAttribute(\"href\");\n sent = true;\n };\n\n if (window[saGlobal] && window[saGlobal + \"_loaded\"]) {\n var hostname = element.hostname;\n var pathname = element.pathname;\n\n var event;\n var metadata = {\n title: element.getAttribute(\"title\") || undefined,\n };\n var url = element.href || undefined;\n\n var useTitle = false;\n if (optionsLink.title && element.hasAttribute(\"title\")) {\n var theTitle = element.getAttribute(\"title\").trim();\n if (theTitle != \"\") useTitle = true;\n }\n\n if (useTitle) {\n event = theTitle;\n } else {\n switch (type) {\n case \"outbound\": {\n event = hostname + (optionsLink.outboundFullUrl ? pathname : \"\");\n metadata.url = url;\n break;\n }\n case \"download\": {\n event = optionsLink.downloadsFullUrl\n ? hostname + pathname\n : pathname.split(\"/\").pop();\n metadata.url = url;\n break;\n }\n case \"email\": {\n var href = element.getAttribute(\"href\");\n event = (href.split(\":\")[1] || \"\").split(\"?\")[0];\n metadata.email = event;\n break;\n }\n }\n }\n\n var clean =\n type +\n \"_\" +\n event.replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_+|_+$)/g, \"\");\n\n window[saGlobal](clean, metadata, callback);\n\n log(\"collected \" + clean);\n\n return type === \"email\"\n ? callback()\n : window.setTimeout(callback, 5000);\n } else {\n log(saGlobal + \" is not defined\", \"warn\");\n return callback();\n }\n } catch (error) {\n log(error.message, \"warn\");\n }\n };\n\n window.saAutomatedLink = saAutomatedLink;\n\n function collectLink(link, onclick) {\n if (link.hasAttribute(\"data-simple-event\")) return;\n var collect = false;\n\n // Collect download clicks\n if (\n optionsLink.downloads &&\n /^https?:\\/\\//i.test(link.href) &&\n new RegExp(\n \"\\\\.(\" + (optionsLink.downloadsExtensions || []).join(\"|\") + \")$\",\n \"i\"\n ).test(link.pathname)\n ) {\n collect = \"download\";\n\n // Collect outbound links clicks\n } else if (\n optionsLink.outbound &&\n /^https?:\\/\\//i.test(link.href) &&\n link.hostname !== window.location.hostname\n ) {\n collect = \"outbound\";\n\n // Collect email clicks\n } else if (optionsLink.emails && /^mailto:/i.test(link.href)) {\n collect = \"email\";\n }\n\n if (!collect) return;\n\n if (onclick) {\n var onClickAttribute = \"saAutomatedLink(this, '\" + collect + \"');\";\n\n if (\n !link.hasAttribute(\"target\") ||\n link.getAttribute(\"target\") === \"_self\"\n )\n onClickAttribute += \" return false;\";\n\n link.setAttribute(\"onclick\", onClickAttribute);\n } else {\n link.addEventListener(\"click\", function () {\n saAutomatedLink(link, collect);\n });\n }\n }\n\n function onDOMContentLoaded() {\n try {\n var a = document.getElementsByTagName(\"a\");\n\n // Loop over all links on the page\n for (var i = 0; i < a.length; i++) {\n var link = a[i];\n var href = link.getAttribute(\"href\");\n\n // Skip links that don't have an href\n if (!href) continue;\n\n // We don't want to overwrite website behaviour so we check for the onclick attribute\n if (!link.getAttribute(\"onclick\") && !/^mailto:/.test(href)) {\n collectLink(link, true);\n } else {\n collectLink(link, false);\n }\n }\n } catch (error) {\n log(error.message, \"warn\");\n }\n }\n\n if (doc.readyState === \"ready\" || doc.readyState === \"complete\") {\n onDOMContentLoaded();\n } else {\n document.addEventListener(\"readystatechange\", function (event) {\n if (event.target.readyState === \"complete\") onDOMContentLoaded();\n });\n }\n})(window);\n"],"names":["collectLink","link","onclick","collect","onClickAttribute","hasAttribute","optionsLink","downloads","test","href","RegExp","downloadsExtensions","join","pathname","outbound","hostname","window","location","emails","getAttribute","setAttribute","addEventListener","saAutomatedLink","onDOMContentLoaded","a","document","getElementsByTagName","i","length","error","log","message","doc","scriptElement","setting","collectTypes","fullUrls","options","saGlobal","type","logger","console","warn","info","currentScript","querySelector","attribute","defaultValue","value","dataset","split","map","item","trim","filter","Boolean","indexOf","title","outboundFullUrl","downloadsFullUrl","element","sent","callback","theTitle","metadata","undefined","url","useTitle","event","pop","email","clean","replace","setTimeout","readyState","target"],"mappings":"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"} \ No newline at end of file diff --git a/dist/v12/custom/app.js b/dist/v12/custom/app.js index 391bffc9..6cd73ac8 100644 --- a/dist/v12/custom/app.js +++ b/dist/v12/custom/app.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy friendly analytics (docs.simpleanalytics.com/script; 2024-03-07; 3ec0; SRI-version; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2025-06-13; 4052; SRI-version; v12) */ -!function(l,t,e,n,p){try{var f=undefined,h=!0,d=!1,r="true",a="https:",m="pageview",u="event",i="error",o=l.console,c="doNotTrack",g=l.navigator,s=l.location,v=s.host,y=l.document,_=g.userAgent,w="Not sending request ",b=w+"when ",E=d,O=encodeURIComponent,x=decodeURIComponent,S=JSON.stringify,M=l.addEventListener,k="https://"+e,A=y.documentElement||{},q="language",j="Height",D="scroll",$=g.userAgentData,C=D+j,H="offset"+j,R="client"+j,P="pagehide",T="platform",U="platformVersion",I="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(_)&&!/(cubot)/i.test(_),N=l.screen,z=y.currentScript||y.querySelector('script[src*="'+e+'"]');p=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){p("Error in your "+t+" function:",e)},W=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},G=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},J=function(t,e){return t&&t.getAttribute("data-"+e)},L=function(t){return Array.isArray(t)?t:"string"==typeof t&&t.length?t.split(/, ?/):[]},Y=function(t){return t&&t.constructor===Object},Z=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},rt=function(t){return"function"==typeof t},at="namespace",it=t[at]||J(z,at)||"sa",ot=l[it+"_metadata"],ct=function(t,e){Y(ot)&&(t=Z(t,ot));var n=l[kt];if(!rt(n))return t;try{return Z(t,n.call(l,Z(t,e)))}catch(r){F("metadata",r)}},st=t.strictUtm||J(z,"strict-utm")==r,ut=function(a){return s.search.slice(1).split("&").filter(function(t){var e=a||!tt("ut"),n=xt.map(G).join("|"),r=e?"^("+n+")=":"^((utm_)"+(st?"":"?")+"(source|medium|content|term|campaign)"+(st?"":"|ref")+"|"+n+")=";return e&&!xt.length?d:new RegExp(r).test(t)}).join("&")||f},lt=it+"_loaded";if(l[lt]==h)return p(w+"twice");l.sa_event_loaded=h,l[lt]=h;var pt=function(e,t,n){e=n?e:Z(Dt,Ht,e),g.brave&&!n&&(e.brave=h),g._duckduckgoloader_&&!n&&(e.duck=h);var r=new Image;t&&(r.onerror=t,r.onload=t),r.src=k+"/simple.gif?"+Object.keys(e).filter(function(t){return e[t]!=f}).map(function(t){return O(t)+"="+O(e[t])}).join("&")+"&time="+Date.now()},ft=function(t){if(t)return t.replace(/^(https?:\/\/)?((m|l|w{2,3}([0-9]+)?)\.)?([^?#]+)(.*)$/,"$5")},ht=ft(t.hostname||J(z,"hostname")),dt=ft(ht||v),mt={version:"custom_app_12",hostname:dt};n=function(t){t=t.stack?t+" "+t.stack:t,p(t),pt(Z(mt,{type:i,error:t,path:s.pathname}),f,h)},M(i,function(t){t.filename&&-1"); +!function(d,t,e,n,m){try{var g=undefined,v=!0,y=!1,r="true",a="https:",_="pageview",u="event",i="error",o=d.console,c="doNotTrack",w=d.navigator,s=d.location,b=s.host,l=d.document,p=w.userAgent,f="Not sending request ",h=f+"when ",O=y,E=encodeURIComponent,x=decodeURIComponent,S=JSON.stringify,M=d.addEventListener,k="https://"+e,A=l.documentElement||{},q="language",$="Height",j="scroll",D=w.userAgentData,C=j+$,H="offset"+$,R="client"+$,P="pagehide",T="platform",U="platformVersion",I="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),N=d.screen,z=l.currentScript||l.querySelector('script[src*="'+e+'"]');m=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){m("Error in your "+t+" function:",e)},W=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},G=function(t){return"string"==typeof t},J=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},L=function(t,e){return t&&t.getAttribute("data-"+e)},Y=function(t){return Array.isArray(t)?t:G(t)&&t.length?t.split(/, ?/):[]},Z=function(t){return t&&t.constructor===Object},K=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},at=function(t){return"function"==typeof t},it="namespace",ot=t[it]||L(z,it)||"sa",ct=function(t,e){var n=d[ot+"_metadata"];Z(n)&&(t=K(t,n));var r=d[Mt];if(!at(r))return t;try{return K(t,r.call(d,K(t,e)))}catch(a){F("metadata",a)}},st=t.strictUtm||L(z,"strict-utm")==r,ut=function(a,t){return(t||s.search).slice(1).split("&").filter(function(t){var e=a||!et("ut"),n=Et.map(J).join("|"),r=e?"^("+n+")=":"^((utm_)"+(st?"":"?")+"(source|medium|content|term|campaign)"+(st?"":"|ref")+"|"+n+")=";return e&&!Et.length?y:new RegExp(r).test(t)}).join("&")||g},lt=ot+"_loaded";if(d[lt]==v)return m(f+"twice");d.sa_event_loaded=v,d[lt]=v;var pt=function(e,t,n){e=n?e:K($t,Ct,e),w.brave&&!n&&(e.brave=v),w._duckduckgoloader_&&!n&&(e.duck=v);var r=new Image;t&&(r.onerror=t,r.onload=t),r.src=k+"/simple.gif?"+Object.keys(e).filter(function(t){return e[t]!=g}).map(function(t){return E(t)+"="+E(e[t])}).join("&")+"&time="+Date.now()},ft=t.hostname||L(z,"hostname"),ht=ft||b,dt={version:"custom_app_12",hostname:ht};n=function(t){t=t.stack?t+" "+t.stack:t,m(t),pt(K(dt,{type:i,error:t,path:s.pathname}),g,v)},M(i,function(t){t.filename&&-1"); //# sourceMappingURL=app.js.map \ No newline at end of file diff --git a/dist/v12/custom/app.js.map b/dist/v12/custom/app.js.map index d4ffdcdf..8567a1db 100644 --- a/dist/v12/custom/app.js.map +++ b/dist/v12/custom/app.js.map @@ -1 +1 @@ -{"version":3,"file":"app.source.js","sources":["app.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var metadataObject = window[namespace + \"_metadata\"];\n var appendMetadata = function (metadata, data) {\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) return metadata;\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var getQueryParams = function (ignoreSource) {\n return (\n loc.search\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex).test(keyValue);\n })\n .join(\"&\") || undefinedVar\n );\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n var cleanSubdomain = function (url) {\n if (!url) return;\n return url.replace(\n /^(https?:\\/\\/)?((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/,\n \"$5\"\n );\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname = cleanSubdomain(\n overwriteOptions.hostname || attr(scriptElement, \"hostname\")\n );\n\n var definedHostname = cleanSubdomain(\n overwrittenHostname || locationHostname\n );\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = trueVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n return cleanSubdomain(\n (doc.referrer || \"\").replace(locationHostname, definedHostname)\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n nav.sendBeacon(fullApiUrl + \"/append\", stringify(append));\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n metadata\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n\n sendData({\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: getQueryParams(deleteSourceInfo),\n\n metadata: stringify(metadata),\n });\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (isPushState, pathOverwrite, metadata) {\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n sendPageView(\n isPushState,\n isPushState || userNavigated || !collectMetricByString(\"r\"), // r = referrers\n sameSite,\n metadata\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata) {\n pageview(0, path, metadata);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_app_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","metadataObject","appendMetadata","metadata","data","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","search","keyValue","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","cleanSubdomain","url","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","indexOf","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","protocol","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","i","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","e","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","callbackRaw","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue","q"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"app.source.js","sources":["app.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) return metadata;\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n return (\n (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex).test(keyValue);\n })\n .join(\"&\") || undefinedVar\n );\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = trueVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n query,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query || getQueryParams(deleteSourceInfo),\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch ? getQueryParams(delSrc, querySearch) : undefinedVar,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_app_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","search","keyValue","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","indexOf","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","protocol","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","i","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","query","currentPage","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue","q"],"mappings":"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"} \ No newline at end of file diff --git a/dist/v12/custom/auto-events.js b/dist/v12/custom/auto-events.js index 847ff7cd..6ad6c9b7 100644 --- a/dist/v12/custom/auto-events.js +++ b/dist/v12/custom/auto-events.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy friendly analytics (docs.simpleanalytics.com/script; 2024-03-07; 1cc1; SRI-version; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2025-06-13; 7048; SRI-version; v12) */ -function r(t,e){var a,o=!1;h.downloads&&/^https?:\/\//i.test(t.href)&&new RegExp("\\.("+(h.downloadsExtensions||[]).join("|")+")$","i").test(t.pathname)?o="download":h.outbound&&/^https?:\/\//i.test(t.href)&&t.hostname!==m.location.hostname?o="outbound":h.emails&&/^mailto:/i.test(t.href)&&(o="email"),o&&(e?(a="saAutomatedLink(this, '"+o+"');",t.hasAttribute("target")&&"_self"!==t.getAttribute("target")||(a+=" return false;"),t.setAttribute("onclick",a)):t.addEventListener("click",function(){saAutomatedLink(t,o)}))}function e(){try{for(var t=document.getElementsByTagName("a"),e=0;e -1,\n emails: collectTypes.indexOf(\"emails\") > -1,\n downloads: collectTypes.indexOf(\"downloads\") > -1,\n // Downloads: enter file extensions you want to collect\n downloadsExtensions: setting(\"extensions\", \"array\", [\n \"pdf\",\n \"csv\",\n \"docx\",\n \"xlsx\",\n \"zip\",\n \"doc\",\n \"xls\",\n ]),\n\n // All: use title attribute if set for event name (for all events)\n // THIS TAKES PRECEDENCE OVER OTHER SETTINGS BELOW\n title: setting(\"useTitle\", \"bool\", true),\n // Outbound: use full URL of the links? false for just the hostname\n outboundFullUrl: fullUrls,\n // Downloads: if taking event name from URL, use full URL or just filename (default)\n downloadsFullUrl: fullUrls,\n };\n\n var saGlobal = setting(\"saGlobal\", \"string\", \"sa_event\");\n\n // For compiling the script\n var optionsLink = options;\n\n if (typeof optionsLink === \"undefined\")\n log(\"options object not found, please specify\", \"warn\");\n\n window.saAutomatedLink = function saAutomatedLink(element, type) {\n try {\n if (!element) return log(\"no element found\");\n var sent = false;\n\n var callback = function () {\n if (!sent && !element.hasAttribute(\"target\"))\n document.location = element.getAttribute(\"href\");\n sent = true;\n };\n\n if (window[saGlobal] && window[saGlobal + \"_loaded\"]) {\n var hostname = element.hostname;\n var pathname = element.pathname;\n\n var event;\n var metadata = {\n title: element.getAttribute(\"title\") || undefined,\n };\n var url = element.href || undefined;\n\n var useTitle = false;\n if (optionsLink.title && element.hasAttribute(\"title\")) {\n var theTitle = element.getAttribute(\"title\").trim();\n if (theTitle != \"\") useTitle = true;\n }\n\n if (useTitle) {\n event = theTitle;\n } else {\n switch (type) {\n case \"outbound\": {\n event = hostname + (optionsLink.outboundFullUrl ? pathname : \"\");\n metadata.url = url;\n break;\n }\n case \"download\": {\n event = optionsLink.downloadsFullUrl\n ? hostname + pathname\n : pathname.split(\"/\").pop();\n metadata.url = url;\n break;\n }\n case \"email\": {\n var href = element.getAttribute(\"href\");\n event = (href.split(\":\")[1] || \"\").split(\"?\")[0];\n metadata.email = event;\n break;\n }\n }\n }\n\n var clean =\n type +\n \"_\" +\n event.replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_+|_+$)/g, \"\");\n\n window[saGlobal](clean, metadata, callback);\n\n log(\"collected \" + clean);\n\n return type === \"email\"\n ? callback()\n : window.setTimeout(callback, 5000);\n } else {\n log(saGlobal + \" is not defined\", \"warn\");\n return callback();\n }\n } catch (error) {\n log(error.message, \"warn\");\n }\n };\n\n function collectLink(link, onclick) {\n var collect = false;\n\n // Collect download clicks\n if (\n optionsLink.downloads &&\n /^https?:\\/\\//i.test(link.href) &&\n new RegExp(\n \"\\\\.(\" + (optionsLink.downloadsExtensions || []).join(\"|\") + \")$\",\n \"i\"\n ).test(link.pathname)\n ) {\n collect = \"download\";\n\n // Collect outbound links clicks\n } else if (\n optionsLink.outbound &&\n /^https?:\\/\\//i.test(link.href) &&\n link.hostname !== window.location.hostname\n ) {\n collect = \"outbound\";\n\n // Collect email clicks\n } else if (optionsLink.emails && /^mailto:/i.test(link.href)) {\n collect = \"email\";\n }\n\n if (!collect) return;\n\n if (onclick) {\n var onClickAttribute = \"saAutomatedLink(this, '\" + collect + \"');\";\n\n if (\n !link.hasAttribute(\"target\") ||\n link.getAttribute(\"target\") === \"_self\"\n )\n onClickAttribute += \" return false;\";\n\n link.setAttribute(\"onclick\", onClickAttribute);\n } else {\n link.addEventListener(\"click\", function () {\n saAutomatedLink(link, collect);\n });\n }\n }\n\n function onDOMContentLoaded() {\n try {\n var a = document.getElementsByTagName(\"a\");\n\n // Loop over all links on the page\n for (var i = 0; i < a.length; i++) {\n var link = a[i];\n var href = link.getAttribute(\"href\");\n\n // Skip links that don't have an href\n if (!href) continue;\n\n // We don't want to overwrite website behaviour so we check for the onclick attribute\n if (!link.getAttribute(\"onclick\") && !/^mailto:/.test(href)) {\n collectLink(link, true);\n } else {\n collectLink(link, false);\n }\n }\n } catch (error) {\n log(error.message, \"warn\");\n }\n }\n\n if (doc.readyState === \"ready\" || doc.readyState === \"complete\") {\n onDOMContentLoaded();\n } else {\n document.addEventListener(\"readystatechange\", function (event) {\n if (event.target.readyState === \"complete\") onDOMContentLoaded();\n });\n }\n})(window);\n"],"names":["collectLink","link","onclick","onClickAttribute","collect","optionsLink","downloads","test","href","RegExp","downloadsExtensions","join","pathname","outbound","hostname","window","location","emails","hasAttribute","getAttribute","setAttribute","addEventListener","saAutomatedLink","onDOMContentLoaded","a","document","getElementsByTagName","i","length","error","log","message","doc","scriptElement","setting","collectTypes","fullUrls","options","saGlobal","type","logger","console","warn","info","currentScript","querySelector","attribute","defaultValue","value","dataset","split","map","item","trim","filter","Boolean","indexOf","title","outboundFullUrl","downloadsFullUrl","element","sent","callback","theTitle","metadata","undefined","url","useTitle","event","pop","email","clean","replace","setTimeout","readyState","target"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"auto-events.source.js","sources":["auto-events.source.js"],"sourcesContent":["(function saAutomatedEvents(window) {\n // Skip server side rendered pages\n if (typeof window === \"undefined\") return;\n\n var log = function (message, type) {\n var logger = type === \"warn\" ? console.warn : console.info;\n return logger && logger(\"Simple Analytics auto events:\", message);\n };\n\n var doc = window.document;\n\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"auto-events.js\"]');\n\n var setting = function (attribute, type, defaultValue) {\n var value = scriptElement && scriptElement.dataset[attribute];\n\n // Booleans\n if (type === \"bool\" && (value === \"true\" || value === \"false\"))\n return value === \"true\";\n else if (type === \"bool\") return defaultValue;\n\n // Arrays\n if (type === \"array\" && value)\n return value\n .split(\",\")\n .map(function (item) {\n return item.trim();\n })\n .filter(Boolean);\n else if (type === \"array\") return defaultValue;\n\n return value || defaultValue;\n };\n\n var collectTypes = setting(\"collect\", \"array\", [\n \"outbound\",\n \"emails\",\n \"downloads\",\n ]);\n var fullUrls = setting(\"fullUrls\", \"bool\", false);\n\n var options = {\n // What to collect\n outbound: collectTypes.indexOf(\"outbound\") > -1,\n emails: collectTypes.indexOf(\"emails\") > -1,\n downloads: collectTypes.indexOf(\"downloads\") > -1,\n // Downloads: enter file extensions you want to collect\n downloadsExtensions: setting(\"extensions\", \"array\", [\n \"pdf\",\n \"csv\",\n \"docx\",\n \"xlsx\",\n \"zip\",\n \"doc\",\n \"xls\",\n ]),\n\n // All: use title attribute if set for event name (for all events)\n // THIS TAKES PRECEDENCE OVER OTHER SETTINGS BELOW\n title: setting(\"useTitle\", \"bool\", true),\n // Outbound: use full URL of the links? false for just the hostname\n outboundFullUrl: fullUrls,\n // Downloads: if taking event name from URL, use full URL or just filename (default)\n downloadsFullUrl: fullUrls,\n };\n\n var saGlobal = setting(\"saGlobal\", \"string\", \"sa_event\");\n\n // For compiling the script\n var optionsLink = options;\n\n if (typeof optionsLink === \"undefined\")\n log(\"options object not found, please specify\", \"warn\");\n\n var saAutomatedLink = function saAutomatedLink(element, type) {\n try {\n if (!element) return log(\"no element found\");\n var sent = false;\n\n var callback = function () {\n if (!sent && !element.hasAttribute(\"target\"))\n document.location = element.getAttribute(\"href\");\n sent = true;\n };\n\n if (window[saGlobal] && window[saGlobal + \"_loaded\"]) {\n var hostname = element.hostname;\n var pathname = element.pathname;\n\n var event;\n var metadata = {\n title: element.getAttribute(\"title\") || undefined,\n };\n var url = element.href || undefined;\n\n var useTitle = false;\n if (optionsLink.title && element.hasAttribute(\"title\")) {\n var theTitle = element.getAttribute(\"title\").trim();\n if (theTitle != \"\") useTitle = true;\n }\n\n if (useTitle) {\n event = theTitle;\n } else {\n switch (type) {\n case \"outbound\": {\n event = hostname + (optionsLink.outboundFullUrl ? pathname : \"\");\n metadata.url = url;\n break;\n }\n case \"download\": {\n event = optionsLink.downloadsFullUrl\n ? hostname + pathname\n : pathname.split(\"/\").pop();\n metadata.url = url;\n break;\n }\n case \"email\": {\n var href = element.getAttribute(\"href\");\n event = (href.split(\":\")[1] || \"\").split(\"?\")[0];\n metadata.email = event;\n break;\n }\n }\n }\n\n var clean =\n type +\n \"_\" +\n event.replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_+|_+$)/g, \"\");\n\n window[saGlobal](clean, metadata, callback);\n\n log(\"collected \" + clean);\n\n return type === \"email\"\n ? callback()\n : window.setTimeout(callback, 5000);\n } else {\n log(saGlobal + \" is not defined\", \"warn\");\n return callback();\n }\n } catch (error) {\n log(error.message, \"warn\");\n }\n };\n\n window.saAutomatedLink = saAutomatedLink;\n\n function collectLink(link, onclick) {\n if (link.hasAttribute(\"data-simple-event\")) return;\n var collect = false;\n\n // Collect download clicks\n if (\n optionsLink.downloads &&\n /^https?:\\/\\//i.test(link.href) &&\n new RegExp(\n \"\\\\.(\" + (optionsLink.downloadsExtensions || []).join(\"|\") + \")$\",\n \"i\"\n ).test(link.pathname)\n ) {\n collect = \"download\";\n\n // Collect outbound links clicks\n } else if (\n optionsLink.outbound &&\n /^https?:\\/\\//i.test(link.href) &&\n link.hostname !== window.location.hostname\n ) {\n collect = \"outbound\";\n\n // Collect email clicks\n } else if (optionsLink.emails && /^mailto:/i.test(link.href)) {\n collect = \"email\";\n }\n\n if (!collect) return;\n\n if (onclick) {\n var onClickAttribute = \"saAutomatedLink(this, '\" + collect + \"');\";\n\n if (\n !link.hasAttribute(\"target\") ||\n link.getAttribute(\"target\") === \"_self\"\n )\n onClickAttribute += \" return false;\";\n\n link.setAttribute(\"onclick\", onClickAttribute);\n } else {\n link.addEventListener(\"click\", function () {\n saAutomatedLink(link, collect);\n });\n }\n }\n\n function onDOMContentLoaded() {\n try {\n var a = document.getElementsByTagName(\"a\");\n\n // Loop over all links on the page\n for (var i = 0; i < a.length; i++) {\n var link = a[i];\n var href = link.getAttribute(\"href\");\n\n // Skip links that don't have an href\n if (!href) continue;\n\n // We don't want to overwrite website behaviour so we check for the onclick attribute\n if (!link.getAttribute(\"onclick\") && !/^mailto:/.test(href)) {\n collectLink(link, true);\n } else {\n collectLink(link, false);\n }\n }\n } catch (error) {\n log(error.message, \"warn\");\n }\n }\n\n if (doc.readyState === \"ready\" || doc.readyState === \"complete\") {\n onDOMContentLoaded();\n } else {\n document.addEventListener(\"readystatechange\", function (event) {\n if (event.target.readyState === \"complete\") onDOMContentLoaded();\n });\n }\n})(window);\n"],"names":["collectLink","link","onclick","collect","onClickAttribute","hasAttribute","optionsLink","downloads","test","href","RegExp","downloadsExtensions","join","pathname","outbound","hostname","window","location","emails","getAttribute","setAttribute","addEventListener","saAutomatedLink","onDOMContentLoaded","a","document","getElementsByTagName","i","length","error","log","message","doc","scriptElement","setting","collectTypes","fullUrls","options","saGlobal","type","logger","console","warn","info","currentScript","querySelector","attribute","defaultValue","value","dataset","split","map","item","trim","filter","Boolean","indexOf","title","outboundFullUrl","downloadsFullUrl","element","sent","callback","theTitle","metadata","undefined","url","useTitle","event","pop","email","clean","replace","setTimeout","readyState","target"],"mappings":"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"} \ No newline at end of file diff --git a/dist/v12/custom/light.js b/dist/v12/custom/light.js index 6c32467b..aac202ca 100644 --- a/dist/v12/custom/light.js +++ b/dist/v12/custom/light.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy friendly analytics (docs.simpleanalytics.com/script; 2024-03-07; 399f; SRI-version; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2025-06-13; d3bf; SRI-version; v12) */ -!function(s,e,t,u){try{var i=undefined,n="https:",r=s.console,a="doNotTrack",p=s.navigator,c=s.location,d=c.host,o=s.document,l=p.userAgent,m="Not sending request ",f=!1,g=encodeURIComponent,h=decodeURIComponent,v=JSON.stringify,y=s.addEventListener,_="https://"+t,w=(o.documentElement,"language"),b=p.userAgentData,O="platform",S="platformVersion",k="https://docs.simpleanalytics.com",j=/(bot|spider|crawl)/i.test(l)&&!/(cubot)/i.test(l),E=o.currentScript||o.querySelector('script[src*="'+t+'"]');u=function(){var e=[].slice.call(arguments);return e.unshift("Simple Analytics:"),Function.prototype.apply.call(r.warn,r,e)};var x=function(e,t){return e&&e.getAttribute("data-"+t)},A=function(){for(var e,t,n,r={},a=arguments,o=0;o>e/4).toString(16)})}catch(r){return e.replace(n,function(e){var t=16*Math.random()|0;return(e<2?t:3&t|8).toString(16)})}},N="namespace",R=e[N]||x(E,N)||"sa",U=e.strictUtm||"true"==x(E,"strict-utm"),V=R+"_loaded";if(1==s[V])return u(m+"twice");s.sa_event_loaded=!0,s[V]=!0;var B,C=function(t,e,n){t=n?t:A(z,L,t),p.brave&&!n&&(t.brave=!0),p._duckduckgoloader_&&!n&&(t.duck=!0),(new Image).src=_+"/simple.gif?"+Object.keys(t).filter(function(e){return t[e]!=i}).map(function(e){return g(e)+"="+g(t[e])}).join("&")+"&time="+Date.now()},H=function(e){if(e)return e.replace(/^(https?:\/\/)?((m|l|w{2,3}([0-9]+)?)\.)?([^?#]+)(.*)$/,"$5")},T=H(e.hostname||x(E,"hostname")),$=H(T||d),F={version:"custom_light_12",hostname:$};e.mode||x(E,"mode");try{B=Intl.DateTimeFormat().resolvedOptions().timeZone}catch(W){u(W)}j&&(F.bot=!0);var z=A(F,{ua:l,https:c.protocol==n,timezone:B,page_id:I(),session_id:I()});if(z.sri=!0,b&&(z.mobile=b.mobile,z.brands=v(b.brands)),$!==d&&(z.hostname_original=d),a in p&&"1"==p[a])return u("Not sending request when "+a+" is enabled. See "+k+"/dnt");-1!=d.indexOf(".")&&!/^[0-9.:]+$/.test(d)||T||u("Set hostname on "+d+". See "+k+"/overwrite-domain-name");var J,L={},M=H((o.referrer||"").replace(d,$)),P=function(e,t){var n=A(F,{type:"append",original_id:t?e:z.page_id});t||!p.sendBeacon?C(n,0,!0):p.sendBeacon(_+"/append",v(n))};y("pagehide",P,!1);var Z,G,K=function(e){var t="";try{t=e||h(c.pathname)}catch(W){u(W)}return t},Q=function(e,t,n,r){e&&P(""+z.page_id,!0),z.page_id=I();var a,o=$+K();C({id:z.page_id,type:"pageview",referrer:!t||n?M:null,query:(a=t,c.search.slice(1).split("&").filter(function(e){return!a&&new RegExp("^((utm_)"+(U?"":"?")+"(source|medium|content|term|campaign)"+(U?"":"|ref")+")=").test(e)}).join("&")||i)}),M=o,0};!function(e,t){var n=K(t);if(n&&J!=n){J=n,L.path=n,p[w]&&(L[w]=p[w]);var r,a=s.performance,o="navigation";try{r=a.getEntriesByType(o)[0].type}catch(W){u(W)}G=r?-1<["reload","back_forward"].indexOf(r):a&&a[o]&&-1<[1,2].indexOf(a[o].type),Z=!!M&&M.split("/")[0]==d;var i=function(){f=!0,Q(e,e||G||!1,Z)};if(f)i();else try{b&&"function"==typeof b.getHighEntropyValues?b.getHighEntropyValues([O,S]).then(function(e){z.os_name=e[O],z.os_version=e[S],i()})["catch"](i):i()}catch(c){i()}}}()}catch(X){u(X)}}(window,{},""); +!function(l,e,t,f){try{var m=undefined,n="https:",r=l.console,a="doNotTrack",g=l.navigator,i=l.location,h=i.host,o=l.document,c=g.userAgent,s="Not sending request ",v=!1,u=encodeURIComponent,p=decodeURIComponent,d=JSON.stringify,y=l.addEventListener,_="https://"+t,b=(o.documentElement,"language"),w=g.userAgentData,O="platform",S="platformVersion",j="https://docs.simpleanalytics.com",k=/(bot|spider|crawl)/i.test(c)&&!/(cubot)/i.test(c),x=o.currentScript||o.querySelector('script[src*="'+t+'"]');f=function(){var e=[].slice.call(arguments);return e.unshift("Simple Analytics:"),Function.prototype.apply.call(r.warn,r,e)};var E=function(e){return"string"==typeof e},A=function(e,t){return e&&e.getAttribute("data-"+t)},$=function(){for(var e,t,n,r={},a=arguments,i=0;i>e/4).toString(16)})}catch(r){return e.replace(n,function(e){var t=16*Math.random()|0;return(e<2?t:3&t|8).toString(16)})}},N=function(e){return"function"==typeof e},R="namespace",U=e[R]||A(x,R)||"sa",V=e.strictUtm||"true"==A(x,"strict-utm"),B=function(t,e){return(e||i.search).slice(1).split("&").filter(function(e){return!t&&new RegExp("^((utm_)"+(V?"":"?")+"(source|medium|content|term|campaign)"+(V?"":"|ref")+")=").test(e)}).join("&")||m},C=U+"_loaded";if(1==l[C])return f(s+"twice");l.sa_event_loaded=!0,l[C]=!0;var H,T=function(t,e,n){t=n?t:$(L,P,t),g.brave&&!n&&(t.brave=!0),g._duckduckgoloader_&&!n&&(t.duck=!0),(new Image).src=_+"/simple.gif?"+Object.keys(t).filter(function(e){return t[e]!=m}).map(function(e){return u(e)+"="+u(t[e])}).join("&")+"&time="+Date.now()},F=e.hostname||A(x,"hostname"),z=F||h,J={version:"custom_light_12",hostname:z};e.mode||A(x,"mode");try{H=Intl.DateTimeFormat().resolvedOptions().timeZone}catch(X){f(X)}k&&(J.bot=!0);var L=$(J,{ua:c,https:i.protocol==n,timezone:H,page_id:I(),session_id:I()});if(L.sri=!0,w&&(L.mobile=w.mobile,L.brands=d(w.brands)),z!==h&&(L.hostname_original=h),a in g&&"1"==g[a])return f("Not sending request when "+a+" is enabled. See "+j+"/dnt");-1!=h.indexOf(".")&&!/^[0-9.:]+$/.test(h)||F||f("Set hostname on "+h+". See "+j+"/overwrite-domain-name");var M,P={},Z=(e.referrer||A(x,"referrer")||o.referrer||"").replace(h,z).replace(/^https?:\/\/((m|l|w{2,3}([0-9]+)?)\.)?([^?#]+)(.*)$/,"$4").replace(/^([^/]+)$/,"$1")||m,G=function(e,t){var n=$(J,{type:"append",original_id:t?e:L.page_id});if(t||!g.sendBeacon)T(n,0,!0);else try{g.sendBeacon.bind(g)(_+"/append",d(n))}catch(r){T(n,0,!0)}};y("pagehide",G,!1);var K,Q,W=function(e){var t="";try{t=e||p(i.pathname)}catch(X){f(X)}return t};!function(t,e,n,r){!r&&N(n)&&(r=n);var a,i;N(r);E(e)&&-1"); //# sourceMappingURL=light.js.map \ No newline at end of file diff --git a/dist/v12/custom/light.js.map b/dist/v12/custom/light.js.map index 5140a8ac..f64f97aa 100644 --- a/dist/v12/custom/light.js.map +++ b/dist/v12/custom/light.js.map @@ -1 +1 @@ -{"version":3,"file":"light.source.js","sources":["light.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n\n var collectMetricByString = function (metricAbbreviation) {\n return true;\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var getQueryParams = function (ignoreSource) {\n return (\n loc.search\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n if (ignore) return falseVar;\n var regex =\n \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \")=\";\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex).test(keyValue);\n })\n .join(\"&\") || undefinedVar\n );\n };\n\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n var cleanSubdomain = function (url) {\n if (!url) return;\n return url.replace(\n /^(https?:\\/\\/)?((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/,\n \"$5\"\n );\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname = cleanSubdomain(\n overwriteOptions.hostname || attr(scriptElement, \"hostname\")\n );\n\n var definedHostname = cleanSubdomain(\n overwrittenHostname || locationHostname\n );\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n\n\n\n\n\n\n\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var bot = isBotAgent;\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = trueVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n return cleanSubdomain(\n (doc.referrer || \"\").replace(locationHostname, definedHostname)\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n nav.sendBeacon(fullApiUrl + \"/append\", stringify(append));\n }\n };\n\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n\n\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n metadata\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n\n sendData({\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: getQueryParams(deleteSourceInfo),\n\n });\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (isPushState, pathOverwrite, metadata) {\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n sameSite = referrer\n ? referrer.split(slash)[0] == locationHostname\n : falseVar;\n\n\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n sendPageView(\n isPushState,\n isPushState || userNavigated || !collectMetricByString(\"r\"), // r = referrers\n sameSite,\n metadata\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n\n\n pageview();\n\n } catch (e) {\n warn(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_light_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","warn","undefinedVar","undefined","https","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","language","documentElement","uaData","userAgentData","platformText","platformVersionText","docsUrl","isBotAgent","test","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","attr","attribute","getAttribute","assign","obj","prop","object","to","arg","index","length","nextSource","constructor","Object","nextKey","hasOwnProperty","settings","sa_settings","logSettings","keys","Date","now","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","replace","c","getRandomValues","Uint8Array","toString","error","r","Math","random","namespaceText","namespace","strictUtm","loadedVariable","sa_event_loaded","timezone","sendData","data","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","Image","src","filter","key","map","join","cleanSubdomain","url","overwrittenHostname","hostname","definedHostname","basePayload","version","mode","Intl","DateTimeFormat","resolvedOptions","timeZone","bot","ua","protocol","page_id","session_id","sri","mobile","brands","hostname_original","indexOf","lastSendPath","referrer","sendOnLeave","id","push","append","type","original_id","sendBeacon","sameSite","userNavigated","getPath","overwrite","path","pathname","sendPageView","isPushState","deleteSourceInfo","metadata","ignoreSource","currentPage","query","search","split","keyValue","RegExp","pages","pathOverwrite","performaceEntryType","perf","performance","navigationText","getEntriesByType","triggerSendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","e","pageview"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"light.source.js","sources":["light.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n\n var collectMetricByString = function (metricAbbreviation) {\n // eslint-disable-next-line no-unreachable\n return true;\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n return (\n (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n if (ignore) return falseVar;\n // eslint-disable-next-line no-redeclare\n var regex =\n \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \")=\";\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex).test(keyValue);\n })\n .join(\"&\") || undefinedVar\n );\n };\n\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n\n\n\n\n\n\n\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n // eslint-disable-next-line no-redeclare\n var bot = isBotAgent;\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = trueVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n\n\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n query,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query || getQueryParams(deleteSourceInfo),\n\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n sameSite = referrer\n ? referrer.split(slash)[0] == locationHostname\n : falseVar;\n\n\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch ? getQueryParams(delSrc, querySearch) : undefinedVar,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n\n\n pageview();\n\n } catch (e) {\n warn(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_light_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","warn","undefinedVar","undefined","https","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","language","documentElement","uaData","userAgentData","platformText","platformVersionText","docsUrl","isBotAgent","test","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","isString","string","attr","attribute","getAttribute","assign","obj","prop","object","to","arg","index","length","nextSource","constructor","Object","nextKey","hasOwnProperty","settings","sa_settings","logSettings","keys","Date","now","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","replace","c","getRandomValues","Uint8Array","toString","error","r","Math","random","isFunction","func","namespaceText","namespace","strictUtm","getQueryParams","ignoreSource","overwriteSearch","search","split","filter","keyValue","RegExp","join","loadedVariable","sa_event_loaded","timezone","sendData","data","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","Image","src","key","map","overwrittenHostname","hostname","definedHostname","basePayload","version","mode","Intl","DateTimeFormat","resolvedOptions","timeZone","bot","ua","protocol","page_id","session_id","sri","mobile","brands","hostname_original","indexOf","lastSendPath","referrer","sendOnLeave","id","push","append","type","original_id","sendBeacon","bind","e","sameSite","userNavigated","getPath","overwrite","path","pathname","isPushState","pathOverwrite","metadata","callbackRaw","querySearch","parts","shift","performaceEntryType","perf","performance","navigationText","getEntriesByType","triggerSendPageView","delSrc","deleteSourceInfo","query","currentPage","pages","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","pageview"],"mappings":";;CAEA,SACEA,EACAC,EACAC,EAKAC,GAEA,IAQE,IAAIC,EAAeC,UAIfC,EAAQ,SAKRC,EAAMP,EAAOQ,QACbC,EAAa,aACbC,EAAMV,EAAOW,UACbC,EAAMZ,EAAOa,SACbC,EAAmBF,EAAIG,KACvBC,EAAMhB,EAAOiB,SACbC,EAAYR,EAAIQ,UAChBC,EAAa,uBAEbC,GAhBW,EAiBXC,EAAyBC,mBACzBC,EAAyBC,mBACzBC,EAAYC,KAAKD,UAEjBE,EAAuB3B,EAAO4B,iBAC9BC,EAhBWvB,WAgB4BJ,EAEvC4B,GADkBd,EAAIe,gBACX,YAIXC,EAAStB,EAAIuB,cAMbC,EAAe,WACfC,EAAsB,kBACtBC,EAAU,mCAEVC,EACF,sBAAsBC,KAAKpB,KAAe,WAAWoB,KAAKpB,GAIxDqB,EACFvB,EAAIwB,eAAiBxB,EAAIyB,cAAc,gBAAkBvC,EAAU,MAOrEC,EAAO,WAEL,IAAIuC,EAAO,GAAGC,MAAMC,KAAKC,WAOzB,OAJAH,EAAKI,QAAQ,qBAINC,SAASC,UAAUC,MAAML,KAAKrC,EAAIJ,KAAMI,EAAKmC,IAGtD,IAQIQ,EAAW,SAAUC,GACvB,MAAwB,iBAAVA,GAOZC,EAAO,SAAUb,EAAec,GAClC,OAAOd,GAAiBA,EAAce,aAAa,QAAUD,IAe3DE,EAAS,WAGX,IAFA,IA7BsBC,EAAKC,EAwBJC,EAKnBC,EAAK,GACLC,EAAMf,UACDgB,EAAQ,EAAGA,EAAQD,EAAIE,OAAQD,IAAS,CAC/C,IAAIE,EAAaH,EAAIC,GACrB,IATqBH,EASRK,IAREL,EAAOM,cAAgBC,OASpC,IAAK,IAAIC,KAAWH,EAlCFP,EAmCJO,EAnCSN,EAmCGS,EAlCvBD,OAAOjB,UAAUmB,eAAevB,KAAKY,EAAKC,KAmCzCE,EAAGO,GAAWH,EAAWG,IAKjC,OAAOP,GAGLS,EAAWpE,EAAOqE,YAClBC,EAAcF,GAAYH,OAAOM,KAAKtE,GAAkB6D,OAG5D7D,EAAmBsD,EAAOtD,EAAkBmE,GAExCE,GAAanE,EAAK,WAAYF,GAQxBuE,KAAKC,IALf,IAOIC,EAAO,WACT,IAAIC,EAAe3E,EAAO4E,QAAU5E,EAAO6E,SACvCC,EAAY,CAAC,MAAQ,KAAO,KAAO,KAAO,KAC1CC,EAAY,SAEhB,IACE,OAAOD,EAAUE,QAAQD,EAAW,SAAUE,GAC5C,OACEA,EACCN,EAAaO,gBAAgB,IAAIC,WAAW,IAAI,GAC9C,IAAOF,EAAI,GACdG,SAAS,MAEb,MAAOC,GACP,OAAOP,EAAUE,QAAQD,EAAW,SAAUE,GAC5C,IAAIK,EAAqB,GAAhBC,KAAKC,SAAiB,EAE/B,OADMP,EAAI,EAAIK,EAAS,EAAJA,EAAW,GACrBF,SAAS,QAKpBK,EAAa,SAAUC,GACzB,MAAsB,mBAARA,GAIZC,EAAgB,YAChBC,EACF3F,EAAiB0F,IACjBvC,EAAKb,EAAeoD,IA4ZxB,KAlZME,EACF5F,EAAiB4F,WAvKJ,QAwKbzC,EAAKb,EAAe,cAElBuD,EAAiB,SAAUC,EAAcC,GAC3C,OACGA,GAAmBpF,EAAIqF,QACrBtD,MAAM,GACNuD,MAAM,KACNC,OAAO,SAAUC,GAGhB,OAFaL,GAaN,IAAIM,OART,YACCR,EAAY,GAAK,KAClB,yCACCA,EAAY,GAAK,QAClB,MAIuBvD,KAAK8D,KAE/BE,KAAK,MAAQlG,GAWhBmG,EAAiBX,EAAY,UACjC,GA7Mc,GA6MV5F,EAAOuG,GAA4B,OAAOpG,EAAKgB,EAAa,SAChEnB,EAAOwG,iBA9MO,EA+MdxG,EAAOuG,IA/MO,EAsNd,IA4DIE,EA5DAC,EAAW,SAAUC,EAAMC,EAAUC,GACvCF,EAAOE,EAAeF,EAAOpD,EAAOuD,EAASC,EAAMJ,GAE/CjG,EAAIsG,QAAUH,IAAcF,EAAKK,OAzNzB,GA0NRtG,EAAIuG,qBAAuBJ,IAAcF,EAAKO,MA1NtC,IA6NA,IAAIC,OACVC,IACJvF,EACA,eACAoC,OAAOM,KAAKoC,GACTR,OAAO,SAAUkB,GAChB,OAAOV,EAAKU,IAAQjH,IAErBkH,IAAI,SAAUD,GACb,OACEhG,EAAuBgG,GACvB,IACAhG,EAAuBsF,EAAKU,MAG/Bf,KAAK,KACR,SACA9B,KAAKC,OAIL8C,EACFtH,EAAiBuH,UAAYpE,EAAKb,EAAe,YAC/CkF,EAAkBF,GAAuBzG,EAEzC4G,EAAc,CAChBC,QAkUJ,kBAjUIH,SAAUC,GAeDxH,EAAiB2H,MAAQxE,EAAKb,EAAe,QAYxD,IAEEkE,EACIoB,KAAKC,iBAAiBC,kBAAkBC,SAE5C,MAAO3C,GACPlF,EAAKkF,GAQGhD,IAMDqF,EAAYO,KAvSP,GAySd,IAAInB,EAAUvD,EAAOmE,EAAa,CAEhCQ,GAAkChH,EAElCZ,MAAOM,EAAIuH,UAAY7H,EACvBmG,SAAUA,EACV2B,QAA8B1D,IAG9B2D,WAA0C3D,MAwB5C,GArBAoC,EAAQwB,KArTM,EAyTVtG,IACF8E,EAAQyB,OAASvG,EAAOuG,OACxBzB,EAAQ0B,OAAS/G,EAAUO,EAAOwG,SAWhCf,IAAoB3G,IACtBgG,EAAQ2B,kBAAoB3H,GAG1BL,KAAcC,GAA0B,KAAnBA,EAAID,GAC3B,OAAON,EA3TYgB,4BA4TAV,EAAa,oBAAsB2B,EAAU,SAK7B,GAAlCtB,EAAiB4H,QAAQ,OACxB,aAAapG,KAAKxB,IACnByG,GAEDpH,EACE,mBACEW,EACA,SACAsB,EACA,0BAON,IACIuG,EADA5B,EAAO,GAiBP6B,GAXA3I,EAAiB2I,UAAYxF,EAAKb,EAAe,aAGzBvB,EAAI4H,UAAY,IACrC5D,QAAQlE,EAAkB2G,GAC1BzC,QAAQ,sDAAuD,MAC/DA,QAAQ,YAAa,OAAS5E,EAcjCyI,EAAc,SAAUC,EAAIC,GAG9B,IAAIC,EAASzF,EAAOmE,EAAa,CAC/BuB,KAAM,SACNC,YAAaH,EAAOD,EAAKhC,EAAQsB,UAKnC,GAAIW,IAASrI,EAAIyI,WAEfzC,EAASsC,EAAQ5I,GAvYP,QAyYV,IACEM,EAAIyI,WAAWC,KAAK1I,EAApBA,CAAyBmB,EAAa,UAAWJ,EAAUuH,IAC3D,MAAOK,GAEP3C,EAASsC,EAAQ5I,GA7YT,KAmZduB,EAjXe,WAiXgBkH,GAlZhB,GAyZf,IAkDIS,EAAUC,EAlDVC,EAAU,SAAUC,GACtB,IAAIC,EAAO,GAIX,IACEA,EAAOD,GAAalI,EAAuBX,EAAI+I,UAC/C,MAAOtE,GACPlF,EAAKkF,GAMP,OAAOqE,IAsCM,SACbE,EACAC,EACAC,EACAC,IAEKA,GAAetE,EAAWqE,KAAWC,EAAcD,GACxD,IACIE,EAGEC,EAJSxE,EAAWsE,GAEtB7G,EAAS2G,KAAgD,EAA9BA,EAAcnB,QAAQ,OAGnDmB,GADII,EAAQJ,EAAc3D,MAAM,MACVgE,QACtBF,EAAc,IAAMC,EAAM3D,KAAK,MAGjC,IAAIoD,EAAOF,EAAQK,GAGnB,GAAKH,GAAQf,GAAgBe,EAA7B,CAEAf,EAAee,EACf3C,EAAK2C,KAAOA,EAKNhJ,EAAIoB,KAAWiF,EAAKjF,GAAYpB,EAAIoB,IAK1C,IAIIqI,EAJAC,EAAOpK,EAAOqK,YACdC,EAAiB,aAIrB,IACEH,EAAsBC,EAAKG,iBAAiBD,GAAgB,GAAGrB,KAC/D,MAAO5D,GACPlF,EAAKkF,GAGPkE,EAAgBY,GAC+C,EAA3D,CAAC,SAAU,gBAAgBzB,QAAQyB,GAGnCC,GACAA,EAAKE,KACwC,EAA7C,CAAC,EAAG,GAAG5B,QAAQ0B,EAAKE,GAAgBrB,MAGxCK,IAAWV,GACPA,EAAS1C,MA7fH,KA6fgB,IAAMpF,EAKhC,IAAI0J,EAAsB,WACxBpJ,GAzgBU,EA0gBV,IAAIqJ,EACFb,GAAeL,IAAiB,GA7FnB,SACjBK,EACAc,EACApB,EACAqB,GAIIf,GAAaf,EAAY,GAAK/B,EAAQsB,SAtb9B,GAubYtB,EAAQsB,QAAU1D,IAE1C,IAAIkG,EAAcnD,EAAkB+B,IAEpC9C,EACE,CACEoC,GAAIhC,EAAQsB,QACZa,KA1ba,WA2bbL,UAAW8B,GAAoBpB,EAAWV,EAAW,KACrD+B,MAAOA,GAAS7E,EAAe4E,KAOnC9B,EAAWgC,EAEXC,EAmEEC,CACElB,EACAa,EACAnB,EACAU,EAAclE,EAAe2E,EAAQT,GAAe5J,IAMxD,GAAKgB,EAmBHoJ,SAjBA,IACMxI,GAAUyD,EAAWzD,EAAO+I,sBAC9B/I,EACG+I,qBAAqB,CAAC7I,EAAcC,IACpC6I,KAAK,SAAUC,GACdnE,EAAQoE,QAAUD,EAAkB/I,GACpC4E,EAAQqE,WAAaF,EAAkB9I,GACvCqI,MAEDY,SAAMZ,GAETA,IAEF,MAAOnB,GACPmB,MASNa,GAEA,MAAOhC,GACPlJ,EAAKkJ,IArkBT,CAwkBErJ,OACA,uBACA"} \ No newline at end of file diff --git a/dist/v12/custom/proxy.js b/dist/v12/custom/proxy.js index 6b2edecf..37fbcb06 100644 --- a/dist/v12/custom/proxy.js +++ b/dist/v12/custom/proxy.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy friendly analytics (docs.simpleanalytics.com/script; 2024-03-07; 871f; SRI-version; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2025-06-13; 87b1; SRI-version; v12) */ -!function(l,t,e,n,p){try{var f=undefined,h=!0,d=!1,r="true",a="https:",m="pageview",u="event",i="error",o=l.console,c="doNotTrack",g=l.navigator,s=l.location,v=s.host,y=l.document,_=g.userAgent,w="Not sending request ",b=w+"when ",x=d,E=encodeURIComponent,O=decodeURIComponent,S=JSON.stringify,M=l.addEventListener,k="https://"+e,A=y.documentElement||{},q="language",j="Height",D="scroll",$=g.userAgentData,C=D+j,H="offset"+j,P="client"+j,R="pagehide",T="platform",U="platformVersion",I="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(_)&&!/(cubot)/i.test(_),N=l.screen,z=y.currentScript||y.querySelector('script[src*="'+e+'"]');p=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){p("Error in your "+t+" function:",e)},W=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},G=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},J=function(t,e){return t&&t.getAttribute("data-"+e)},L=function(t){return Array.isArray(t)?t:"string"==typeof t&&t.length?t.split(/, ?/):[]},Y=function(t){return t&&t.constructor===Object},Z=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},rt=function(t){return"function"==typeof t},at="namespace",it=t[at]||J(z,at)||"sa",ot=l[it+"_metadata"],ct=function(t,e){Y(ot)&&(t=Z(t,ot));var n=l[kt];if(!rt(n))return t;try{return Z(t,n.call(l,Z(t,e)))}catch(r){F("metadata",r)}},st=t.strictUtm||J(z,"strict-utm")==r,ut=function(a){return s.search.slice(1).split("&").filter(function(t){var e=a||!tt("ut"),n=Ot.map(G).join("|"),r=e?"^("+n+")=":"^((utm_)"+(st?"":"?")+"(source|medium|content|term|campaign)"+(st?"":"|ref")+"|"+n+")=";return e&&!Ot.length?d:new RegExp(r).test(t)}).join("&")||f},lt=it+"_loaded";if(l[lt]==h)return p(w+"twice");l.sa_event_loaded=h,l[lt]=h;var pt=function(e,t,n){e=n?e:Z(Dt,Ht,e),g.brave&&!n&&(e.brave=h),g._duckduckgoloader_&&!n&&(e.duck=h);var r=new Image;t&&(r.onerror=t,r.onload=t),r.src=k+"/simple.gif?"+Object.keys(e).filter(function(t){return e[t]!=f}).map(function(t){return E(t)+"="+E(e[t])}).join("&")+"&time="+Date.now()},ft=function(t){if(t)return t.replace(/^(https?:\/\/)?((m|l|w{2,3}([0-9]+)?)\.)?([^?#]+)(.*)$/,"$5")},ht=ft(t.hostname||J(z,"hostname")),dt=ft(ht||v),mt={version:"custom_proxy_12",hostname:dt};n=function(t){t=t.stack?t+" "+t.stack:t,p(t),pt(Z(mt,{type:i,error:t,path:s.pathname}),f,h)},M(i,function(t){t.filename&&-1"); +!function(d,t,e,n,m){try{var g=undefined,v=!0,y=!1,r="true",a="https:",_="pageview",u="event",i="error",o=d.console,c="doNotTrack",w=d.navigator,s=d.location,b=s.host,l=d.document,p=w.userAgent,f="Not sending request ",h=f+"when ",x=y,O=encodeURIComponent,E=decodeURIComponent,S=JSON.stringify,M=d.addEventListener,k="https://"+e,A=l.documentElement||{},q="language",$="Height",j="scroll",D=w.userAgentData,C=j+$,H="offset"+$,P="client"+$,R="pagehide",T="platform",U="platformVersion",I="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),N=d.screen,z=l.currentScript||l.querySelector('script[src*="'+e+'"]');m=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){m("Error in your "+t+" function:",e)},W=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},G=function(t){return"string"==typeof t},J=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},L=function(t,e){return t&&t.getAttribute("data-"+e)},Y=function(t){return Array.isArray(t)?t:G(t)&&t.length?t.split(/, ?/):[]},Z=function(t){return t&&t.constructor===Object},K=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},at=function(t){return"function"==typeof t},it="namespace",ot=t[it]||L(z,it)||"sa",ct=function(t,e){var n=d[ot+"_metadata"];Z(n)&&(t=K(t,n));var r=d[Mt];if(!at(r))return t;try{return K(t,r.call(d,K(t,e)))}catch(a){F("metadata",a)}},st=t.strictUtm||L(z,"strict-utm")==r,ut=function(a,t){return(t||s.search).slice(1).split("&").filter(function(t){var e=a||!et("ut"),n=Ot.map(J).join("|"),r=e?"^("+n+")=":"^((utm_)"+(st?"":"?")+"(source|medium|content|term|campaign)"+(st?"":"|ref")+"|"+n+")=";return e&&!Ot.length?y:new RegExp(r).test(t)}).join("&")||g},lt=ot+"_loaded";if(d[lt]==v)return m(f+"twice");d.sa_event_loaded=v,d[lt]=v;var pt=function(e,t,n){e=n?e:K($t,Ct,e),w.brave&&!n&&(e.brave=v),w._duckduckgoloader_&&!n&&(e.duck=v);var r=new Image;t&&(r.onerror=t,r.onload=t),r.src=k+"/simple.gif?"+Object.keys(e).filter(function(t){return e[t]!=g}).map(function(t){return O(t)+"="+O(e[t])}).join("&")+"&time="+Date.now()},ft=t.hostname||L(z,"hostname"),ht=ft||b,dt={version:"custom_proxy_12",hostname:ht};n=function(t){t=t.stack?t+" "+t.stack:t,m(t),pt(K(dt,{type:i,error:t,path:s.pathname}),g,v)},M(i,function(t){t.filename&&-1"); //# sourceMappingURL=proxy.js.map \ No newline at end of file diff --git a/dist/v12/custom/proxy.js.map b/dist/v12/custom/proxy.js.map index 58bf1b76..da4422bb 100644 --- a/dist/v12/custom/proxy.js.map +++ b/dist/v12/custom/proxy.js.map @@ -1 +1 @@ -{"version":3,"file":"proxy.source.js","sources":["proxy.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var metadataObject = window[namespace + \"_metadata\"];\n var appendMetadata = function (metadata, data) {\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) return metadata;\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var getQueryParams = function (ignoreSource) {\n return (\n loc.search\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex).test(keyValue);\n })\n .join(\"&\") || undefinedVar\n );\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n var cleanSubdomain = function (url) {\n if (!url) return;\n return url.replace(\n /^(https?:\\/\\/)?((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/,\n \"$5\"\n );\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname = cleanSubdomain(\n overwriteOptions.hostname || attr(scriptElement, \"hostname\")\n );\n\n var definedHostname = cleanSubdomain(\n overwrittenHostname || locationHostname\n );\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = trueVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n return cleanSubdomain(\n (doc.referrer || \"\").replace(locationHostname, definedHostname)\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n nav.sendBeacon(fullApiUrl + \"/append\", stringify(append));\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n metadata\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n\n sendData({\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: getQueryParams(deleteSourceInfo),\n\n metadata: stringify(metadata),\n });\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (isPushState, pathOverwrite, metadata) {\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n sendPageView(\n isPushState,\n isPushState || userNavigated || !collectMetricByString(\"r\"), // r = referrers\n sameSite,\n metadata\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata) {\n pageview(0, path, metadata);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_proxy_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","metadataObject","appendMetadata","metadata","data","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","search","keyValue","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","cleanSubdomain","url","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","indexOf","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","protocol","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","i","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","e","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","callbackRaw","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue","q"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"proxy.source.js","sources":["proxy.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) return metadata;\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n return (\n (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex).test(keyValue);\n })\n .join(\"&\") || undefinedVar\n );\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = trueVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n query,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query || getQueryParams(deleteSourceInfo),\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch ? getQueryParams(delSrc, querySearch) : undefinedVar,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_proxy_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","search","keyValue","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","indexOf","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","protocol","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","i","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","query","currentPage","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue","q"],"mappings":"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"} \ No newline at end of file diff --git a/dist/v12/light.js b/dist/v12/light.js index 0a19a5fa..34e86dd8 100644 --- a/dist/v12/light.js +++ b/dist/v12/light.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy friendly analytics (docs.simpleanalytics.com/script; 2024-03-07; 5782; SRI-version; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2025-06-13; 95f8; SRI-version; v12) */ -!function(s,e,t,u){try{var i=undefined,n="https:",r=s.console,a="doNotTrack",p=s.navigator,c=s.location,d=c.host,o=s.document,l=p.userAgent,m="Not sending request ",f=!1,g=encodeURIComponent,h=decodeURIComponent,v=JSON.stringify,y=s.addEventListener,_="https://queue."+t,w=(o.documentElement,"language"),b=p.userAgentData,O="platform",S="platformVersion",k="https://docs.simpleanalytics.com",j=/(bot|spider|crawl)/i.test(l)&&!/(cubot)/i.test(l),E=o.currentScript||o.querySelector('script[src*="'+t+'"]');u=function(){var e=[].slice.call(arguments);return e.unshift("Simple Analytics:"),Function.prototype.apply.call(r.warn,r,e)};var q=function(e,t){return e&&e.getAttribute("data-"+t)},A=function(){for(var e,t,n,r={},a=arguments,o=0;o>e/4).toString(16)})}catch(r){return e.replace(n,function(e){var t=16*Math.random()|0;return(e<2?t:3&t|8).toString(16)})}},N="namespace",R=e[N]||q(E,N)||"sa",U=e.strictUtm||"true"==q(E,"strict-utm"),V=R+"_loaded";if(1==s[V])return u(m+"twice");s.sa_event_loaded=!0,s[V]=!0;var B,C=function(t,e,n){t=n?t:A(z,L,t),p.brave&&!n&&(t.brave=!0),p._duckduckgoloader_&&!n&&(t.duck=!0),(new Image).src=_+"/simple.gif?"+Object.keys(t).filter(function(e){return t[e]!=i}).map(function(e){return g(e)+"="+g(t[e])}).join("&")+"&time="+Date.now()},T=function(e){if(e)return e.replace(/^(https?:\/\/)?((m|l|w{2,3}([0-9]+)?)\.)?([^?#]+)(.*)$/,"$5")},$=T(e.hostname||q(E,"hostname")),F=T($||d),H={version:"cdn_light_12",hostname:F};e.mode||q(E,"mode");try{B=Intl.DateTimeFormat().resolvedOptions().timeZone}catch(W){u(W)}j&&(H.bot=!0);var z=A(H,{ua:l,https:c.protocol==n,timezone:B,page_id:I(),session_id:I()});if(z.sri=!0,b&&(z.mobile=b.mobile,z.brands=v(b.brands)),F!==d&&(z.hostname_original=d),a in p&&"1"==p[a])return u("Not sending request when "+a+" is enabled. See "+k+"/dnt");-1!=d.indexOf(".")&&!/^[0-9.:]+$/.test(d)||$||u("Set hostname on "+d+". See "+k+"/overwrite-domain-name");var J,L={},M=T((o.referrer||"").replace(d,F)),P=function(e,t){var n=A(H,{type:"append",original_id:t?e:z.page_id});t||!p.sendBeacon?C(n,0,!0):p.sendBeacon(_+"/append",v(n))};y("pagehide",P,!1);var Z,G,K=function(e){var t="";try{t=e||h(c.pathname)}catch(W){u(W)}return t},Q=function(e,t,n,r){e&&P(""+z.page_id,!0),z.page_id=I();var a,o=F+K();C({id:z.page_id,type:"pageview",referrer:!t||n?M:null,query:(a=t,c.search.slice(1).split("&").filter(function(e){return!a&&new RegExp("^((utm_)"+(U?"":"?")+"(source|medium|content|term|campaign)"+(U?"":"|ref")+")=").test(e)}).join("&")||i)}),M=o,0};!function(e,t){var n=K(t);if(n&&J!=n){J=n,L.path=n,p[w]&&(L[w]=p[w]);var r,a=s.performance,o="navigation";try{r=a.getEntriesByType(o)[0].type}catch(W){u(W)}G=r?-1<["reload","back_forward"].indexOf(r):a&&a[o]&&-1<[1,2].indexOf(a[o].type),Z=!!M&&M.split("/")[0]==d;var i=function(){f=!0,Q(e,e||G||!1,Z)};if(f)i();else try{b&&"function"==typeof b.getHighEntropyValues?b.getHighEntropyValues([O,S]).then(function(e){z.os_name=e[O],z.os_version=e[S],i()})["catch"](i):i()}catch(c){i()}}}()}catch(X){u(X)}}(window,{},"simpleanalyticscdn.com"); +!function(l,e,t,f){try{var m=undefined,n="https:",r=l.console,a="doNotTrack",g=l.navigator,i=l.location,h=i.host,o=l.document,c=g.userAgent,s="Not sending request ",v=!1,u=encodeURIComponent,p=decodeURIComponent,d=JSON.stringify,y=l.addEventListener,_="https://queue."+t,b=(o.documentElement,"language"),w=g.userAgentData,O="platform",S="platformVersion",j="https://docs.simpleanalytics.com",k=/(bot|spider|crawl)/i.test(c)&&!/(cubot)/i.test(c),E=o.currentScript||o.querySelector('script[src*="'+t+'"]');f=function(){var e=[].slice.call(arguments);return e.unshift("Simple Analytics:"),Function.prototype.apply.call(r.warn,r,e)};var q=function(e){return"string"==typeof e},x=function(e,t){return e&&e.getAttribute("data-"+t)},A=function(){for(var e,t,n,r={},a=arguments,i=0;i>e/4).toString(16)})}catch(r){return e.replace(n,function(e){var t=16*Math.random()|0;return(e<2?t:3&t|8).toString(16)})}},N=function(e){return"function"==typeof e},R="namespace",U=e[R]||x(E,R)||"sa",V=e.strictUtm||"true"==x(E,"strict-utm"),B=function(t,e){return(e||i.search).slice(1).split("&").filter(function(e){return!t&&new RegExp("^((utm_)"+(V?"":"?")+"(source|medium|content|term|campaign)"+(V?"":"|ref")+")=").test(e)}).join("&")||m},C=U+"_loaded";if(1==l[C])return f(s+"twice");l.sa_event_loaded=!0,l[C]=!0;var T,F=function(t,e,n){t=n?t:A(L,P,t),g.brave&&!n&&(t.brave=!0),g._duckduckgoloader_&&!n&&(t.duck=!0),(new Image).src=_+"/simple.gif?"+Object.keys(t).filter(function(e){return t[e]!=m}).map(function(e){return u(e)+"="+u(t[e])}).join("&")+"&time="+Date.now()},H=e.hostname||x(E,"hostname"),z=H||h,J={version:"cdn_light_12",hostname:z};e.mode||x(E,"mode");try{T=Intl.DateTimeFormat().resolvedOptions().timeZone}catch(X){f(X)}k&&(J.bot=!0);var L=A(J,{ua:c,https:i.protocol==n,timezone:T,page_id:I(),session_id:I()});if(L.sri=!0,w&&(L.mobile=w.mobile,L.brands=d(w.brands)),z!==h&&(L.hostname_original=h),a in g&&"1"==g[a])return f("Not sending request when "+a+" is enabled. See "+j+"/dnt");-1!=h.indexOf(".")&&!/^[0-9.:]+$/.test(h)||H||f("Set hostname on "+h+". See "+j+"/overwrite-domain-name");var M,P={},Z=(e.referrer||x(E,"referrer")||o.referrer||"").replace(h,z).replace(/^https?:\/\/((m|l|w{2,3}([0-9]+)?)\.)?([^?#]+)(.*)$/,"$4").replace(/^([^/]+)$/,"$1")||m,G=function(e,t){var n=A(J,{type:"append",original_id:t?e:L.page_id});if(t||!g.sendBeacon)F(n,0,!0);else try{g.sendBeacon.bind(g)(_+"/append",d(n))}catch(r){F(n,0,!0)}};y("pagehide",G,!1);var K,Q,W=function(e){var t="";try{t=e||p(i.pathname)}catch(X){f(X)}return t};!function(t,e,n,r){!r&&N(n)&&(r=n);var a,i;N(r);q(e)&&-1> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var getQueryParams = function (ignoreSource) {\n return (\n loc.search\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n if (ignore) return falseVar;\n var regex =\n \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \")=\";\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex).test(keyValue);\n })\n .join(\"&\") || undefinedVar\n );\n };\n\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n var cleanSubdomain = function (url) {\n if (!url) return;\n return url.replace(\n /^(https?:\\/\\/)?((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/,\n \"$5\"\n );\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname = cleanSubdomain(\n overwriteOptions.hostname || attr(scriptElement, \"hostname\")\n );\n\n var definedHostname = cleanSubdomain(\n overwrittenHostname || locationHostname\n );\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n\n\n\n\n\n\n\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var bot = isBotAgent;\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = trueVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n return cleanSubdomain(\n (doc.referrer || \"\").replace(locationHostname, definedHostname)\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n nav.sendBeacon(fullApiUrl + \"/append\", stringify(append));\n }\n };\n\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n\n\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n metadata\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n\n sendData({\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: getQueryParams(deleteSourceInfo),\n\n });\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (isPushState, pathOverwrite, metadata) {\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n sameSite = referrer\n ? referrer.split(slash)[0] == locationHostname\n : falseVar;\n\n\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n sendPageView(\n isPushState,\n isPushState || userNavigated || !collectMetricByString(\"r\"), // r = referrers\n sameSite,\n metadata\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n\n\n pageview();\n\n } catch (e) {\n warn(e);\n }\n})(\n window,\n {},\n \"simpleanalyticscdn.com\",\n \"queue.\",\n \"cdn_light_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","warn","undefinedVar","undefined","https","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","protocol","language","documentElement","uaData","userAgentData","platformText","platformVersionText","docsUrl","isBotAgent","test","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","attr","attribute","getAttribute","assign","obj","prop","object","to","arg","index","length","nextSource","constructor","Object","nextKey","hasOwnProperty","settings","sa_settings","logSettings","keys","Date","now","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","replace","c","getRandomValues","Uint8Array","toString","error","r","Math","random","namespaceText","namespace","strictUtm","loadedVariable","sa_event_loaded","timezone","sendData","data","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","Image","src","filter","key","map","join","cleanSubdomain","url","overwrittenHostname","hostname","definedHostname","basePayload","version","mode","Intl","DateTimeFormat","resolvedOptions","timeZone","bot","ua","page_id","session_id","sri","mobile","brands","hostname_original","indexOf","lastSendPath","referrer","sendOnLeave","id","push","append","type","original_id","sendBeacon","sameSite","userNavigated","getPath","overwrite","path","pathname","sendPageView","isPushState","deleteSourceInfo","metadata","ignoreSource","currentPage","query","search","split","keyValue","RegExp","pages","pathOverwrite","performaceEntryType","perf","performance","navigationText","getEntriesByType","triggerSendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","e","pageview"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"light.source.js","sources":["light.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n\n var collectMetricByString = function (metricAbbreviation) {\n // eslint-disable-next-line no-unreachable\n return true;\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n return (\n (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n if (ignore) return falseVar;\n // eslint-disable-next-line no-redeclare\n var regex =\n \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \")=\";\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex).test(keyValue);\n })\n .join(\"&\") || undefinedVar\n );\n };\n\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n\n\n\n\n\n\n\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n // eslint-disable-next-line no-redeclare\n var bot = isBotAgent;\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = trueVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n\n\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n query,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query || getQueryParams(deleteSourceInfo),\n\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n sameSite = referrer\n ? referrer.split(slash)[0] == locationHostname\n : falseVar;\n\n\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch ? getQueryParams(delSrc, querySearch) : undefinedVar,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n\n\n pageview();\n\n } catch (e) {\n warn(e);\n }\n})(\n window,\n {},\n \"simpleanalyticscdn.com\",\n \"queue.\",\n \"cdn_light_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","warn","undefinedVar","undefined","https","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","protocol","language","documentElement","uaData","userAgentData","platformText","platformVersionText","docsUrl","isBotAgent","test","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","isString","string","attr","attribute","getAttribute","assign","obj","prop","object","to","arg","index","length","nextSource","constructor","Object","nextKey","hasOwnProperty","settings","sa_settings","logSettings","keys","Date","now","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","replace","c","getRandomValues","Uint8Array","toString","error","r","Math","random","isFunction","func","namespaceText","namespace","strictUtm","getQueryParams","ignoreSource","overwriteSearch","search","split","filter","keyValue","RegExp","join","loadedVariable","sa_event_loaded","timezone","sendData","data","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","Image","src","key","map","overwrittenHostname","hostname","definedHostname","basePayload","version","mode","Intl","DateTimeFormat","resolvedOptions","timeZone","bot","ua","page_id","session_id","sri","mobile","brands","hostname_original","indexOf","lastSendPath","referrer","sendOnLeave","id","push","append","type","original_id","sendBeacon","bind","e","sameSite","userNavigated","getPath","overwrite","path","pathname","isPushState","pathOverwrite","metadata","callbackRaw","querySearch","parts","shift","performaceEntryType","perf","performance","navigationText","getEntriesByType","triggerSendPageView","delSrc","deleteSourceInfo","query","currentPage","pages","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","pageview"],"mappings":";;CAEA,SACEA,EACAC,EACAC,EAKAC,GAEA,IAQE,IAAIC,EAAeC,UAIfC,EAAQ,SAKRC,EAAMP,EAAOQ,QACbC,EAAa,aACbC,EAAMV,EAAOW,UACbC,EAAMZ,EAAOa,SACbC,EAAmBF,EAAIG,KACvBC,EAAMhB,EAAOiB,SACbC,EAAYR,EAAIQ,UAChBC,EAAa,uBAEbC,GAhBW,EAiBXC,EAAyBC,mBACzBC,EAAyBC,mBACzBC,EAAYC,KAAKD,UAEjBE,EAAuB3B,EAAO4B,iBAC9BC,EAAaC,iBAA0B5B,EAEvC6B,GADkBf,EAAIgB,gBACX,YAIXC,EAASvB,EAAIwB,cAMbC,EAAe,WACfC,EAAsB,kBACtBC,EAAU,mCAEVC,EACF,sBAAsBC,KAAKrB,KAAe,WAAWqB,KAAKrB,GAIxDsB,EACFxB,EAAIyB,eAAiBzB,EAAI0B,cAAc,gBAAkBxC,EAAU,MAOrEC,EAAO,WAEL,IAAIwC,EAAO,GAAGC,MAAMC,KAAKC,WAOzB,OAJAH,EAAKI,QAAQ,qBAINC,SAASC,UAAUC,MAAML,KAAKtC,EAAIJ,KAAMI,EAAKoC,IAGtD,IAQIQ,EAAW,SAAUC,GACvB,MAAwB,iBAAVA,GAOZC,EAAO,SAAUb,EAAec,GAClC,OAAOd,GAAiBA,EAAce,aAAa,QAAUD,IAe3DE,EAAS,WAGX,IAFA,IA7BsBC,EAAKC,EAwBJC,EAKnBC,EAAK,GACLC,EAAMf,UACDgB,EAAQ,EAAGA,EAAQD,EAAIE,OAAQD,IAAS,CAC/C,IAAIE,EAAaH,EAAIC,GACrB,IATqBH,EASRK,IAREL,EAAOM,cAAgBC,OASpC,IAAK,IAAIC,KAAWH,EAlCFP,EAmCJO,EAnCSN,EAmCGS,EAlCvBD,OAAOjB,UAAUmB,eAAevB,KAAKY,EAAKC,KAmCzCE,EAAGO,GAAWH,EAAWG,IAKjC,OAAOP,GAGLS,EAAWrE,EAAOsE,YAClBC,EAAcF,GAAYH,OAAOM,KAAKvE,GAAkB8D,OAG5D9D,EAAmBuD,EAAOvD,EAAkBoE,GAExCE,GAAapE,EAAK,WAAYF,GAQxBwE,KAAKC,IALf,IAOIC,EAAO,WACT,IAAIC,EAAe5E,EAAO6E,QAAU7E,EAAO8E,SACvCC,EAAY,CAAC,MAAQ,KAAO,KAAO,KAAO,KAC1CC,EAAY,SAEhB,IACE,OAAOD,EAAUE,QAAQD,EAAW,SAAUE,GAC5C,OACEA,EACCN,EAAaO,gBAAgB,IAAIC,WAAW,IAAI,GAC9C,IAAOF,EAAI,GACdG,SAAS,MAEb,MAAOC,GACP,OAAOP,EAAUE,QAAQD,EAAW,SAAUE,GAC5C,IAAIK,EAAqB,GAAhBC,KAAKC,SAAiB,EAE/B,OADMP,EAAI,EAAIK,EAAS,EAAJA,EAAW,GACrBF,SAAS,QAKpBK,EAAa,SAAUC,GACzB,MAAsB,mBAARA,GAIZC,EAAgB,YAChBC,EACF5F,EAAiB2F,IACjBvC,EAAKb,EAAeoD,IA4ZxB,KAlZME,EACF7F,EAAiB6F,WAvKJ,QAwKbzC,EAAKb,EAAe,cAElBuD,EAAiB,SAAUC,EAAcC,GAC3C,OACGA,GAAmBrF,EAAIsF,QACrBtD,MAAM,GACNuD,MAAM,KACNC,OAAO,SAAUC,GAGhB,OAFaL,GAaN,IAAIM,OART,YACCR,EAAY,GAAK,KAClB,yCACCA,EAAY,GAAK,QAClB,MAIuBvD,KAAK8D,KAE/BE,KAAK,MAAQnG,GAWhBoG,EAAiBX,EAAY,UACjC,GA7Mc,GA6MV7F,EAAOwG,GAA4B,OAAOrG,EAAKgB,EAAa,SAChEnB,EAAOyG,iBA9MO,EA+MdzG,EAAOwG,IA/MO,EAsNd,IA4DIE,EA5DAC,EAAW,SAAUC,EAAMC,EAAUC,GACvCF,EAAOE,EAAeF,EAAOpD,EAAOuD,EAASC,EAAMJ,GAE/ClG,EAAIuG,QAAUH,IAAcF,EAAKK,OAzNzB,GA0NRvG,EAAIwG,qBAAuBJ,IAAcF,EAAKO,MA1NtC,IA6NA,IAAIC,OACVC,IACJxF,EACA,eACAqC,OAAOM,KAAKoC,GACTR,OAAO,SAAUkB,GAChB,OAAOV,EAAKU,IAAQlH,IAErBmH,IAAI,SAAUD,GACb,OACEjG,EAAuBiG,GACvB,IACAjG,EAAuBuF,EAAKU,MAG/Bf,KAAK,KACR,SACA9B,KAAKC,OAIL8C,EACFvH,EAAiBwH,UAAYpE,EAAKb,EAAe,YAC/CkF,EAAkBF,GAAuB1G,EAEzC6G,EAAc,CAChBC,QAkUJ,eAjUIH,SAAUC,GAeDzH,EAAiB4H,MAAQxE,EAAKb,EAAe,QAYxD,IAEEkE,EACIoB,KAAKC,iBAAiBC,kBAAkBC,SAE5C,MAAO3C,GACPnF,EAAKmF,GAQGhD,IAMDqF,EAAYO,KAvSP,GAySd,IAAInB,EAAUvD,EAAOmE,EAAa,CAEhCQ,GAAkCjH,EAElCZ,MAAOM,EAAIkB,UAAYxB,EACvBoG,SAAUA,EACV0B,QAA8BzD,IAG9B0D,WAA0C1D,MAwB5C,GArBAoC,EAAQuB,KArTM,EAyTVrG,IACF8E,EAAQwB,OAAStG,EAAOsG,OACxBxB,EAAQyB,OAAS/G,EAAUQ,EAAOuG,SAWhCd,IAAoB5G,IACtBiG,EAAQ0B,kBAAoB3H,GAG1BL,KAAcC,GAA0B,KAAnBA,EAAID,GAC3B,OAAON,EA3TYgB,4BA4TAV,EAAa,oBAAsB4B,EAAU,SAK7B,GAAlCvB,EAAiB4H,QAAQ,OACxB,aAAanG,KAAKzB,IACnB0G,GAEDrH,EACE,mBACEW,EACA,SACAuB,EACA,0BAON,IACIsG,EADA3B,EAAO,GAiBP4B,GAXA3I,EAAiB2I,UAAYvF,EAAKb,EAAe,aAGzBxB,EAAI4H,UAAY,IACrC3D,QAAQnE,EAAkB4G,GAC1BzC,QAAQ,sDAAuD,MAC/DA,QAAQ,YAAa,OAAS7E,EAcjCyI,EAAc,SAAUC,EAAIC,GAG9B,IAAIC,EAASxF,EAAOmE,EAAa,CAC/BsB,KAAM,SACNC,YAAaH,EAAOD,EAAK/B,EAAQqB,UAKnC,GAAIW,IAASrI,EAAIyI,WAEfxC,EAASqC,EAAQ5I,GAvYP,QAyYV,IACEM,EAAIyI,WAAWC,KAAK1I,EAApBA,CAAyBmB,EAAa,UAAWJ,EAAUuH,IAC3D,MAAOK,GAEP1C,EAASqC,EAAQ5I,GA7YT,KAmZduB,EAjXe,WAiXgBkH,GAlZhB,GAyZf,IAkDIS,EAAUC,EAlDVC,EAAU,SAAUC,GACtB,IAAIC,EAAO,GAIX,IACEA,EAAOD,GAAalI,EAAuBX,EAAI+I,UAC/C,MAAOrE,GACPnF,EAAKmF,GAMP,OAAOoE,IAsCM,SACbE,EACAC,EACAC,EACAC,IAEKA,GAAerE,EAAWoE,KAAWC,EAAcD,GACxD,IACIE,EAGEC,EAJSvE,EAAWqE,GAEtB5G,EAAS0G,KAAgD,EAA9BA,EAAcnB,QAAQ,OAGnDmB,GADII,EAAQJ,EAAc1D,MAAM,MACV+D,QACtBF,EAAc,IAAMC,EAAM1D,KAAK,MAGjC,IAAImD,EAAOF,EAAQK,GAGnB,GAAKH,GAAQf,GAAgBe,EAA7B,CAEAf,EAAee,EACf1C,EAAK0C,KAAOA,EAKNhJ,EAAIqB,KAAWiF,EAAKjF,GAAYrB,EAAIqB,IAK1C,IAIIoI,EAJAC,EAAOpK,EAAOqK,YACdC,EAAiB,aAIrB,IACEH,EAAsBC,EAAKG,iBAAiBD,GAAgB,GAAGrB,KAC/D,MAAO3D,GACPnF,EAAKmF,GAGPiE,EAAgBY,GAC+C,EAA3D,CAAC,SAAU,gBAAgBzB,QAAQyB,GAGnCC,GACAA,EAAKE,KACwC,EAA7C,CAAC,EAAG,GAAG5B,QAAQ0B,EAAKE,GAAgBrB,MAGxCK,IAAWV,GACPA,EAASzC,MA7fH,KA6fgB,IAAMrF,EAKhC,IAAI0J,EAAsB,WACxBpJ,GAzgBU,EA0gBV,IAAIqJ,EACFb,GAAeL,IAAiB,GA7FnB,SACjBK,EACAc,EACApB,EACAqB,GAIIf,GAAaf,EAAY,GAAK9B,EAAQqB,SAtb9B,GAubYrB,EAAQqB,QAAUzD,IAE1C,IAAIiG,EAAclD,EAAkB8B,IAEpC7C,EACE,CACEmC,GAAI/B,EAAQqB,QACZa,KA1ba,WA2bbL,UAAW8B,GAAoBpB,EAAWV,EAAW,KACrD+B,MAAOA,GAAS5E,EAAe2E,KAOnC9B,EAAWgC,EAEXC,EAmEEC,CACElB,EACAa,EACAnB,EACAU,EAAcjE,EAAe0E,EAAQT,GAAe5J,IAMxD,GAAKgB,EAmBHoJ,SAjBA,IACMvI,GAAUyD,EAAWzD,EAAO8I,sBAC9B9I,EACG8I,qBAAqB,CAAC5I,EAAcC,IACpC4I,KAAK,SAAUC,GACdlE,EAAQmE,QAAUD,EAAkB9I,GACpC4E,EAAQoE,WAAaF,EAAkB7I,GACvCoI,MAEDY,SAAMZ,GAETA,IAEF,MAAOnB,GACPmB,MASNa,GAEA,MAAOhC,GACPlJ,EAAKkJ,IArkBT,CAwkBErJ,OACA,uBACA"} \ No newline at end of file From c938f2ff8cc1dab566e7ff6dc33a1accdb44a6f6 Mon Sep 17 00:00:00 2001 From: Adriaan <1079135+adriaandotcom@users.noreply.github.com> Date: Sat, 14 Jun 2025 00:56:59 +0200 Subject: [PATCH 39/62] Add tel link tracking to auto events --- src/auto-events.js | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/src/auto-events.js b/src/auto-events.js index 3f08e13f..3a6e9370 100644 --- a/src/auto-events.js +++ b/src/auto-events.js @@ -37,6 +37,7 @@ "outbound", "emails", "downloads", + "phones", ]); var fullUrls = setting("fullUrls", "bool", false); @@ -45,6 +46,7 @@ outbound: collectTypes.indexOf("outbound") > -1, emails: collectTypes.indexOf("emails") > -1, downloads: collectTypes.indexOf("downloads") > -1, + phones: collectTypes.indexOf("phones") > -1, // Downloads: enter file extensions you want to collect downloadsExtensions: setting("extensions", "array", [ "pdf", @@ -122,6 +124,12 @@ metadata.email = event; break; } + case "phone": { + var hrefPhone = element.getAttribute("href"); + event = (hrefPhone.split(":")[1] || "").split("?")[0]; + metadata.phone = event; + break; + } } } @@ -174,6 +182,10 @@ // Collect email clicks } else if (optionsLink.emails && /^mailto:/i.test(link.href)) { collect = "email"; + + // Collect telephone clicks + } else if (optionsLink.phones && /^tel:/i.test(link.href)) { + collect = "phone"; } if (!collect) return; @@ -208,7 +220,11 @@ if (!href) continue; // We don't want to overwrite website behaviour so we check for the onclick attribute - if (!link.getAttribute("onclick") && !/^mailto:/.test(href)) { + if ( + !link.getAttribute("onclick") && + !/^mailto:/.test(href) && + !/^tel:/.test(href) + ) { collectLink(link, true); } else { collectLink(link, false); From 67edab18b8f8debb7d14986a5312206b654434bb Mon Sep 17 00:00:00 2001 From: Adriaan <1079135+adriaandotcom@users.noreply.github.com> Date: Sat, 14 Jun 2025 01:09:18 +0200 Subject: [PATCH 40/62] Add unit tests for auto-events --- test/unit/auto-events.test.js | 67 ++++++++++++++++++++++++ test/unit/helpers/dom-auto-events.js | 78 ++++++++++++++++++++++++++++ 2 files changed, 145 insertions(+) create mode 100644 test/unit/auto-events.test.js create mode 100644 test/unit/helpers/dom-auto-events.js diff --git a/test/unit/auto-events.test.js b/test/unit/auto-events.test.js new file mode 100644 index 00000000..48beb50e --- /dev/null +++ b/test/unit/auto-events.test.js @@ -0,0 +1,67 @@ +const { expect } = require("chai"); +const { createDOM } = require("./helpers/dom-auto-events"); + +function setupDOM() { + const events = []; + const dom = createDOM({ + beforeRun(vm) { + vm.sa_event = function (name, metadata, cb) { + events.push({ name, metadata }); + if (typeof cb === "function") cb(); + }; + vm.sa_event_loaded = true; + }, + }); + dom.events = events; + return dom; +} + +describe("auto-events", function () { + it("tracks outbound link clicks", function (done) { + const dom = setupDOM(); + const link = dom.window.document.createElement("a"); + link.href = "https://example.org/path"; + link.target = "_blank"; + dom.window.document.body.appendChild(link); + + dom.window.saAutomatedLink(link, "outbound"); + + setTimeout(() => { + expect(dom.events[0]).to.deep.include({ name: "outbound_example_org" }); + expect(dom.events[0].metadata).to.include({ url: link.href }); + done(); + }, 0); + }); + + it("tracks download link clicks", function (done) { + const dom = setupDOM(); + const link = dom.window.document.createElement("a"); + link.href = "https://example.com/file.pdf"; + link.target = "_blank"; + dom.window.document.body.appendChild(link); + + dom.window.saAutomatedLink(link, "download"); + + setTimeout(() => { + expect(dom.events[0]).to.deep.include({ name: "download_file_pdf" }); + expect(dom.events[0].metadata).to.include({ url: link.href }); + done(); + }, 0); + }); + + it("tracks email link clicks", function (done) { + const dom = setupDOM(); + const link = dom.window.document.createElement("a"); + link.href = "mailto:test@example.com"; + link.target = "_blank"; + dom.window.document.body.appendChild(link); + + dom.window.saAutomatedLink(link, "email"); + + setTimeout(() => { + expect(dom.events[0]).to.deep.include({ name: "email_test_example_com" }); + expect(dom.events[0].metadata).to.include({ email: "test@example.com" }); + done(); + }, 0); + }); +}); diff --git a/test/unit/helpers/dom-auto-events.js b/test/unit/helpers/dom-auto-events.js new file mode 100644 index 00000000..eaf7ccc7 --- /dev/null +++ b/test/unit/helpers/dom-auto-events.js @@ -0,0 +1,78 @@ +const { JSDOM } = require("jsdom"); +const { readFileSync } = require("fs"); +const vm = require("vm"); + +const SCRIPT_PATH = "dist/latest/auto-events.js"; + +/** + * @typedef {"navigate" | "reload" | "back_forward" | "prerender"} NavigationType + */ + +/** @type {Record} */ +const NAVIGATION_TYPES = { + navigate: { name: "navigate", code: 0 }, + reload: { name: "reload", code: 1 }, + back_forward: { name: "back_forward", code: 2 }, + prerender: { name: "prerender", code: 255 }, +}; + +function createDOM(options = {}) { + const { + url = "https://example.com/", + navigationType = "navigate", + settings, + beforeRun, + } = options; + const dom = new JSDOM("", { + url, + runScripts: "outside-only", + pretendToBeVisual: true, + }); + + if (settings) { + vm.runInContext( + `window.sa_settings = ${JSON.stringify(settings)}`, + dom.getInternalVMContext() + ); + } + + if (typeof beforeRun === "function") beforeRun(dom.getInternalVMContext()); + + const sent = []; + dom.window.Image = function () { + return { + set src(value) { + sent.push({ type: "image", url: value }); + }, + }; + }; + dom.window.navigator.sendBeacon = function (url, data) { + sent.push({ type: "beacon", url, data }); + return true; + }; + + Object.defineProperty(dom.window, "performance", { + writable: true, + value: { + getEntriesByType: function (type) { + if (type === "navigation") { + return [{ type: NAVIGATION_TYPES[navigationType].name }]; + } + return []; + }, + navigation: { type: NAVIGATION_TYPES[navigationType].code }, + }, + }); + + const script = readFileSync(SCRIPT_PATH, "utf8"); + vm.runInContext(script, dom.getInternalVMContext()); + + dom.sent = sent; + return dom; +} + +module.exports = { + createDOM, + SCRIPT_PATH, + NAVIGATION_TYPES, +}; From defc6a007063fca580eebf8d6d9442be53cd44ca Mon Sep 17 00:00:00 2001 From: Adriaan van Rossum <1079135+adriaanvanrossum@users.noreply.github.com> Date: Tue, 24 Jun 2025 15:19:32 +0200 Subject: [PATCH 41/62] Warn when metadata collector function is not found --- src/default.js | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/default.js b/src/default.js index ab63e46b..2b4e925e 100644 --- a/src/default.js +++ b/src/default.js @@ -210,7 +210,13 @@ var metadataObject = window[namespace + "_metadata"]; if (isObject(metadataObject)) metadata = assign(metadata, metadataObject); var metadataCollectorFunction = window[metadataCollector]; - if (!isFunction(metadataCollectorFunction)) return metadata; + if (!isFunction(metadataCollectorFunction)) { + if (metadataCollector) + warn( + metadataCollector + " not found, set window." + metadataCollector + ); + return metadata; + } try { return assign( metadata, From a216bda1486446de12cba7612f6ca78e54a3b107 Mon Sep 17 00:00:00 2001 From: Adriaan van Rossum <1079135+adriaanvanrossum@users.noreply.github.com> Date: Tue, 24 Jun 2025 15:19:46 +0200 Subject: [PATCH 42/62] Run npm run build --- dist/latest/auto-events.js | 2 +- dist/latest/cloudflare.js | 10 ++++++++-- dist/latest/custom/app.js | 4 ++-- dist/latest/custom/app.js.map | 2 +- dist/latest/custom/auto-events.js | 2 +- dist/latest/custom/e.js | 4 ++-- dist/latest/custom/e.js.map | 2 +- dist/latest/custom/latest.dev.js | 10 ++++++++-- dist/latest/custom/latest.js | 4 ++-- dist/latest/custom/latest.js.map | 2 +- dist/latest/custom/light.js | 2 +- dist/latest/custom/proxy.js | 4 ++-- dist/latest/custom/proxy.js.map | 2 +- dist/latest/hello.js | 4 ++-- dist/latest/hello.js.map | 2 +- dist/latest/latest.dev.js | 10 ++++++++-- dist/latest/latest.js | 4 ++-- dist/latest/latest.js.map | 2 +- dist/latest/light.js | 2 +- dist/v12/app.js | 4 ++-- dist/v12/app.js.map | 2 +- dist/v12/auto-events.js | 2 +- dist/v12/custom/app.js | 4 ++-- dist/v12/custom/app.js.map | 2 +- dist/v12/custom/auto-events.js | 2 +- dist/v12/custom/light.js | 2 +- dist/v12/custom/proxy.js | 4 ++-- dist/v12/custom/proxy.js.map | 2 +- dist/v12/light.js | 2 +- 29 files changed, 59 insertions(+), 41 deletions(-) diff --git a/dist/latest/auto-events.js b/dist/latest/auto-events.js index ad6fe1f0..d3657139 100644 --- a/dist/latest/auto-events.js +++ b/dist/latest/auto-events.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2025-06-13; 7048; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2025-06-24; 7048; v12) */ function r(t,e){var a,n;t.hasAttribute("data-simple-event")||(a=!1,h.downloads&&/^https?:\/\//i.test(t.href)&&new RegExp("\\.("+(h.downloadsExtensions||[]).join("|")+")$","i").test(t.pathname)?a="download":h.outbound&&/^https?:\/\//i.test(t.href)&&t.hostname!==m.location.hostname?a="outbound":h.emails&&/^mailto:/i.test(t.href)&&(a="email"),a&&(e?(n="saAutomatedLink(this, '"+a+"');",t.hasAttribute("target")&&"_self"!==t.getAttribute("target")||(n+=" return false;"),t.setAttribute("onclick",n)):t.addEventListener("click",function(){g(t,a)})))}function e(){try{for(var t=document.getElementsByTagName("a"),e=0;e>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},at=function(t){return"function"==typeof t},it="namespace",ot=t[it]||L(z,it)||"sa",ct=function(t,e){var n=d[ot+"_metadata"];Z(n)&&(t=K(t,n));var r=d[Mt];if(!at(r))return t;try{return K(t,r.call(d,K(t,e)))}catch(a){F("metadata",a)}},st=t.strictUtm||L(z,"strict-utm")==r,ut=function(a,t){return(t||s.search).slice(1).split("&").filter(function(t){var e=a||!et("ut"),n=Et.map(J).join("|"),r=e?"^("+n+")=":"^((utm_)"+(st?"":"?")+"(source|medium|content|term|campaign)"+(st?"":"|ref")+"|"+n+")=";return e&&!Et.length?y:new RegExp(r).test(t)}).join("&")||g},lt=ot+"_loaded";if(d[lt]==v)return m(f+"twice");d.sa_event_loaded=v,d[lt]=v;var pt=function(e,t,n){e=n?e:K($t,Ct,e),w.brave&&!n&&(e.brave=v),w._duckduckgoloader_&&!n&&(e.duck=v);var r=new Image;t&&(r.onerror=t,r.onload=t),r.src=k+"/simple.gif?"+Object.keys(e).filter(function(t){return e[t]!=g}).map(function(t){return E(t)+"="+E(e[t])}).join("&")+"&time="+Date.now()},ft=t.hostname||L(z,"hostname"),ht=ft||b,dt={version:"custom_app_12",hostname:ht};n=function(t){t=t.stack?t+" "+t.stack:t,m(t),pt(K(dt,{type:i,error:t,path:s.pathname}),g,v)},M(i,function(t){t.filename&&-1"); +!function(d,t,e,n,m){try{var g=undefined,v=!0,y=!1,r="true",a="https:",_="pageview",u="event",i="error",o=d.console,c="doNotTrack",w=d.navigator,s=d.location,b=s.host,l=d.document,p=w.userAgent,f="Not sending request ",h=f+"when ",O=y,E=encodeURIComponent,x=decodeURIComponent,S=JSON.stringify,M=d.addEventListener,k="https://"+e,A=l.documentElement||{},q="language",$="Height",j="scroll",D=w.userAgentData,C=j+$,H="offset"+$,R="client"+$,P="pagehide",T="platform",U="platformVersion",I="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),N=d.screen,z=l.currentScript||l.querySelector('script[src*="'+e+'"]');m=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){m("Error in your "+t+" function:",e)},W=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},G=function(t){return"string"==typeof t},J=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},L=function(t,e){return t&&t.getAttribute("data-"+e)},Y=function(t){return Array.isArray(t)?t:G(t)&&t.length?t.split(/, ?/):[]},Z=function(t){return t&&t.constructor===Object},K=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},at=function(t){return"function"==typeof t},it="namespace",ot=t[it]||L(z,it)||"sa",ct=function(t,e){var n=d[ot+"_metadata"];Z(n)&&(t=K(t,n));var r=d[Mt];if(!at(r))return Mt&&m(Mt+" not found, set window."+Mt),t;try{return K(t,r.call(d,K(t,e)))}catch(a){F("metadata",a)}},st=t.strictUtm||L(z,"strict-utm")==r,ut=function(a,t){return(t||s.search).slice(1).split("&").filter(function(t){var e=a||!et("ut"),n=Et.map(J).join("|"),r=e?"^("+n+")=":"^((utm_)"+(st?"":"?")+"(source|medium|content|term|campaign)"+(st?"":"|ref")+"|"+n+")=";return e&&!Et.length?y:new RegExp(r).test(t)}).join("&")||g},lt=ot+"_loaded";if(d[lt]==v)return m(f+"twice");d.sa_event_loaded=v,d[lt]=v;var pt=function(e,t,n){e=n?e:K($t,Ct,e),w.brave&&!n&&(e.brave=v),w._duckduckgoloader_&&!n&&(e.duck=v);var r=new Image;t&&(r.onerror=t,r.onload=t),r.src=k+"/simple.gif?"+Object.keys(e).filter(function(t){return e[t]!=g}).map(function(t){return E(t)+"="+E(e[t])}).join("&")+"&time="+Date.now()},ft=t.hostname||L(z,"hostname"),ht=ft||b,dt={version:"custom_app_12",hostname:ht};n=function(t){t=t.stack?t+" "+t.stack:t,m(t),pt(K(dt,{type:i,error:t,path:s.pathname}),g,v)},M(i,function(t){t.filename&&-1"); //# sourceMappingURL=app.js.map \ No newline at end of file diff --git a/dist/latest/custom/app.js.map b/dist/latest/custom/app.js.map index ec0c0c9b..7cbc2558 100644 --- a/dist/latest/custom/app.js.map +++ b/dist/latest/custom/app.js.map @@ -1 +1 @@ -{"version":3,"file":"app.source.js","sources":["app.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) return metadata;\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n return (\n (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex).test(keyValue);\n })\n .join(\"&\") || undefinedVar\n );\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n query,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query || getQueryParams(deleteSourceInfo),\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch ? getQueryParams(delSrc, querySearch) : undefinedVar,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_app_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","search","keyValue","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","indexOf","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","protocol","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","i","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","query","currentPage","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue","q"],"mappings":";;CAEA,SACEA,EACAC,EACAC,EAIAC,EACAC,GAEA,IAQE,IAAIC,EAAeC,UACfC,GAAU,EACVC,GAAW,EACXC,EAAW,OACXC,EAAQ,SACRC,EAAe,WACfC,EAAY,QACZC,EAAY,QAGZC,EAAMd,EAAOe,QACbC,EAAa,aACbC,EAAMjB,EAAOkB,UACbC,EAAMnB,EAAOoB,SACbC,EAAmBF,EAAIG,KACvBC,EAAMvB,EAAOwB,SACbC,EAAYR,EAAIQ,UAChBC,EAAa,uBACbC,EAAiBD,EAAa,QAC9BE,EAA2BpB,EAC3BqB,EAAyBC,mBACzBC,EAAyBC,mBACzBC,EAAYC,KAAKD,UAEjBE,EAAuBnC,EAAOoC,iBAC9BC,EAhBW3B,WAgB4BR,EACvCoC,EAAkBf,EAAIe,iBAAmB,GACzCC,EAAW,WACXC,EAAS,SAETC,EAAS,SACTC,EAASzB,EAAI0B,cACbC,EAAeH,EAASD,EACxBK,EAAe,SAAWL,EAC1BM,EAAe,SAAWN,EAE1BO,EAAW,WACXC,EAAe,WACfC,EAAsB,kBACtBC,EAAU,mCACVC,EAAQ,EACRC,EACF,sBAAsBC,KAAK5B,KAAe,WAAW4B,KAAK5B,GACxD6B,EAAStD,EAAOsD,OAIhBC,EACFhC,EAAIiC,eAAiBjC,EAAIkC,cAAc,gBAAkBvD,EAAU,MAOrEE,EAAO,WAEL,IAAIsD,EAAO,GAAGC,MAAMC,KAAKC,WAOzB,OAJAH,EAAKI,QAAQ,qBAINC,SAASC,UAAUC,MAAML,KAAK9C,EAAIV,KAAMU,EAAK4C,IAGtD,IAAIQ,EAAiB,SAAUC,EAAMC,GACnChE,EAAK,iBAAmB+D,EAAO,aAAcC,IAG3CC,EAAU,SAAUC,EAAKC,GAC3B,OAAOC,OAAOR,UAAUS,eAAeb,KAAKU,EAAKC,IAG/CG,EAAW,SAAUC,GACvB,MAAwB,iBAAVA,GAGZC,EAAc,SAAUC,GAC1B,OAAOA,EAAKC,QAAQ,sBAAuB,SAGzCC,EAAO,SAAUxB,EAAeyB,GAClC,OAAOzB,GAAiBA,EAAc0B,aAAa,QAAUD,IAG3DE,EAA+B,SAAUC,GAC3C,OAAOC,MAAMC,QAAQF,GACjBA,EACAT,EAASS,IAAQA,EAAIG,OACnBH,EAAII,MAAM,OACV,IAGJC,EAAW,SAAUC,GACvB,OAAOA,GAAUA,EAAOC,cAAgBlB,QAGtCmB,EAAS,WAGX,IAFA,IAAIC,EAAK,GACLC,EAAMhC,UACDiC,EAAQ,EAAGA,EAAQD,EAAIP,OAAQQ,IAAS,CAC/C,IAAIC,EAAaF,EAAIC,GACrB,GAAIN,EAASO,GACX,IAAK,IAAIC,KAAWD,EACd1B,EAAQ0B,EAAYC,KACtBJ,EAAGI,GAAWD,EAAWC,IAKjC,OAAOJ,GAGLK,EAAWjG,EAAOkG,YAClBC,EAAcF,GAAYzB,OAAO4B,KAAKnG,GAAkBqF,OAG5DrF,EAAmB0F,EAAO1F,EAAkBgG,GAExCE,GAAa/F,EAAK,WAAYH,GAGlC,IAAIoG,GAAgBnB,EAClBjF,EAAiBoG,eAAiBtB,EAAKxB,EAAe,mBAGpD+C,GAAwB,SAAUC,GAEpC,OAGgB,IAFdF,GAAcG,OAAO,SAAU3B,GAC7B,OAAO,IAAI4B,OAAO,IAAMF,GAAoBlD,KAAKwB,KAChDS,QAIHoB,GAAMC,KAAKD,IAEXE,GAAO,WACT,IAAIC,EAAe7G,EAAO8G,QAAU9G,EAAO+G,SACvCC,EAAY,CAAC,MAAQ,KAAO,KAAO,KAAO,KAC1CC,EAAY,SAEhB,IACE,OAAOD,EAAUlC,QAAQmC,EAAW,SAAUC,GAC5C,OACEA,EACCL,EAAaM,gBAAgB,IAAIC,WAAW,IAAI,GAC9C,IAAOF,EAAI,GACdG,SAAS,MAEb,MAAOjD,GACP,OAAO4C,EAAUlC,QAAQmC,EAAW,SAAUC,GAC5C,IAAII,EAAqB,GAAhBC,KAAKC,SAAiB,EAE/B,OADMN,EAAI,EAAII,EAAS,EAAJA,EAAW,GACrBD,SAAS,QAKpBI,GAAa,SAAUC,GACzB,MAAsB,mBAARA,GAIZC,GAAgB,YAChBC,GACF3H,EAAiB0H,KACjB5C,EAAKxB,EAAeoE,KAixBxB,KA9wBME,GAAiB,SAAUC,EAAUC,GACvC,IAAIC,EAAiBhI,EAAO4H,GAAY,aACpCpC,EAASwC,KAAiBF,EAAWnC,EAAOmC,EAAUE,IAC1D,IAAIC,EAA4BjI,EAAOkI,IACvC,IAAKT,GAAWQ,GAA4B,OAAOH,EACnD,IACE,OAAOnC,EACLmC,EACAG,EAA0BrE,KAAK5D,EAAQ2F,EAAOmC,EAAUC,KAE1D,MAAO3D,GACPF,EAAe,WAAYE,KAU3B+D,GACFlI,EAAiBkI,WACjBpD,EAAKxB,EAAe,eAAiB9C,EAEnC2H,GAAiB,SAAUC,EAAcC,GAC3C,OACGA,GAAmBnH,EAAIoH,QACrB5E,MAAM,GACN4B,MAAM,KACNiB,OAAO,SAAUgC,GAChB,IAAIC,EAASJ,IAAiB/B,GAAsB,MAEhDoC,EAAkBC,GAAYC,IAAIhE,GAAaiE,KAAK,KACpDC,EAAQL,EACR,KAAOC,EAAkB,KACzB,YACCP,GAAY,GAAK,KAClB,yCACCA,GAAY,GAAK,QAClB,IACAO,EACA,KACJ,OAAID,IAAWE,GAAYrD,OAAe9E,EAInC,IAAIiG,OAAOqC,GAAOzF,KAAKmF,KAE/BK,KAAK,MAAQxI,GAgChB0I,GAAiBnB,GAAY,UACjC,GAAI5H,EAAO+I,KAAmBxI,EAAS,OAAOH,EAAKsB,EAAa,SAChE1B,EAAOgJ,gBAAkBzI,EACzBP,EAAO+I,IAAkBxI,EAOzB,IAAI0I,GAAW,SAAUlB,EAAMmB,EAAUC,GACvCpB,EAAOoB,EAAepB,EAAOpC,EAAOyD,GAASC,GAAMtB,GAE/C9G,EAAIqI,QAAUH,IAAcpB,EAAKuB,MAAQ/I,GACzCU,EAAIsI,qBAAuBJ,IAAcpB,EAAKyB,KAAOjJ,GAGzD,IAAIkJ,EAAQ,IAAIC,MACZR,IACFO,EAAME,QAAUT,EAChBO,EAAMG,OAASV,GAEjBO,EAAMI,IACJxH,EACA,eACAmC,OAAO4B,KAAK2B,GACTvB,OAAO,SAAUsD,GAChB,OAAO/B,EAAK+B,IAAQzJ,IAErBuI,IAAI,SAAUkB,GACb,OACEjI,EAAuBiI,GACvB,IACAjI,EAAuBkG,EAAK+B,MAG/BjB,KAAK,KACR,SACAlC,KAAKD,OAILqD,GACF9J,EAAiB+J,UAAYjF,EAAKxB,EAAe,YAC/C0G,GAAkBF,IAAuB1I,EAEzC6I,GAAc,CAChBC,QA6oBJ,gBA5oBIH,SAAUC,IASZ9J,EAAY,SAAUiK,GACpBA,EAAiBA,EAAeC,MAC5BD,EAAiB,IAAMA,EAAeC,MACtCD,EACJhK,EAAKgK,GACLnB,GACEtD,EAAOuE,GAAa,CAClBI,KAAMzJ,EACNuD,MAAOgG,EACPG,KAAMpJ,EAAIqJ,WAEZnK,EACAE,IAMJ4B,EACEtB,EACA,SAAU4J,GACJA,EAAMC,WAA+C,EAAnCD,EAAMC,SAASC,QAAQzK,IAC3CC,EAAUsK,EAAMG,UAGpBpK,GAOF,IAwDIqK,GAxDAC,GAAQpE,KAERqE,GAAW,EAOXC,GAAO/K,EAAiB+K,MAAQjG,EAAKxB,EAAe,QAGpD0H,MAvKsBC,GAuKCjL,EAAiBgL,cAtKvBC,GAuKjBjL,EAAiBgL,WACjBlG,EAAKxB,EAAe,eAAiB9C,GACrCsE,EAAKxB,EAAe,aAAe9C,GACnCsE,EAAKxB,EAAe,gBAAkB9C,EAGtC0K,KACqC,SAAvCpG,EAAKxB,EAAe,iBACpBtD,EAAiBkL,cAAgB3K,GAI/B4K,GACFnL,EAAiBoL,UACjBtG,EAAKxB,EAAe,cACpBqE,GAAY,IAAMhH,EAGhB0K,GAAcpG,EAChBjF,EAAiBqL,aAAevG,EAAKxB,EAAe,iBAIlDoF,GAAczD,EAChBjF,EAAiB0I,aAAe5D,EAAKxB,EAAe,iBAIlDgI,GAAqBrG,EACvBjF,EAAiBsL,oBACfxG,EAAKxB,EAAe,yBAIpBiI,GACFvL,EAAiBuL,gBAAkBzG,EAAKxB,EAAe,mBAGrD2E,GACFjI,EAAiBiI,mBACjBnD,EAAKxB,EAAe,sBAItB,IAEEsH,GAAWvE,GAAsB,KAC7BmF,KAAKC,iBAAiBC,kBAAkBC,SACxCvL,EACJ,MAAO+D,IACPhE,EAAKgE,IAOP,IAAIyH,GAAU7L,EAAO6L,QACjBC,GACF7K,EAAI8K,WACJ/L,EAAOgM,aACPhM,EAAOiM,aACPjM,EAAOkM,UACNL,KAAYA,GAAQM,QACrBnM,EAAOoM,YACPpM,EAAOqM,MACPjJ,GACAmE,KAAKC,UAAYD,KAAKC,SAGpB8E,GACFhG,GAAsB,MAAQA,GAAsB,QAElDwF,KAAK5B,GAAY4B,IAAMvL,GAE3B,IAAI6I,GAAUzD,EAAOuE,GAAa,CAEhCqC,GAAIjG,GAAsB,MAAQ7E,EAAYpB,EAE9CK,MAAOS,EAAIqL,UAAY9L,EACvBmK,SAAUA,GACV4B,QAASH,GAAqB1F,KAASvG,EAGvCqM,WAAYpG,GAAsB,MAAQM,KAASvG,IA0BrD,GAvBA+I,GAAQuD,IAAMnM,EAIVkC,IACF0G,GAAQwD,OAASlK,EAAOkK,OACxBxD,GAAQyD,OAAS5K,EAAUS,EAAOmK,SAS/BtL,EAAIuL,SAAS1M,EAAK,4CAInB6J,KAAoB5I,IACtB+H,GAAQ2D,kBAAoB1L,IAGzB4J,IAAcjK,KAAcC,GAA0B,KAAnBA,EAAID,GAC1C,OAAOZ,EACLuB,EAAiBX,EAAa,oBAAsBkC,EAAU,SAK7B,GAAlC7B,EAAiBsJ,QAAQ,OACxB,aAAatH,KAAKhC,IACnB0I,IAED3J,EACE,mBACEiB,EACA,SACA6B,EACA,0BAON,IACI8J,GA0DAC,GA3DA5D,GAAO,GAGP6D,GAAc,WAKhB,OAFEjN,EAAiBkN,UAAYpI,EAAKxB,EAAe,aAGzBhC,EAAI4L,UAAY,IACrCrI,QAAQzD,EAAkB4I,IAC1BnF,QAAQ,sDAAuD,MAC/DA,QAAQ,YAAa,OAASzE,GAKjC8M,GAAWD,KAOXE,GAAW,EAEXC,GAAc,SAAUC,EAAIC,GAC9B,GAAKjB,GAAL,CAEA,IAAIkB,EAAS7H,EAAOuE,GAAa,CAC/BI,KAAM,SACNmD,YAAaF,EAAOD,EAAKlE,GAAQqD,UAenC,GAXInG,GAAsB,OACxBkH,EAAOE,SAAWnG,KAAKoG,OAAOjH,KAAQoE,GAAQsC,IArfnC,MAufbA,GAAW,EACXtC,GAAQpE,KAGJJ,GAAsB,UACxBkH,EAAOzC,SAAWxD,KAAKqG,IAAI,EAAG7C,GAAU8C,OAGtCN,IAAStM,EAAI6M,WAEf7E,GAASuE,EAAQnN,EAAcE,QAE/B,IACEU,EAAI6M,WAAWC,KAAK9M,EAApBA,CAAyBoB,EAAa,UAAWJ,EAAUuL,IAC3D,MAAOQ,GAEP/E,GAASuE,EAAQnN,EAAcE,MAMrC4B,EACE,mBACA,WACMZ,EAAI0M,QACA,KAAOlL,KAAY/C,GAASqN,KAClCJ,GAAcvG,MACT0G,IAAY1G,KAAQuG,IAE7BzM,GAGF2B,EAAqBY,EAAUsK,GAAa7M,GAE5C,IAAI0N,GAAO3M,EAAI2M,MAAQ,GACnBL,GAAW,WACb,IACE,IAAIM,EAAuB7L,EAAgBQ,IAAiB,EACxDsL,EAAS7G,KAAKqG,IAChBM,GAAKtL,IAAiB,EACtBsL,GAAKrL,IAAiB,EACtBP,EAAgBQ,IAAiB,EACjCR,EAAgBM,IAAiB,EACjCN,EAAgBO,IAAiB,GAEnC,OAAO0E,KAAK8G,IACV,IAKI,EAJJ9G,KAAKoG,MACF,MAAQrL,EAAgBgM,WAAa,GAAKH,GACzCC,EACA,IAGN,MAAOhK,IAEP,OADAhE,EAAKgE,IACE,IAIXjC,EAAqB,OAAQ,WAC3B4I,GAAW8C,KACX1L,EACEM,EACA,WACMsI,GAAW8C,OAAY9C,GAAW8C,OAExCrN,KAQJ,IAgCI+N,GAkCAC,GAAUC,GAlEVC,GAAU,SAAUC,GACtB,IAAIpE,EAAO,GAIX,IACEA,EAAOoE,GAAa5M,EAAuBZ,EAAIqJ,UAC/C,MAAOpG,IACPhE,EAAKgE,IAGP,IAAIwK,EAAyB5O,EAAOwL,IACpC,GAAI/D,GAAWmH,GACb,IACErE,EAAOqE,EAAuBhL,KAAK5D,EAAQ,CAAEuK,KAAMA,KAAWA,EAC9D,MAAOnG,IACPF,EAAe,OAAQE,IAK3B,IA5YiB,SAAUmG,GAC3B,IAAK,IAAIsE,KAAKvD,GAAa,CACzB,IAAIwD,EAAgBxD,GAAYuD,GAChC,GAAKC,EAAL,CAGA,IAAIC,EAhOI,KAiOND,EAAc,GAAcA,EAjOtB,IAiO8CA,EAEtD,GACEC,IAAexE,GACf,IAAI9D,OACF,IAAM7B,EAAYmK,GAAYjK,QAAQ,SAAU,QAAU,IAC1D,KACAzB,KAAKkH,GAEP,OAAOhK,GAEX,OAAOC,EA0XHwO,CAAazE,GAQjB,MAFY,QAARS,IAAkB7J,EAAI8N,OAAM1E,GAAQpJ,EAAI8N,KAAK1J,MAAM,KAAK,IAErDgF,EAPLnK,EAAKuB,EAAiB,YAAc4I,IA8CpC2E,GAAW,SACbC,EACAC,EACAtH,EACAuH,IAEKA,GAAe5H,GAAWK,KAAWuH,EAAcvH,GACxD,IACIwH,EAGEC,EAJFrG,EAAWzB,GAAW4H,GAAeA,EAAc,aAEnD3K,EAAS0K,KAAgD,EAA9BA,EAAczE,QAAQ,OAGnDyE,GADIG,EAAQH,EAAc7J,MAAM,MACViK,QACtBF,EAAc,IAAMC,EAAM1G,KAAK,MAGjC,IAAI0B,EAAOmE,GAAQU,GAGnB,GAAK7E,GAAQyC,IAAgBzC,EAA7B,CAEAyC,GAAezC,EACflB,GAAKkB,KAAOA,EAGRjE,GAAsB,OACxB+C,GAAKoG,eACHlI,KAAKqG,IAAItL,EAA2B,aAAK,EAAGtC,EAAO0P,YAAc,IACjE,KACFrG,GAAKsG,gBACHpI,KAAKqG,IACHtL,EAAgBQ,IAAiB,EACjC9C,EAAO4P,aAAe,IACnB,MAILtJ,GAAsB,MACpBrF,EAAIsB,KAAW8G,GAAK9G,GAAYtB,EAAIsB,IAItCe,GAAUgD,GAAsB,QAClC+C,GAAKwG,aAAevM,EAAOwM,MAC3BzG,GAAK0G,cAAgBzM,EAAO8K,QAI9B,IAII4B,EAJAC,EAAOjQ,EAAOkQ,YACdC,EAAiB,aAIrB,IACEH,EAAsBC,EAAKG,iBAAiBD,GAAgB,GAAG7F,KAC/D,MAAOlG,IACPhE,EAAKgE,IAGPqK,GAAgBuB,GAC+C,EAA3D,CAAC,SAAU,gBAAgBrF,QAAQqF,GAGnCC,GACAA,EAAKE,KACwC,EAA7C,CAAC,EAAG,GAAGxF,QAAQsF,EAAKE,GAAgB7F,MAGxC,IAAI+F,EAA0BlD,GAC1BA,GAAS5H,MA1tBH,KA0tBgB,GACtBlF,EACJmO,GAAWrB,IACgD,EAAvD5B,GAAmBZ,QAAQ0F,IAC3BA,GAA2BhP,EAC3Bb,EAGJ6I,GAAKiH,OACH,QAAQjN,KAAK6J,OAAkBiC,GAAeV,GAC1CjO,GACCgO,GAEP1G,EAAWD,GAAeC,EAAU,CAClCwC,KAAM3J,EACN4J,KAAMlB,GAAKkB,OAGb,IAAIgG,EAAsB,WACxB3O,EAA2BrB,EAC3B,IAAIiQ,EACFrB,GAAeV,KAAkBnI,GAAsB,MA3H1C,SACjB6I,EACAsB,EACAjC,EACAkC,EACA5I,EACAoB,GAEIiG,GAAa9B,GAAY,GAAKjE,GAAQqD,QAASlM,GAC/C+L,KAAoBlD,GAAQqD,QAAU7F,MAE1C,IAAI+J,EAAc1G,GAAkByE,KAEpCzF,GACE,CACEqE,GAAIlE,GAAQqD,QACZnC,KAAM3J,EACNwM,UAAWsD,GAAoBjC,EAAWrB,GAAW,KACrDuD,MAAOA,GAAStI,GAAeqI,GAE/B3I,SAAU7F,EAAU6F,IAEtBoB,GAGFqF,GAAmBpB,GACnBA,GAAWwD,EAEXxN,IAgGEyN,CACEzB,EACAqB,EACAhC,GACAc,EAAclH,GAAeoI,EAAQlB,GAAejP,EACpDyH,EACAoB,IAIJ,GAAKtH,EAmBH2O,SAjBA,IACM7N,GAAU+E,GAAW/E,EAAOmO,sBAC9BnO,EACGmO,qBAAqB,CAAC7N,EAAcC,IACpC6N,KAAK,SAAUC,GACd3H,GAAQ4H,QAAUD,EAAkB/N,GACpCoG,GAAQ6H,WAAaF,EAAkB9N,GACvCsN,MAEDW,SAAMX,GAETA,IAEF,MAAOvC,GACPuC,OAWFY,GAAMnR,EAAOoR,QACbC,GAAeF,GAAMA,GAAIG,UAAYjR,EACrCkR,GAAMvR,EAAOwR,cACbC,GAAgB,YAIhBtG,IAAekG,IAAgBK,OAASH,KAqB1CJ,GAAIG,WAnBEK,GAAOR,GADiB7G,GAoBAmH,IAlBrB,WACL,IAEIhH,EAFA5E,EAAMhC,UACN+N,EAAKD,GAAK1N,MAAM4N,KAAMhM,GAY1B,OAVI4B,GAAWiK,OACbjH,EAAQ,IAAIiH,MAAMpH,KAIlBG,EAAQlJ,EAAIuQ,YAAY,UAClBC,UAAUzH,GAAM/J,EAASA,GAEjCkK,EAAM5G,UAAYgC,EAClB0L,GAAI9G,GACGmH,IAMXzP,EACEsP,GACA,WACEvC,GAAS,IAEX1O,GAGF2B,EACE,WACA,WACE+M,GAAS,IAEX1O,IAKA2K,IAAuB,QAARH,IAAkB,iBAAkBhL,GACrDmC,EACE,aACA,WACE+M,GAAS,IAEX1O,GAIA2K,IAAa+D,KAEjBlP,EAAOgS,YAAc,SAAUzH,EAAMzC,EAAUoB,GAC7CgG,GAAS,EAAG3E,EAAMzC,EAAUoB,IAQ9B,IAAI+I,GAAa,CAAC,SAAU,UAExBC,GAAY,SAAUzH,EAAO3C,EAAUuH,IACpCA,GAAe5H,GAAWK,KAAWuH,EAAcvH,GAExD,IAAIqK,EAAkB1K,GAAWgD,GAC7BvB,EAAWzB,GAAW4H,GAAeA,EAAc,aACnD+C,SAAmB3H,EAEvB,GAAIwH,GAAWtH,QAAQyH,GAAa,IAAMD,EAExC,OADAjO,EAAekH,GAAmBxK,EAAY,aAAewR,GACtDlJ,IAGT,IACE,GAAIiJ,EAAiB,CACnB,IAAIE,EAAc5H,IAClB,GAAIwH,GAAWtH,eAAe0H,GAAe,EAK3C,OAJAnO,EACEkH,GACAX,EAAQ,uBAAyB4H,GAE5BnJ,IAETuB,EAAQ4H,GAEV,MAAOjO,IAEP,OADAF,EAAekH,GAAmBhH,IAC3B8E,IAGTuB,GAAS,GAAKA,GAAO3F,QAAQ,eAAgB,KAAKA,QAAQ,WAAY,IAEtE,IAAIwN,EAAc,CAAEhI,KAAM1J,EAAW6J,MAAOA,GACxC8H,GAAa9D,IAAiBtL,EAAQ,EAE1C2E,EAAWD,GAAeC,EAAUwK,GAEhC7H,GACFxB,GACEtD,EAAO2M,EAAa,CAClBhF,GAAI1G,KACJ8J,MAAOtI,IAAgBmK,GACvBpF,UACGoF,GAAa/D,KAAalI,GAAsB,KAC7CiI,GACA,KAENzG,SAAU7F,EAAU6F,KAEtBoB,IAKFsJ,GAAmB,SAAU/H,EAAO3C,EAAUoB,GAChDgJ,GAAUzH,EAAO3C,EAAUoB,IAIxBlJ,EAAOoL,MACVpL,EAAOoL,IAAqBoH,IAE9B,IAAIC,GAAYzS,EAAOoL,IAGnBsH,GAAQD,IAAaA,GAAUE,EAAIF,GAAUE,EAAI,GAMrD,IAAK,IAAIlI,MAHTzK,EAAOoL,IAAqBoH,GAGVE,GACZrO,EAAQqO,GAAOjI,MACjBrF,MAAMC,QAAQqN,GAAMjI,KAChByH,GAAUjO,MAAM,KAAMyO,GAAMjI,KAC5ByH,GAAUQ,GAAMjI,MAGxB,MAAOuD,IACP7N,EAAU6N,IA7IY,IAAU1D,GACxBqH,GA3mBkBzG,GA7M9B,CAu8BElL,OACA,uBACA"} \ No newline at end of file +{"version":3,"file":"app.source.js","sources":["app.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n return (\n (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex).test(keyValue);\n })\n .join(\"&\") || undefinedVar\n );\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n query,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query || getQueryParams(deleteSourceInfo),\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch ? getQueryParams(delSrc, querySearch) : undefinedVar,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_app_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","search","keyValue","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","indexOf","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","protocol","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","i","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","query","currentPage","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue","q"],"mappings":";;CAEA,SACEA,EACAC,EACAC,EAIAC,EACAC,GAEA,IAQE,IAAIC,EAAeC,UACfC,GAAU,EACVC,GAAW,EACXC,EAAW,OACXC,EAAQ,SACRC,EAAe,WACfC,EAAY,QACZC,EAAY,QAGZC,EAAMd,EAAOe,QACbC,EAAa,aACbC,EAAMjB,EAAOkB,UACbC,EAAMnB,EAAOoB,SACbC,EAAmBF,EAAIG,KACvBC,EAAMvB,EAAOwB,SACbC,EAAYR,EAAIQ,UAChBC,EAAa,uBACbC,EAAiBD,EAAa,QAC9BE,EAA2BpB,EAC3BqB,EAAyBC,mBACzBC,EAAyBC,mBACzBC,EAAYC,KAAKD,UAEjBE,EAAuBnC,EAAOoC,iBAC9BC,EAhBW3B,WAgB4BR,EACvCoC,EAAkBf,EAAIe,iBAAmB,GACzCC,EAAW,WACXC,EAAS,SAETC,EAAS,SACTC,EAASzB,EAAI0B,cACbC,EAAeH,EAASD,EACxBK,EAAe,SAAWL,EAC1BM,EAAe,SAAWN,EAE1BO,EAAW,WACXC,EAAe,WACfC,EAAsB,kBACtBC,EAAU,mCACVC,EAAQ,EACRC,EACF,sBAAsBC,KAAK5B,KAAe,WAAW4B,KAAK5B,GACxD6B,EAAStD,EAAOsD,OAIhBC,EACFhC,EAAIiC,eAAiBjC,EAAIkC,cAAc,gBAAkBvD,EAAU,MAOrEE,EAAO,WAEL,IAAIsD,EAAO,GAAGC,MAAMC,KAAKC,WAOzB,OAJAH,EAAKI,QAAQ,qBAINC,SAASC,UAAUC,MAAML,KAAK9C,EAAIV,KAAMU,EAAK4C,IAGtD,IAAIQ,EAAiB,SAAUC,EAAMC,GACnChE,EAAK,iBAAmB+D,EAAO,aAAcC,IAG3CC,EAAU,SAAUC,EAAKC,GAC3B,OAAOC,OAAOR,UAAUS,eAAeb,KAAKU,EAAKC,IAG/CG,EAAW,SAAUC,GACvB,MAAwB,iBAAVA,GAGZC,EAAc,SAAUC,GAC1B,OAAOA,EAAKC,QAAQ,sBAAuB,SAGzCC,EAAO,SAAUxB,EAAeyB,GAClC,OAAOzB,GAAiBA,EAAc0B,aAAa,QAAUD,IAG3DE,EAA+B,SAAUC,GAC3C,OAAOC,MAAMC,QAAQF,GACjBA,EACAT,EAASS,IAAQA,EAAIG,OACnBH,EAAII,MAAM,OACV,IAGJC,EAAW,SAAUC,GACvB,OAAOA,GAAUA,EAAOC,cAAgBlB,QAGtCmB,EAAS,WAGX,IAFA,IAAIC,EAAK,GACLC,EAAMhC,UACDiC,EAAQ,EAAGA,EAAQD,EAAIP,OAAQQ,IAAS,CAC/C,IAAIC,EAAaF,EAAIC,GACrB,GAAIN,EAASO,GACX,IAAK,IAAIC,KAAWD,EACd1B,EAAQ0B,EAAYC,KACtBJ,EAAGI,GAAWD,EAAWC,IAKjC,OAAOJ,GAGLK,EAAWjG,EAAOkG,YAClBC,EAAcF,GAAYzB,OAAO4B,KAAKnG,GAAkBqF,OAG5DrF,EAAmB0F,EAAO1F,EAAkBgG,GAExCE,GAAa/F,EAAK,WAAYH,GAGlC,IAAIoG,GAAgBnB,EAClBjF,EAAiBoG,eAAiBtB,EAAKxB,EAAe,mBAGpD+C,GAAwB,SAAUC,GAEpC,OAGgB,IAFdF,GAAcG,OAAO,SAAU3B,GAC7B,OAAO,IAAI4B,OAAO,IAAMF,GAAoBlD,KAAKwB,KAChDS,QAIHoB,GAAMC,KAAKD,IAEXE,GAAO,WACT,IAAIC,EAAe7G,EAAO8G,QAAU9G,EAAO+G,SACvCC,EAAY,CAAC,MAAQ,KAAO,KAAO,KAAO,KAC1CC,EAAY,SAEhB,IACE,OAAOD,EAAUlC,QAAQmC,EAAW,SAAUC,GAC5C,OACEA,EACCL,EAAaM,gBAAgB,IAAIC,WAAW,IAAI,GAC9C,IAAOF,EAAI,GACdG,SAAS,MAEb,MAAOjD,GACP,OAAO4C,EAAUlC,QAAQmC,EAAW,SAAUC,GAC5C,IAAII,EAAqB,GAAhBC,KAAKC,SAAiB,EAE/B,OADMN,EAAI,EAAII,EAAS,EAAJA,EAAW,GACrBD,SAAS,QAKpBI,GAAa,SAAUC,GACzB,MAAsB,mBAARA,GAIZC,GAAgB,YAChBC,GACF3H,EAAiB0H,KACjB5C,EAAKxB,EAAeoE,KAuxBxB,KApxBME,GAAiB,SAAUC,EAAUC,GACvC,IAAIC,EAAiBhI,EAAO4H,GAAY,aACpCpC,EAASwC,KAAiBF,EAAWnC,EAAOmC,EAAUE,IAC1D,IAAIC,EAA4BjI,EAAOkI,IACvC,IAAKT,GAAWQ,GAKd,OAJIC,IACF9H,EACE8H,GAAoB,0BAA4BA,IAE7CJ,EAET,IACE,OAAOnC,EACLmC,EACAG,EAA0BrE,KAAK5D,EAAQ2F,EAAOmC,EAAUC,KAE1D,MAAO3D,GACPF,EAAe,WAAYE,KAU3B+D,GACFlI,EAAiBkI,WACjBpD,EAAKxB,EAAe,eAAiB9C,EAEnC2H,GAAiB,SAAUC,EAAcC,GAC3C,OACGA,GAAmBnH,EAAIoH,QACrB5E,MAAM,GACN4B,MAAM,KACNiB,OAAO,SAAUgC,GAChB,IAAIC,EAASJ,IAAiB/B,GAAsB,MAEhDoC,EAAkBC,GAAYC,IAAIhE,GAAaiE,KAAK,KACpDC,EAAQL,EACR,KAAOC,EAAkB,KACzB,YACCP,GAAY,GAAK,KAClB,yCACCA,GAAY,GAAK,QAClB,IACAO,EACA,KACJ,OAAID,IAAWE,GAAYrD,OAAe9E,EAInC,IAAIiG,OAAOqC,GAAOzF,KAAKmF,KAE/BK,KAAK,MAAQxI,GAgChB0I,GAAiBnB,GAAY,UACjC,GAAI5H,EAAO+I,KAAmBxI,EAAS,OAAOH,EAAKsB,EAAa,SAChE1B,EAAOgJ,gBAAkBzI,EACzBP,EAAO+I,IAAkBxI,EAOzB,IAAI0I,GAAW,SAAUlB,EAAMmB,EAAUC,GACvCpB,EAAOoB,EAAepB,EAAOpC,EAAOyD,GAASC,GAAMtB,GAE/C9G,EAAIqI,QAAUH,IAAcpB,EAAKuB,MAAQ/I,GACzCU,EAAIsI,qBAAuBJ,IAAcpB,EAAKyB,KAAOjJ,GAGzD,IAAIkJ,EAAQ,IAAIC,MACZR,IACFO,EAAME,QAAUT,EAChBO,EAAMG,OAASV,GAEjBO,EAAMI,IACJxH,EACA,eACAmC,OAAO4B,KAAK2B,GACTvB,OAAO,SAAUsD,GAChB,OAAO/B,EAAK+B,IAAQzJ,IAErBuI,IAAI,SAAUkB,GACb,OACEjI,EAAuBiI,GACvB,IACAjI,EAAuBkG,EAAK+B,MAG/BjB,KAAK,KACR,SACAlC,KAAKD,OAILqD,GACF9J,EAAiB+J,UAAYjF,EAAKxB,EAAe,YAC/C0G,GAAkBF,IAAuB1I,EAEzC6I,GAAc,CAChBC,QA6oBJ,gBA5oBIH,SAAUC,IASZ9J,EAAY,SAAUiK,GACpBA,EAAiBA,EAAeC,MAC5BD,EAAiB,IAAMA,EAAeC,MACtCD,EACJhK,EAAKgK,GACLnB,GACEtD,EAAOuE,GAAa,CAClBI,KAAMzJ,EACNuD,MAAOgG,EACPG,KAAMpJ,EAAIqJ,WAEZnK,EACAE,IAMJ4B,EACEtB,EACA,SAAU4J,GACJA,EAAMC,WAA+C,EAAnCD,EAAMC,SAASC,QAAQzK,IAC3CC,EAAUsK,EAAMG,UAGpBpK,GAOF,IAwDIqK,GAxDAC,GAAQpE,KAERqE,GAAW,EAOXC,GAAO/K,EAAiB+K,MAAQjG,EAAKxB,EAAe,QAGpD0H,MAvKsBC,GAuKCjL,EAAiBgL,cAtKvBC,GAuKjBjL,EAAiBgL,WACjBlG,EAAKxB,EAAe,eAAiB9C,GACrCsE,EAAKxB,EAAe,aAAe9C,GACnCsE,EAAKxB,EAAe,gBAAkB9C,EAGtC0K,KACqC,SAAvCpG,EAAKxB,EAAe,iBACpBtD,EAAiBkL,cAAgB3K,GAI/B4K,GACFnL,EAAiBoL,UACjBtG,EAAKxB,EAAe,cACpBqE,GAAY,IAAMhH,EAGhB0K,GAAcpG,EAChBjF,EAAiBqL,aAAevG,EAAKxB,EAAe,iBAIlDoF,GAAczD,EAChBjF,EAAiB0I,aAAe5D,EAAKxB,EAAe,iBAIlDgI,GAAqBrG,EACvBjF,EAAiBsL,oBACfxG,EAAKxB,EAAe,yBAIpBiI,GACFvL,EAAiBuL,gBAAkBzG,EAAKxB,EAAe,mBAGrD2E,GACFjI,EAAiBiI,mBACjBnD,EAAKxB,EAAe,sBAItB,IAEEsH,GAAWvE,GAAsB,KAC7BmF,KAAKC,iBAAiBC,kBAAkBC,SACxCvL,EACJ,MAAO+D,IACPhE,EAAKgE,IAOP,IAAIyH,GAAU7L,EAAO6L,QACjBC,GACF7K,EAAI8K,WACJ/L,EAAOgM,aACPhM,EAAOiM,aACPjM,EAAOkM,UACNL,KAAYA,GAAQM,QACrBnM,EAAOoM,YACPpM,EAAOqM,MACPjJ,GACAmE,KAAKC,UAAYD,KAAKC,SAGpB8E,GACFhG,GAAsB,MAAQA,GAAsB,QAElDwF,KAAK5B,GAAY4B,IAAMvL,GAE3B,IAAI6I,GAAUzD,EAAOuE,GAAa,CAEhCqC,GAAIjG,GAAsB,MAAQ7E,EAAYpB,EAE9CK,MAAOS,EAAIqL,UAAY9L,EACvBmK,SAAUA,GACV4B,QAASH,GAAqB1F,KAASvG,EAGvCqM,WAAYpG,GAAsB,MAAQM,KAASvG,IA0BrD,GAvBA+I,GAAQuD,IAAMnM,EAIVkC,IACF0G,GAAQwD,OAASlK,EAAOkK,OACxBxD,GAAQyD,OAAS5K,EAAUS,EAAOmK,SAS/BtL,EAAIuL,SAAS1M,EAAK,4CAInB6J,KAAoB5I,IACtB+H,GAAQ2D,kBAAoB1L,IAGzB4J,IAAcjK,KAAcC,GAA0B,KAAnBA,EAAID,GAC1C,OAAOZ,EACLuB,EAAiBX,EAAa,oBAAsBkC,EAAU,SAK7B,GAAlC7B,EAAiBsJ,QAAQ,OACxB,aAAatH,KAAKhC,IACnB0I,IAED3J,EACE,mBACEiB,EACA,SACA6B,EACA,0BAON,IACI8J,GA0DAC,GA3DA5D,GAAO,GAGP6D,GAAc,WAKhB,OAFEjN,EAAiBkN,UAAYpI,EAAKxB,EAAe,aAGzBhC,EAAI4L,UAAY,IACrCrI,QAAQzD,EAAkB4I,IAC1BnF,QAAQ,sDAAuD,MAC/DA,QAAQ,YAAa,OAASzE,GAKjC8M,GAAWD,KAOXE,GAAW,EAEXC,GAAc,SAAUC,EAAIC,GAC9B,GAAKjB,GAAL,CAEA,IAAIkB,EAAS7H,EAAOuE,GAAa,CAC/BI,KAAM,SACNmD,YAAaF,EAAOD,EAAKlE,GAAQqD,UAenC,GAXInG,GAAsB,OACxBkH,EAAOE,SAAWnG,KAAKoG,OAAOjH,KAAQoE,GAAQsC,IA3fnC,MA6fbA,GAAW,EACXtC,GAAQpE,KAGJJ,GAAsB,UACxBkH,EAAOzC,SAAWxD,KAAKqG,IAAI,EAAG7C,GAAU8C,OAGtCN,IAAStM,EAAI6M,WAEf7E,GAASuE,EAAQnN,EAAcE,QAE/B,IACEU,EAAI6M,WAAWC,KAAK9M,EAApBA,CAAyBoB,EAAa,UAAWJ,EAAUuL,IAC3D,MAAOQ,GAEP/E,GAASuE,EAAQnN,EAAcE,MAMrC4B,EACE,mBACA,WACMZ,EAAI0M,QACA,KAAOlL,KAAY/C,GAASqN,KAClCJ,GAAcvG,MACT0G,IAAY1G,KAAQuG,IAE7BzM,GAGF2B,EAAqBY,EAAUsK,GAAa7M,GAE5C,IAAI0N,GAAO3M,EAAI2M,MAAQ,GACnBL,GAAW,WACb,IACE,IAAIM,EAAuB7L,EAAgBQ,IAAiB,EACxDsL,EAAS7G,KAAKqG,IAChBM,GAAKtL,IAAiB,EACtBsL,GAAKrL,IAAiB,EACtBP,EAAgBQ,IAAiB,EACjCR,EAAgBM,IAAiB,EACjCN,EAAgBO,IAAiB,GAEnC,OAAO0E,KAAK8G,IACV,IAKI,EAJJ9G,KAAKoG,MACF,MAAQrL,EAAgBgM,WAAa,GAAKH,GACzCC,EACA,IAGN,MAAOhK,IAEP,OADAhE,EAAKgE,IACE,IAIXjC,EAAqB,OAAQ,WAC3B4I,GAAW8C,KACX1L,EACEM,EACA,WACMsI,GAAW8C,OAAY9C,GAAW8C,OAExCrN,KAQJ,IAgCI+N,GAkCAC,GAAUC,GAlEVC,GAAU,SAAUC,GACtB,IAAIpE,EAAO,GAIX,IACEA,EAAOoE,GAAa5M,EAAuBZ,EAAIqJ,UAC/C,MAAOpG,IACPhE,EAAKgE,IAGP,IAAIwK,EAAyB5O,EAAOwL,IACpC,GAAI/D,GAAWmH,GACb,IACErE,EAAOqE,EAAuBhL,KAAK5D,EAAQ,CAAEuK,KAAMA,KAAWA,EAC9D,MAAOnG,IACPF,EAAe,OAAQE,IAK3B,IA5YiB,SAAUmG,GAC3B,IAAK,IAAIsE,KAAKvD,GAAa,CACzB,IAAIwD,EAAgBxD,GAAYuD,GAChC,GAAKC,EAAL,CAGA,IAAIC,EAtOI,KAuOND,EAAc,GAAcA,EAvOtB,IAuO8CA,EAEtD,GACEC,IAAexE,GACf,IAAI9D,OACF,IAAM7B,EAAYmK,GAAYjK,QAAQ,SAAU,QAAU,IAC1D,KACAzB,KAAKkH,GAEP,OAAOhK,GAEX,OAAOC,EA0XHwO,CAAazE,GAQjB,MAFY,QAARS,IAAkB7J,EAAI8N,OAAM1E,GAAQpJ,EAAI8N,KAAK1J,MAAM,KAAK,IAErDgF,EAPLnK,EAAKuB,EAAiB,YAAc4I,IA8CpC2E,GAAW,SACbC,EACAC,EACAtH,EACAuH,IAEKA,GAAe5H,GAAWK,KAAWuH,EAAcvH,GACxD,IACIwH,EAGEC,EAJFrG,EAAWzB,GAAW4H,GAAeA,EAAc,aAEnD3K,EAAS0K,KAAgD,EAA9BA,EAAczE,QAAQ,OAGnDyE,GADIG,EAAQH,EAAc7J,MAAM,MACViK,QACtBF,EAAc,IAAMC,EAAM1G,KAAK,MAGjC,IAAI0B,EAAOmE,GAAQU,GAGnB,GAAK7E,GAAQyC,IAAgBzC,EAA7B,CAEAyC,GAAezC,EACflB,GAAKkB,KAAOA,EAGRjE,GAAsB,OACxB+C,GAAKoG,eACHlI,KAAKqG,IAAItL,EAA2B,aAAK,EAAGtC,EAAO0P,YAAc,IACjE,KACFrG,GAAKsG,gBACHpI,KAAKqG,IACHtL,EAAgBQ,IAAiB,EACjC9C,EAAO4P,aAAe,IACnB,MAILtJ,GAAsB,MACpBrF,EAAIsB,KAAW8G,GAAK9G,GAAYtB,EAAIsB,IAItCe,GAAUgD,GAAsB,QAClC+C,GAAKwG,aAAevM,EAAOwM,MAC3BzG,GAAK0G,cAAgBzM,EAAO8K,QAI9B,IAII4B,EAJAC,EAAOjQ,EAAOkQ,YACdC,EAAiB,aAIrB,IACEH,EAAsBC,EAAKG,iBAAiBD,GAAgB,GAAG7F,KAC/D,MAAOlG,IACPhE,EAAKgE,IAGPqK,GAAgBuB,GAC+C,EAA3D,CAAC,SAAU,gBAAgBrF,QAAQqF,GAGnCC,GACAA,EAAKE,KACwC,EAA7C,CAAC,EAAG,GAAGxF,QAAQsF,EAAKE,GAAgB7F,MAGxC,IAAI+F,EAA0BlD,GAC1BA,GAAS5H,MAhuBH,KAguBgB,GACtBlF,EACJmO,GAAWrB,IACgD,EAAvD5B,GAAmBZ,QAAQ0F,IAC3BA,GAA2BhP,EAC3Bb,EAGJ6I,GAAKiH,OACH,QAAQjN,KAAK6J,OAAkBiC,GAAeV,GAC1CjO,GACCgO,GAEP1G,EAAWD,GAAeC,EAAU,CAClCwC,KAAM3J,EACN4J,KAAMlB,GAAKkB,OAGb,IAAIgG,EAAsB,WACxB3O,EAA2BrB,EAC3B,IAAIiQ,EACFrB,GAAeV,KAAkBnI,GAAsB,MA3H1C,SACjB6I,EACAsB,EACAjC,EACAkC,EACA5I,EACAoB,GAEIiG,GAAa9B,GAAY,GAAKjE,GAAQqD,QAASlM,GAC/C+L,KAAoBlD,GAAQqD,QAAU7F,MAE1C,IAAI+J,EAAc1G,GAAkByE,KAEpCzF,GACE,CACEqE,GAAIlE,GAAQqD,QACZnC,KAAM3J,EACNwM,UAAWsD,GAAoBjC,EAAWrB,GAAW,KACrDuD,MAAOA,GAAStI,GAAeqI,GAE/B3I,SAAU7F,EAAU6F,IAEtBoB,GAGFqF,GAAmBpB,GACnBA,GAAWwD,EAEXxN,IAgGEyN,CACEzB,EACAqB,EACAhC,GACAc,EAAclH,GAAeoI,EAAQlB,GAAejP,EACpDyH,EACAoB,IAIJ,GAAKtH,EAmBH2O,SAjBA,IACM7N,GAAU+E,GAAW/E,EAAOmO,sBAC9BnO,EACGmO,qBAAqB,CAAC7N,EAAcC,IACpC6N,KAAK,SAAUC,GACd3H,GAAQ4H,QAAUD,EAAkB/N,GACpCoG,GAAQ6H,WAAaF,EAAkB9N,GACvCsN,MAEDW,SAAMX,GAETA,IAEF,MAAOvC,GACPuC,OAWFY,GAAMnR,EAAOoR,QACbC,GAAeF,GAAMA,GAAIG,UAAYjR,EACrCkR,GAAMvR,EAAOwR,cACbC,GAAgB,YAIhBtG,IAAekG,IAAgBK,OAASH,KAqB1CJ,GAAIG,WAnBEK,GAAOR,GADiB7G,GAoBAmH,IAlBrB,WACL,IAEIhH,EAFA5E,EAAMhC,UACN+N,EAAKD,GAAK1N,MAAM4N,KAAMhM,GAY1B,OAVI4B,GAAWiK,OACbjH,EAAQ,IAAIiH,MAAMpH,KAIlBG,EAAQlJ,EAAIuQ,YAAY,UAClBC,UAAUzH,GAAM/J,EAASA,GAEjCkK,EAAM5G,UAAYgC,EAClB0L,GAAI9G,GACGmH,IAMXzP,EACEsP,GACA,WACEvC,GAAS,IAEX1O,GAGF2B,EACE,WACA,WACE+M,GAAS,IAEX1O,IAKA2K,IAAuB,QAARH,IAAkB,iBAAkBhL,GACrDmC,EACE,aACA,WACE+M,GAAS,IAEX1O,GAIA2K,IAAa+D,KAEjBlP,EAAOgS,YAAc,SAAUzH,EAAMzC,EAAUoB,GAC7CgG,GAAS,EAAG3E,EAAMzC,EAAUoB,IAQ9B,IAAI+I,GAAa,CAAC,SAAU,UAExBC,GAAY,SAAUzH,EAAO3C,EAAUuH,IACpCA,GAAe5H,GAAWK,KAAWuH,EAAcvH,GAExD,IAAIqK,EAAkB1K,GAAWgD,GAC7BvB,EAAWzB,GAAW4H,GAAeA,EAAc,aACnD+C,SAAmB3H,EAEvB,GAAIwH,GAAWtH,QAAQyH,GAAa,IAAMD,EAExC,OADAjO,EAAekH,GAAmBxK,EAAY,aAAewR,GACtDlJ,IAGT,IACE,GAAIiJ,EAAiB,CACnB,IAAIE,EAAc5H,IAClB,GAAIwH,GAAWtH,eAAe0H,GAAe,EAK3C,OAJAnO,EACEkH,GACAX,EAAQ,uBAAyB4H,GAE5BnJ,IAETuB,EAAQ4H,GAEV,MAAOjO,IAEP,OADAF,EAAekH,GAAmBhH,IAC3B8E,IAGTuB,GAAS,GAAKA,GAAO3F,QAAQ,eAAgB,KAAKA,QAAQ,WAAY,IAEtE,IAAIwN,EAAc,CAAEhI,KAAM1J,EAAW6J,MAAOA,GACxC8H,GAAa9D,IAAiBtL,EAAQ,EAE1C2E,EAAWD,GAAeC,EAAUwK,GAEhC7H,GACFxB,GACEtD,EAAO2M,EAAa,CAClBhF,GAAI1G,KACJ8J,MAAOtI,IAAgBmK,GACvBpF,UACGoF,GAAa/D,KAAalI,GAAsB,KAC7CiI,GACA,KAENzG,SAAU7F,EAAU6F,KAEtBoB,IAKFsJ,GAAmB,SAAU/H,EAAO3C,EAAUoB,GAChDgJ,GAAUzH,EAAO3C,EAAUoB,IAIxBlJ,EAAOoL,MACVpL,EAAOoL,IAAqBoH,IAE9B,IAAIC,GAAYzS,EAAOoL,IAGnBsH,GAAQD,IAAaA,GAAUE,EAAIF,GAAUE,EAAI,GAMrD,IAAK,IAAIlI,MAHTzK,EAAOoL,IAAqBoH,GAGVE,GACZrO,EAAQqO,GAAOjI,MACjBrF,MAAMC,QAAQqN,GAAMjI,KAChByH,GAAUjO,MAAM,KAAMyO,GAAMjI,KAC5ByH,GAAUQ,GAAMjI,MAGxB,MAAOuD,IACP7N,EAAU6N,IA7IY,IAAU1D,GACxBqH,GA3mBkBzG,GAnN9B,CA68BElL,OACA,uBACA"} \ No newline at end of file diff --git a/dist/latest/custom/auto-events.js b/dist/latest/custom/auto-events.js index ad6fe1f0..d3657139 100644 --- a/dist/latest/custom/auto-events.js +++ b/dist/latest/custom/auto-events.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2025-06-13; 7048; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2025-06-24; 7048; v12) */ function r(t,e){var a,n;t.hasAttribute("data-simple-event")||(a=!1,h.downloads&&/^https?:\/\//i.test(t.href)&&new RegExp("\\.("+(h.downloadsExtensions||[]).join("|")+")$","i").test(t.pathname)?a="download":h.outbound&&/^https?:\/\//i.test(t.href)&&t.hostname!==m.location.hostname?a="outbound":h.emails&&/^mailto:/i.test(t.href)&&(a="email"),a&&(e?(n="saAutomatedLink(this, '"+a+"');",t.hasAttribute("target")&&"_self"!==t.getAttribute("target")||(n+=" return false;"),t.setAttribute("onclick",n)):t.addEventListener("click",function(){g(t,a)})))}function e(){try{for(var t=document.getElementsByTagName("a"),e=0;e>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},at=function(t){return"function"==typeof t},it="namespace",ot=t[it]||L(z,it)||"sa",ct=function(t,e){var n=d[ot+"_metadata"];Z(n)&&(t=K(t,n));var r=d[Mt];if(!at(r))return t;try{return K(t,r.call(d,K(t,e)))}catch(a){F("metadata",a)}},st=t.strictUtm||L(z,"strict-utm")==r,ut=function(a,t){return(t||s.search).slice(1).split("&").filter(function(t){var e=a||!et("ut"),n=Et.map(J).join("|"),r=e?"^("+n+")=":"^((utm_)"+(st?"":"?")+"(source|medium|content|term|campaign)"+(st?"":"|ref")+"|"+n+")=";return e&&!Et.length?y:new RegExp(r).test(t)}).join("&")||v},lt=ot+"_loaded";if(d[lt]==g)return m(f+"twice");d.sa_event_loaded=g,d[lt]=g;var pt=function(e,t,n){e=n?e:K($t,Ct,e),w.brave&&!n&&(e.brave=g),w._duckduckgoloader_&&!n&&(e.duck=g);var r=new Image;t&&(r.onerror=t,r.onload=t),r.src=k+"/simple.gif?"+Object.keys(e).filter(function(t){return e[t]!=v}).map(function(t){return E(t)+"="+E(e[t])}).join("&")+"&time="+Date.now()},ft=t.hostname||L(z,"hostname"),ht=ft||b,dt={version:"custom_events_12",hostname:ht};n=function(t){t=t.stack?t+" "+t.stack:t,m(t),pt(K(dt,{type:i,error:t,path:s.pathname}),v,g)},M(i,function(t){t.filename&&-1"); +!function(d,t,e,n,m){try{var v=undefined,g=!0,y=!1,r="true",a="https:",_="pageview",u="event",i="error",o=d.console,c="doNotTrack",w=d.navigator,s=d.location,b=s.host,l=d.document,p=w.userAgent,f="Not sending request ",h=f+"when ",O=y,E=encodeURIComponent,x=decodeURIComponent,S=JSON.stringify,M=d.addEventListener,k="https://"+e,A=l.documentElement||{},q="language",$="Height",j="scroll",D=w.userAgentData,C=j+$,H="offset"+$,R="client"+$,P="pagehide",T="platform",U="platformVersion",I="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),N=d.screen,z=l.currentScript||l.querySelector('script[src*="'+e+'"]');m=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){m("Error in your "+t+" function:",e)},W=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},G=function(t){return"string"==typeof t},J=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},L=function(t,e){return t&&t.getAttribute("data-"+e)},Y=function(t){return Array.isArray(t)?t:G(t)&&t.length?t.split(/, ?/):[]},Z=function(t){return t&&t.constructor===Object},K=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},at=function(t){return"function"==typeof t},it="namespace",ot=t[it]||L(z,it)||"sa",ct=function(t,e){var n=d[ot+"_metadata"];Z(n)&&(t=K(t,n));var r=d[Mt];if(!at(r))return Mt&&m(Mt+" not found, set window."+Mt),t;try{return K(t,r.call(d,K(t,e)))}catch(a){F("metadata",a)}},st=t.strictUtm||L(z,"strict-utm")==r,ut=function(a,t){return(t||s.search).slice(1).split("&").filter(function(t){var e=a||!et("ut"),n=Et.map(J).join("|"),r=e?"^("+n+")=":"^((utm_)"+(st?"":"?")+"(source|medium|content|term|campaign)"+(st?"":"|ref")+"|"+n+")=";return e&&!Et.length?y:new RegExp(r).test(t)}).join("&")||v},lt=ot+"_loaded";if(d[lt]==g)return m(f+"twice");d.sa_event_loaded=g,d[lt]=g;var pt=function(e,t,n){e=n?e:K($t,Ct,e),w.brave&&!n&&(e.brave=g),w._duckduckgoloader_&&!n&&(e.duck=g);var r=new Image;t&&(r.onerror=t,r.onload=t),r.src=k+"/simple.gif?"+Object.keys(e).filter(function(t){return e[t]!=v}).map(function(t){return E(t)+"="+E(e[t])}).join("&")+"&time="+Date.now()},ft=t.hostname||L(z,"hostname"),ht=ft||b,dt={version:"custom_events_12",hostname:ht};n=function(t){t=t.stack?t+" "+t.stack:t,m(t),pt(K(dt,{type:i,error:t,path:s.pathname}),v,g)},M(i,function(t){t.filename&&-1"); //# sourceMappingURL=e.js.map \ No newline at end of file diff --git a/dist/latest/custom/e.js.map b/dist/latest/custom/e.js.map index 766a6866..87606e34 100644 --- a/dist/latest/custom/e.js.map +++ b/dist/latest/custom/e.js.map @@ -1 +1 @@ -{"version":3,"file":"e.source.js","sources":["e.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) return metadata;\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n return (\n (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex).test(keyValue);\n })\n .join(\"&\") || undefinedVar\n );\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n query,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query || getQueryParams(deleteSourceInfo),\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch ? getQueryParams(delSrc, querySearch) : undefinedVar,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_events_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","search","keyValue","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","indexOf","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","protocol","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","i","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","query","currentPage","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue","q"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"e.source.js","sources":["e.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n return (\n (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex).test(keyValue);\n })\n .join(\"&\") || undefinedVar\n );\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n query,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query || getQueryParams(deleteSourceInfo),\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch ? getQueryParams(delSrc, querySearch) : undefinedVar,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_events_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","search","keyValue","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","indexOf","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","protocol","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","i","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","query","currentPage","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue","q"],"mappings":"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"} \ No newline at end of file diff --git a/dist/latest/custom/latest.dev.js b/dist/latest/custom/latest.dev.js index e961432d..d6777e9d 100644 --- a/dist/latest/custom/latest.dev.js +++ b/dist/latest/custom/latest.dev.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2025-06-13; 2f24; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2025-06-24; 67c4; v12) */ /* eslint-env browser */ (function ( @@ -195,7 +195,13 @@ var metadataObject = window[namespace + "_metadata"]; if (isObject(metadataObject)) metadata = assign(metadata, metadataObject); var metadataCollectorFunction = window[metadataCollector]; - if (!isFunction(metadataCollectorFunction)) return metadata; + if (!isFunction(metadataCollectorFunction)) { + if (metadataCollector) + warn( + metadataCollector + " not found, set window." + metadataCollector + ); + return metadata; + } try { return assign( metadata, diff --git a/dist/latest/custom/latest.js b/dist/latest/custom/latest.js index 41ceef76..ab7344a2 100644 --- a/dist/latest/custom/latest.js +++ b/dist/latest/custom/latest.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2025-06-13; 11f1; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2025-06-24; 019f; v12) */ -!function(d,t,e,n,m){try{var g=undefined,v=!0,y=!1,r="true",a="https:",_="pageview",u="event",i="error",o=d.console,c="doNotTrack",w=d.navigator,s=d.location,b=s.host,l=d.document,p=w.userAgent,f="Not sending request ",h=f+"when ",O=y,E=encodeURIComponent,x=decodeURIComponent,S=JSON.stringify,M=d.addEventListener,k="https://"+e,A=l.documentElement||{},q="language",$="Height",j="scroll",D=w.userAgentData,C=j+$,H="offset"+$,R="client"+$,P="pagehide",T="platform",U="platformVersion",I="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),N=d.screen,z=l.currentScript||l.querySelector('script[src*="'+e+'"]');m=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){m("Error in your "+t+" function:",e)},W=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},G=function(t){return"string"==typeof t},J=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},L=function(t,e){return t&&t.getAttribute("data-"+e)},Y=function(t){return Array.isArray(t)?t:G(t)&&t.length?t.split(/, ?/):[]},Z=function(t){return t&&t.constructor===Object},K=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},at=function(t){return"function"==typeof t},it="namespace",ot=t[it]||L(z,it)||"sa",ct=function(t,e){var n=d[ot+"_metadata"];Z(n)&&(t=K(t,n));var r=d[Mt];if(!at(r))return t;try{return K(t,r.call(d,K(t,e)))}catch(a){F("metadata",a)}},st=t.strictUtm||L(z,"strict-utm")==r,ut=function(a,t){return(t||s.search).slice(1).split("&").filter(function(t){var e=a||!et("ut"),n=Et.map(J).join("|"),r=e?"^("+n+")=":"^((utm_)"+(st?"":"?")+"(source|medium|content|term|campaign)"+(st?"":"|ref")+"|"+n+")=";return e&&!Et.length?y:new RegExp(r).test(t)}).join("&")||g},lt=ot+"_loaded";if(d[lt]==v)return m(f+"twice");d.sa_event_loaded=v,d[lt]=v;var pt=function(e,t,n){e=n?e:K($t,Ct,e),w.brave&&!n&&(e.brave=v),w._duckduckgoloader_&&!n&&(e.duck=v);var r=new Image;t&&(r.onerror=t,r.onload=t),r.src=k+"/simple.gif?"+Object.keys(e).filter(function(t){return e[t]!=g}).map(function(t){return E(t)+"="+E(e[t])}).join("&")+"&time="+Date.now()},ft=t.hostname||L(z,"hostname"),ht=ft||b,dt={version:"custom_latest_12",hostname:ht};n=function(t){t=t.stack?t+" "+t.stack:t,m(t),pt(K(dt,{type:i,error:t,path:s.pathname}),g,v)},M(i,function(t){t.filename&&-1"); +!function(d,t,e,n,m){try{var g=undefined,v=!0,y=!1,r="true",a="https:",_="pageview",u="event",i="error",o=d.console,c="doNotTrack",w=d.navigator,s=d.location,b=s.host,l=d.document,p=w.userAgent,f="Not sending request ",h=f+"when ",O=y,E=encodeURIComponent,x=decodeURIComponent,S=JSON.stringify,M=d.addEventListener,k="https://"+e,A=l.documentElement||{},q="language",$="Height",j="scroll",D=w.userAgentData,C=j+$,H="offset"+$,R="client"+$,P="pagehide",T="platform",U="platformVersion",I="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),N=d.screen,z=l.currentScript||l.querySelector('script[src*="'+e+'"]');m=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){m("Error in your "+t+" function:",e)},W=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},G=function(t){return"string"==typeof t},J=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},L=function(t,e){return t&&t.getAttribute("data-"+e)},Y=function(t){return Array.isArray(t)?t:G(t)&&t.length?t.split(/, ?/):[]},Z=function(t){return t&&t.constructor===Object},K=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},at=function(t){return"function"==typeof t},it="namespace",ot=t[it]||L(z,it)||"sa",ct=function(t,e){var n=d[ot+"_metadata"];Z(n)&&(t=K(t,n));var r=d[Mt];if(!at(r))return Mt&&m(Mt+" not found, set window."+Mt),t;try{return K(t,r.call(d,K(t,e)))}catch(a){F("metadata",a)}},st=t.strictUtm||L(z,"strict-utm")==r,ut=function(a,t){return(t||s.search).slice(1).split("&").filter(function(t){var e=a||!et("ut"),n=Et.map(J).join("|"),r=e?"^("+n+")=":"^((utm_)"+(st?"":"?")+"(source|medium|content|term|campaign)"+(st?"":"|ref")+"|"+n+")=";return e&&!Et.length?y:new RegExp(r).test(t)}).join("&")||g},lt=ot+"_loaded";if(d[lt]==v)return m(f+"twice");d.sa_event_loaded=v,d[lt]=v;var pt=function(e,t,n){e=n?e:K($t,Ct,e),w.brave&&!n&&(e.brave=v),w._duckduckgoloader_&&!n&&(e.duck=v);var r=new Image;t&&(r.onerror=t,r.onload=t),r.src=k+"/simple.gif?"+Object.keys(e).filter(function(t){return e[t]!=g}).map(function(t){return E(t)+"="+E(e[t])}).join("&")+"&time="+Date.now()},ft=t.hostname||L(z,"hostname"),ht=ft||b,dt={version:"custom_latest_12",hostname:ht};n=function(t){t=t.stack?t+" "+t.stack:t,m(t),pt(K(dt,{type:i,error:t,path:s.pathname}),g,v)},M(i,function(t){t.filename&&-1"); //# sourceMappingURL=latest.js.map \ No newline at end of file diff --git a/dist/latest/custom/latest.js.map b/dist/latest/custom/latest.js.map index e9767ce5..5113f1bc 100644 --- a/dist/latest/custom/latest.js.map +++ b/dist/latest/custom/latest.js.map @@ -1 +1 @@ -{"version":3,"file":"latest.source.js","sources":["latest.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) return metadata;\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n return (\n (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex).test(keyValue);\n })\n .join(\"&\") || undefinedVar\n );\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n query,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query || getQueryParams(deleteSourceInfo),\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch ? getQueryParams(delSrc, querySearch) : undefinedVar,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_latest_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","search","keyValue","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","indexOf","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","protocol","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","i","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","query","currentPage","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue","q"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"latest.source.js","sources":["latest.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n return (\n (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex).test(keyValue);\n })\n .join(\"&\") || undefinedVar\n );\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n query,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query || getQueryParams(deleteSourceInfo),\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch ? getQueryParams(delSrc, querySearch) : undefinedVar,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_latest_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","search","keyValue","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","indexOf","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","protocol","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","i","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","query","currentPage","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue","q"],"mappings":"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"} \ No newline at end of file diff --git a/dist/latest/custom/light.js b/dist/latest/custom/light.js index b3a77933..80b6f837 100644 --- a/dist/latest/custom/light.js +++ b/dist/latest/custom/light.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2025-06-13; 971c; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2025-06-24; 971c; v12) */ !function(l,e,t,f){try{var m=undefined,n="https:",r=l.console,a="doNotTrack",g=l.navigator,i=l.location,h=i.host,o=l.document,c=g.userAgent,s="Not sending request ",v=!1,u=encodeURIComponent,p=decodeURIComponent,d=JSON.stringify,y=l.addEventListener,_="https://"+t,b=(o.documentElement,"language"),w=g.userAgentData,O="platform",S="platformVersion",j="https://docs.simpleanalytics.com",k=/(bot|spider|crawl)/i.test(c)&&!/(cubot)/i.test(c),x=o.currentScript||o.querySelector('script[src*="'+t+'"]');f=function(){var e=[].slice.call(arguments);return e.unshift("Simple Analytics:"),Function.prototype.apply.call(r.warn,r,e)};var E=function(e){return"string"==typeof e},A=function(e,t){return e&&e.getAttribute("data-"+t)},$=function(){for(var e,t,n,r={},a=arguments,i=0;i>e/4).toString(16)})}catch(r){return e.replace(n,function(e){var t=16*Math.random()|0;return(e<2?t:3&t|8).toString(16)})}},N=function(e){return"function"==typeof e},R="namespace",U=e[R]||A(x,R)||"sa",V=e.strictUtm||"true"==A(x,"strict-utm"),B=function(t,e){return(e||i.search).slice(1).split("&").filter(function(e){return!t&&new RegExp("^((utm_)"+(V?"":"?")+"(source|medium|content|term|campaign)"+(V?"":"|ref")+")=").test(e)}).join("&")||m},C=U+"_loaded";if(1==l[C])return f(s+"twice");l.sa_event_loaded=!0,l[C]=!0;var H,T=function(t,e,n){t=n?t:$(L,P,t),g.brave&&!n&&(t.brave=!0),g._duckduckgoloader_&&!n&&(t.duck=!0),(new Image).src=_+"/simple.gif?"+Object.keys(t).filter(function(e){return t[e]!=m}).map(function(e){return u(e)+"="+u(t[e])}).join("&")+"&time="+Date.now()},F=e.hostname||A(x,"hostname"),z=F||h,J={version:"custom_light_12",hostname:z};e.mode||A(x,"mode");try{H=Intl.DateTimeFormat().resolvedOptions().timeZone}catch(X){f(X)}k&&(J.bot=!0);var L=$(J,{ua:c,https:i.protocol==n,timezone:H,page_id:I(),session_id:I()});if(L.sri=!1,w&&(L.mobile=w.mobile,L.brands=d(w.brands)),z!==h&&(L.hostname_original=h),a in g&&"1"==g[a])return f("Not sending request when "+a+" is enabled. See "+j+"/dnt");-1!=h.indexOf(".")&&!/^[0-9.:]+$/.test(h)||F||f("Set hostname on "+h+". See "+j+"/overwrite-domain-name");var M,P={},Z=(e.referrer||A(x,"referrer")||o.referrer||"").replace(h,z).replace(/^https?:\/\/((m|l|w{2,3}([0-9]+)?)\.)?([^?#]+)(.*)$/,"$4").replace(/^([^/]+)$/,"$1")||m,G=function(e,t){var n=$(J,{type:"append",original_id:t?e:L.page_id});if(t||!g.sendBeacon)T(n,0,!0);else try{g.sendBeacon.bind(g)(_+"/append",d(n))}catch(r){T(n,0,!0)}};y("pagehide",G,!1);var K,Q,W=function(e){var t="";try{t=e||p(i.pathname)}catch(X){f(X)}return t};!function(t,e,n,r){!r&&N(n)&&(r=n);var a,i;N(r);E(e)&&-1"); //# sourceMappingURL=light.js.map \ No newline at end of file diff --git a/dist/latest/custom/proxy.js b/dist/latest/custom/proxy.js index 425a1a94..2f733240 100644 --- a/dist/latest/custom/proxy.js +++ b/dist/latest/custom/proxy.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2025-06-13; 47e3; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2025-06-24; 1d2a; v12) */ -!function(d,t,e,n,m){try{var g=undefined,v=!0,y=!1,r="true",a="https:",_="pageview",u="event",i="error",o=d.console,c="doNotTrack",w=d.navigator,s=d.location,b=s.host,l=d.document,p=w.userAgent,f="Not sending request ",h=f+"when ",x=y,O=encodeURIComponent,E=decodeURIComponent,S=JSON.stringify,M=d.addEventListener,k="https://"+e,A=l.documentElement||{},q="language",$="Height",j="scroll",D=w.userAgentData,C=j+$,H="offset"+$,P="client"+$,R="pagehide",T="platform",U="platformVersion",I="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),N=d.screen,z=l.currentScript||l.querySelector('script[src*="'+e+'"]');m=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){m("Error in your "+t+" function:",e)},W=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},G=function(t){return"string"==typeof t},J=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},L=function(t,e){return t&&t.getAttribute("data-"+e)},Y=function(t){return Array.isArray(t)?t:G(t)&&t.length?t.split(/, ?/):[]},Z=function(t){return t&&t.constructor===Object},K=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},at=function(t){return"function"==typeof t},it="namespace",ot=t[it]||L(z,it)||"sa",ct=function(t,e){var n=d[ot+"_metadata"];Z(n)&&(t=K(t,n));var r=d[Mt];if(!at(r))return t;try{return K(t,r.call(d,K(t,e)))}catch(a){F("metadata",a)}},st=t.strictUtm||L(z,"strict-utm")==r,ut=function(a,t){return(t||s.search).slice(1).split("&").filter(function(t){var e=a||!et("ut"),n=Ot.map(J).join("|"),r=e?"^("+n+")=":"^((utm_)"+(st?"":"?")+"(source|medium|content|term|campaign)"+(st?"":"|ref")+"|"+n+")=";return e&&!Ot.length?y:new RegExp(r).test(t)}).join("&")||g},lt=ot+"_loaded";if(d[lt]==v)return m(f+"twice");d.sa_event_loaded=v,d[lt]=v;var pt=function(e,t,n){e=n?e:K($t,Ct,e),w.brave&&!n&&(e.brave=v),w._duckduckgoloader_&&!n&&(e.duck=v);var r=new Image;t&&(r.onerror=t,r.onload=t),r.src=k+"/simple.gif?"+Object.keys(e).filter(function(t){return e[t]!=g}).map(function(t){return O(t)+"="+O(e[t])}).join("&")+"&time="+Date.now()},ft=t.hostname||L(z,"hostname"),ht=ft||b,dt={version:"custom_proxy_12",hostname:ht};n=function(t){t=t.stack?t+" "+t.stack:t,m(t),pt(K(dt,{type:i,error:t,path:s.pathname}),g,v)},M(i,function(t){t.filename&&-1"); +!function(d,t,e,n,m){try{var g=undefined,v=!0,y=!1,r="true",a="https:",_="pageview",u="event",i="error",o=d.console,c="doNotTrack",w=d.navigator,s=d.location,b=s.host,l=d.document,p=w.userAgent,f="Not sending request ",h=f+"when ",x=y,O=encodeURIComponent,E=decodeURIComponent,S=JSON.stringify,M=d.addEventListener,k="https://"+e,A=l.documentElement||{},q="language",$="Height",j="scroll",D=w.userAgentData,C=j+$,H="offset"+$,P="client"+$,R="pagehide",T="platform",U="platformVersion",I="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),N=d.screen,z=l.currentScript||l.querySelector('script[src*="'+e+'"]');m=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){m("Error in your "+t+" function:",e)},W=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},G=function(t){return"string"==typeof t},J=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},L=function(t,e){return t&&t.getAttribute("data-"+e)},Y=function(t){return Array.isArray(t)?t:G(t)&&t.length?t.split(/, ?/):[]},Z=function(t){return t&&t.constructor===Object},K=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},at=function(t){return"function"==typeof t},it="namespace",ot=t[it]||L(z,it)||"sa",ct=function(t,e){var n=d[ot+"_metadata"];Z(n)&&(t=K(t,n));var r=d[Mt];if(!at(r))return Mt&&m(Mt+" not found, set window."+Mt),t;try{return K(t,r.call(d,K(t,e)))}catch(a){F("metadata",a)}},st=t.strictUtm||L(z,"strict-utm")==r,ut=function(a,t){return(t||s.search).slice(1).split("&").filter(function(t){var e=a||!et("ut"),n=Ot.map(J).join("|"),r=e?"^("+n+")=":"^((utm_)"+(st?"":"?")+"(source|medium|content|term|campaign)"+(st?"":"|ref")+"|"+n+")=";return e&&!Ot.length?y:new RegExp(r).test(t)}).join("&")||g},lt=ot+"_loaded";if(d[lt]==v)return m(f+"twice");d.sa_event_loaded=v,d[lt]=v;var pt=function(e,t,n){e=n?e:K($t,Ct,e),w.brave&&!n&&(e.brave=v),w._duckduckgoloader_&&!n&&(e.duck=v);var r=new Image;t&&(r.onerror=t,r.onload=t),r.src=k+"/simple.gif?"+Object.keys(e).filter(function(t){return e[t]!=g}).map(function(t){return O(t)+"="+O(e[t])}).join("&")+"&time="+Date.now()},ft=t.hostname||L(z,"hostname"),ht=ft||b,dt={version:"custom_proxy_12",hostname:ht};n=function(t){t=t.stack?t+" "+t.stack:t,m(t),pt(K(dt,{type:i,error:t,path:s.pathname}),g,v)},M(i,function(t){t.filename&&-1"); //# sourceMappingURL=proxy.js.map \ No newline at end of file diff --git a/dist/latest/custom/proxy.js.map b/dist/latest/custom/proxy.js.map index be577226..7554d2cd 100644 --- a/dist/latest/custom/proxy.js.map +++ b/dist/latest/custom/proxy.js.map @@ -1 +1 @@ -{"version":3,"file":"proxy.source.js","sources":["proxy.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) return metadata;\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n return (\n (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex).test(keyValue);\n })\n .join(\"&\") || undefinedVar\n );\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n query,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query || getQueryParams(deleteSourceInfo),\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch ? getQueryParams(delSrc, querySearch) : undefinedVar,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_proxy_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","search","keyValue","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","indexOf","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","protocol","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","i","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","query","currentPage","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue","q"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"proxy.source.js","sources":["proxy.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n return (\n (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex).test(keyValue);\n })\n .join(\"&\") || undefinedVar\n );\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n query,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query || getQueryParams(deleteSourceInfo),\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch ? getQueryParams(delSrc, querySearch) : undefinedVar,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_proxy_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","search","keyValue","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","indexOf","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","protocol","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","i","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","query","currentPage","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue","q"],"mappings":"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"} \ No newline at end of file diff --git a/dist/latest/hello.js b/dist/latest/hello.js index a7e48d06..8bfecfe4 100644 --- a/dist/latest/hello.js +++ b/dist/latest/hello.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2025-06-13; 82c5) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2025-06-24; 69f5) */ -!function(d,t,e,n,m){try{var v=undefined,g=!0,y=!1,r="true",a="https:",_="pageview",u="event",i="error",o=d.console,c="doNotTrack",w=d.navigator,s=d.location,b=s.host,l=d.document,p=w.userAgent,f="Not sending request ",h=f+"when ",O=y,E=encodeURIComponent,x=decodeURIComponent,S=JSON.stringify,M=d.addEventListener,k="https://queue."+e,q=l.documentElement||{},A="language",$="Height",j="scroll",D=w.userAgentData,C=j+$,R="offset"+$,H="client"+$,P="pagehide",T="platform",U="platformVersion",I="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),N=d.screen,z=l.currentScript||l.querySelector('script[src*="'+e+'"]');m=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){m("Error in your "+t+" function:",e)},W=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},G=function(t){return"string"==typeof t},J=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},L=function(t,e){return t&&t.getAttribute("data-"+e)},Y=function(t){return Array.isArray(t)?t:G(t)&&t.length?t.split(/, ?/):[]},Z=function(t){return t&&t.constructor===Object},K=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},at=function(t){return"function"==typeof t},it="namespace",ot=t[it]||L(z,it)||"sa",ct=function(t,e){var n=d[ot+"_metadata"];Z(n)&&(t=K(t,n));var r=d[Mt];if(!at(r))return t;try{return K(t,r.call(d,K(t,e)))}catch(a){F("metadata",a)}},st=t.strictUtm||L(z,"strict-utm")==r,ut=function(a,t){return(t||s.search).slice(1).split("&").filter(function(t){var e=a||!et("ut"),n=Et.map(J).join("|"),r=e?"^("+n+")=":"^((utm_)"+(st?"":"?")+"(source|medium|content|term|campaign)"+(st?"":"|ref")+"|"+n+")=";return e&&!Et.length?y:new RegExp(r).test(t)}).join("&")||v},lt=ot+"_loaded";if(d[lt]==g)return m(f+"twice");d.sa_event_loaded=g,d[lt]=g;var pt=function(e,t,n){e=n?e:K($t,Ct,e),w.brave&&!n&&(e.brave=g),w._duckduckgoloader_&&!n&&(e.duck=g);var r=new Image;t&&(r.onerror=t,r.onload=t),r.src=k+"/simple.gif?"+Object.keys(e).filter(function(t){return e[t]!=v}).map(function(t){return E(t)+"="+E(e[t])}).join("&")+"&time="+Date.now()},ft=t.hostname||L(z,"hostname"),ht=ft||b,dt={version:"cdn_hello_12",hostname:ht};n=function(t){t=t.stack?t+" "+t.stack:t,m(t),pt(K(dt,{type:i,error:t,path:s.pathname}),v,g)},M(i,function(t){t.filename&&-1>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},at=function(t){return"function"==typeof t},it="namespace",ot=t[it]||L(z,it)||"sa",ct=function(t,e){var n=d[ot+"_metadata"];Z(n)&&(t=K(t,n));var r=d[Mt];if(!at(r))return Mt&&m(Mt+" not found, set window."+Mt),t;try{return K(t,r.call(d,K(t,e)))}catch(a){F("metadata",a)}},st=t.strictUtm||L(z,"strict-utm")==r,ut=function(a,t){return(t||s.search).slice(1).split("&").filter(function(t){var e=a||!et("ut"),n=Et.map(J).join("|"),r=e?"^("+n+")=":"^((utm_)"+(st?"":"?")+"(source|medium|content|term|campaign)"+(st?"":"|ref")+"|"+n+")=";return e&&!Et.length?y:new RegExp(r).test(t)}).join("&")||v},lt=ot+"_loaded";if(d[lt]==g)return m(f+"twice");d.sa_event_loaded=g,d[lt]=g;var pt=function(e,t,n){e=n?e:K($t,Ct,e),w.brave&&!n&&(e.brave=g),w._duckduckgoloader_&&!n&&(e.duck=g);var r=new Image;t&&(r.onerror=t,r.onload=t),r.src=k+"/simple.gif?"+Object.keys(e).filter(function(t){return e[t]!=v}).map(function(t){return E(t)+"="+E(e[t])}).join("&")+"&time="+Date.now()},ft=t.hostname||L(z,"hostname"),ht=ft||b,dt={version:"cdn_hello_12",hostname:ht};n=function(t){t=t.stack?t+" "+t.stack:t,m(t),pt(K(dt,{type:i,error:t,path:s.pathname}),v,g)},M(i,function(t){t.filename&&-1> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) return metadata;\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n return (\n (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex).test(keyValue);\n })\n .join(\"&\") || undefinedVar\n );\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n query,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query || getQueryParams(deleteSourceInfo),\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch ? getQueryParams(delSrc, querySearch) : undefinedVar,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"simpleanalyticscdn.com\",\n \"queue.\",\n \"cdn_hello_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","protocol","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","search","keyValue","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","indexOf","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","i","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","query","currentPage","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue","q"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"hello.source.js","sources":["hello.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n return (\n (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex).test(keyValue);\n })\n .join(\"&\") || undefinedVar\n );\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n query,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query || getQueryParams(deleteSourceInfo),\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch ? getQueryParams(delSrc, querySearch) : undefinedVar,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"simpleanalyticscdn.com\",\n \"queue.\",\n \"cdn_hello_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","protocol","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","search","keyValue","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","indexOf","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","i","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","query","currentPage","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue","q"],"mappings":"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"} \ No newline at end of file diff --git a/dist/latest/latest.dev.js b/dist/latest/latest.dev.js index 87bfa138..17543b84 100644 --- a/dist/latest/latest.dev.js +++ b/dist/latest/latest.dev.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2025-06-13; a5d8; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2025-06-24; 80f5; v12) */ /* eslint-env browser */ (function ( @@ -195,7 +195,13 @@ var metadataObject = window[namespace + "_metadata"]; if (isObject(metadataObject)) metadata = assign(metadata, metadataObject); var metadataCollectorFunction = window[metadataCollector]; - if (!isFunction(metadataCollectorFunction)) return metadata; + if (!isFunction(metadataCollectorFunction)) { + if (metadataCollector) + warn( + metadataCollector + " not found, set window." + metadataCollector + ); + return metadata; + } try { return assign( metadata, diff --git a/dist/latest/latest.js b/dist/latest/latest.js index dfc727c5..b24f2ad2 100644 --- a/dist/latest/latest.js +++ b/dist/latest/latest.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2025-06-13; ea5c; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2025-06-24; ce07; v12) */ -!function(d,t,e,n,m){try{var v=undefined,g=!0,y=!1,r="true",a="https:",_="pageview",u="event",i="error",o=d.console,c="doNotTrack",w=d.navigator,s=d.location,b=s.host,l=d.document,p=w.userAgent,f="Not sending request ",h=f+"when ",O=y,E=encodeURIComponent,x=decodeURIComponent,S=JSON.stringify,M=d.addEventListener,k="https://queue."+e,q=l.documentElement||{},A="language",$="Height",j="scroll",D=w.userAgentData,C=j+$,R="offset"+$,H="client"+$,P="pagehide",T="platform",U="platformVersion",I="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),N=d.screen,z=l.currentScript||l.querySelector('script[src*="'+e+'"]');m=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){m("Error in your "+t+" function:",e)},W=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},G=function(t){return"string"==typeof t},J=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},L=function(t,e){return t&&t.getAttribute("data-"+e)},Y=function(t){return Array.isArray(t)?t:G(t)&&t.length?t.split(/, ?/):[]},Z=function(t){return t&&t.constructor===Object},K=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},at=function(t){return"function"==typeof t},it="namespace",ot=t[it]||L(z,it)||"sa",ct=function(t,e){var n=d[ot+"_metadata"];Z(n)&&(t=K(t,n));var r=d[Mt];if(!at(r))return t;try{return K(t,r.call(d,K(t,e)))}catch(a){F("metadata",a)}},st=t.strictUtm||L(z,"strict-utm")==r,ut=function(a,t){return(t||s.search).slice(1).split("&").filter(function(t){var e=a||!et("ut"),n=Et.map(J).join("|"),r=e?"^("+n+")=":"^((utm_)"+(st?"":"?")+"(source|medium|content|term|campaign)"+(st?"":"|ref")+"|"+n+")=";return e&&!Et.length?y:new RegExp(r).test(t)}).join("&")||v},lt=ot+"_loaded";if(d[lt]==g)return m(f+"twice");d.sa_event_loaded=g,d[lt]=g;var pt=function(e,t,n){e=n?e:K($t,Ct,e),w.brave&&!n&&(e.brave=g),w._duckduckgoloader_&&!n&&(e.duck=g);var r=new Image;t&&(r.onerror=t,r.onload=t),r.src=k+"/simple.gif?"+Object.keys(e).filter(function(t){return e[t]!=v}).map(function(t){return E(t)+"="+E(e[t])}).join("&")+"&time="+Date.now()},ft=t.hostname||L(z,"hostname"),ht=ft||b,dt={version:"cdn_latest_12",hostname:ht};n=function(t){t=t.stack?t+" "+t.stack:t,m(t),pt(K(dt,{type:i,error:t,path:s.pathname}),v,g)},M(i,function(t){t.filename&&-1>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},at=function(t){return"function"==typeof t},it="namespace",ot=t[it]||L(z,it)||"sa",ct=function(t,e){var n=d[ot+"_metadata"];Z(n)&&(t=K(t,n));var r=d[Mt];if(!at(r))return Mt&&m(Mt+" not found, set window."+Mt),t;try{return K(t,r.call(d,K(t,e)))}catch(a){F("metadata",a)}},st=t.strictUtm||L(z,"strict-utm")==r,ut=function(a,t){return(t||s.search).slice(1).split("&").filter(function(t){var e=a||!et("ut"),n=Et.map(J).join("|"),r=e?"^("+n+")=":"^((utm_)"+(st?"":"?")+"(source|medium|content|term|campaign)"+(st?"":"|ref")+"|"+n+")=";return e&&!Et.length?y:new RegExp(r).test(t)}).join("&")||v},lt=ot+"_loaded";if(d[lt]==g)return m(f+"twice");d.sa_event_loaded=g,d[lt]=g;var pt=function(e,t,n){e=n?e:K($t,Ct,e),w.brave&&!n&&(e.brave=g),w._duckduckgoloader_&&!n&&(e.duck=g);var r=new Image;t&&(r.onerror=t,r.onload=t),r.src=k+"/simple.gif?"+Object.keys(e).filter(function(t){return e[t]!=v}).map(function(t){return E(t)+"="+E(e[t])}).join("&")+"&time="+Date.now()},ft=t.hostname||L(z,"hostname"),ht=ft||b,dt={version:"cdn_latest_12",hostname:ht};n=function(t){t=t.stack?t+" "+t.stack:t,m(t),pt(K(dt,{type:i,error:t,path:s.pathname}),v,g)},M(i,function(t){t.filename&&-1> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) return metadata;\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n return (\n (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex).test(keyValue);\n })\n .join(\"&\") || undefinedVar\n );\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n query,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query || getQueryParams(deleteSourceInfo),\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch ? getQueryParams(delSrc, querySearch) : undefinedVar,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"simpleanalyticscdn.com\",\n \"queue.\",\n \"cdn_latest_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","protocol","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","search","keyValue","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","indexOf","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","i","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","query","currentPage","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue","q"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"latest.source.js","sources":["latest.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n return (\n (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex).test(keyValue);\n })\n .join(\"&\") || undefinedVar\n );\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n query,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query || getQueryParams(deleteSourceInfo),\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch ? getQueryParams(delSrc, querySearch) : undefinedVar,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"simpleanalyticscdn.com\",\n \"queue.\",\n \"cdn_latest_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","protocol","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","search","keyValue","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","indexOf","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","i","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","query","currentPage","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue","q"],"mappings":";;CAEA,SACEA,EACAC,EACAC,EAIAC,EACAC,GAEA,IAQE,IAAIC,EAAeC,UACfC,GAAU,EACVC,GAAW,EACXC,EAAW,OACXC,EAAQ,SACRC,EAAe,WACfC,EAAY,QACZC,EAAY,QAGZC,EAAMd,EAAOe,QACbC,EAAa,aACbC,EAAMjB,EAAOkB,UACbC,EAAMnB,EAAOoB,SACbC,EAAmBF,EAAIG,KACvBC,EAAMvB,EAAOwB,SACbC,EAAYR,EAAIQ,UAChBC,EAAa,uBACbC,EAAiBD,EAAa,QAC9BE,EAA2BpB,EAC3BqB,EAAyBC,mBACzBC,EAAyBC,mBACzBC,EAAYC,KAAKD,UAEjBE,EAAuBnC,EAAOoC,iBAC9BC,EAAaC,iBAA0BpC,EACvCqC,EAAkBhB,EAAIgB,iBAAmB,GACzCC,EAAW,WACXC,EAAS,SAETC,EAAS,SACTC,EAAS1B,EAAI2B,cACbC,EAAeH,EAASD,EACxBK,EAAe,SAAWL,EAC1BM,EAAe,SAAWN,EAE1BO,EAAW,WACXC,EAAe,WACfC,EAAsB,kBACtBC,EAAU,mCACVC,EAAQ,EACRC,EACF,sBAAsBC,KAAK7B,KAAe,WAAW6B,KAAK7B,GACxD8B,EAASvD,EAAOuD,OAIhBC,EACFjC,EAAIkC,eAAiBlC,EAAImC,cAAc,gBAAkBxD,EAAU,MAOrEE,EAAO,WAEL,IAAIuD,EAAO,GAAGC,MAAMC,KAAKC,WAOzB,OAJAH,EAAKI,QAAQ,qBAINC,SAASC,UAAUC,MAAML,KAAK/C,EAAIV,KAAMU,EAAK6C,IAGtD,IAAIQ,EAAiB,SAAUC,EAAMC,GACnCjE,EAAK,iBAAmBgE,EAAO,aAAcC,IAG3CC,EAAU,SAAUC,EAAKC,GAC3B,OAAOC,OAAOR,UAAUS,eAAeb,KAAKU,EAAKC,IAG/CG,EAAW,SAAUC,GACvB,MAAwB,iBAAVA,GAGZC,EAAc,SAAUC,GAC1B,OAAOA,EAAKC,QAAQ,sBAAuB,SAGzCC,EAAO,SAAUxB,EAAeyB,GAClC,OAAOzB,GAAiBA,EAAc0B,aAAa,QAAUD,IAG3DE,EAA+B,SAAUC,GAC3C,OAAOC,MAAMC,QAAQF,GACjBA,EACAT,EAASS,IAAQA,EAAIG,OACnBH,EAAII,MAAM,OACV,IAGJC,EAAW,SAAUC,GACvB,OAAOA,GAAUA,EAAOC,cAAgBlB,QAGtCmB,EAAS,WAGX,IAFA,IAAIC,EAAK,GACLC,EAAMhC,UACDiC,EAAQ,EAAGA,EAAQD,EAAIP,OAAQQ,IAAS,CAC/C,IAAIC,EAAaF,EAAIC,GACrB,GAAIN,EAASO,GACX,IAAK,IAAIC,KAAWD,EACd1B,EAAQ0B,EAAYC,KACtBJ,EAAGI,GAAWD,EAAWC,IAKjC,OAAOJ,GAGLK,EAAWlG,EAAOmG,YAClBC,EAAcF,GAAYzB,OAAO4B,KAAKpG,GAAkBsF,OAG5DtF,EAAmB2F,EAAO3F,EAAkBiG,GAExCE,GAAahG,EAAK,WAAYH,GAGlC,IAAIqG,GAAgBnB,EAClBlF,EAAiBqG,eAAiBtB,EAAKxB,EAAe,mBAGpD+C,GAAwB,SAAUC,GAEpC,OAGgB,IAFdF,GAAcG,OAAO,SAAU3B,GAC7B,OAAO,IAAI4B,OAAO,IAAMF,GAAoBlD,KAAKwB,KAChDS,QAIHoB,GAAMC,KAAKD,IAEXE,GAAO,WACT,IAAIC,EAAe9G,EAAO+G,QAAU/G,EAAOgH,SACvCC,EAAY,CAAC,MAAQ,KAAO,KAAO,KAAO,KAC1CC,EAAY,SAEhB,IACE,OAAOD,EAAUlC,QAAQmC,EAAW,SAAUC,GAC5C,OACEA,EACCL,EAAaM,gBAAgB,IAAIC,WAAW,IAAI,GAC9C,IAAOF,EAAI,GACdG,SAAS,MAEb,MAAOjD,GACP,OAAO4C,EAAUlC,QAAQmC,EAAW,SAAUC,GAC5C,IAAII,EAAqB,GAAhBC,KAAKC,SAAiB,EAE/B,OADMN,EAAI,EAAII,EAAS,EAAJA,EAAW,GACrBD,SAAS,QAKpBI,GAAa,SAAUC,GACzB,MAAsB,mBAARA,GAIZC,GAAgB,YAChBC,GACF5H,EAAiB2H,KACjB5C,EAAKxB,EAAeoE,KAuxBxB,KApxBME,GAAiB,SAAUC,EAAUC,GACvC,IAAIC,EAAiBjI,EAAO6H,GAAY,aACpCpC,EAASwC,KAAiBF,EAAWnC,EAAOmC,EAAUE,IAC1D,IAAIC,EAA4BlI,EAAOmI,IACvC,IAAKT,GAAWQ,GAKd,OAJIC,IACF/H,EACE+H,GAAoB,0BAA4BA,IAE7CJ,EAET,IACE,OAAOnC,EACLmC,EACAG,EAA0BrE,KAAK7D,EAAQ4F,EAAOmC,EAAUC,KAE1D,MAAO3D,GACPF,EAAe,WAAYE,KAU3B+D,GACFnI,EAAiBmI,WACjBpD,EAAKxB,EAAe,eAAiB/C,EAEnC4H,GAAiB,SAAUC,EAAcC,GAC3C,OACGA,GAAmBpH,EAAIqH,QACrB5E,MAAM,GACN4B,MAAM,KACNiB,OAAO,SAAUgC,GAChB,IAAIC,EAASJ,IAAiB/B,GAAsB,MAEhDoC,EAAkBC,GAAYC,IAAIhE,GAAaiE,KAAK,KACpDC,EAAQL,EACR,KAAOC,EAAkB,KACzB,YACCP,GAAY,GAAK,KAClB,yCACCA,GAAY,GAAK,QAClB,IACAO,EACA,KACJ,OAAID,IAAWE,GAAYrD,OAAe/E,EAInC,IAAIkG,OAAOqC,GAAOzF,KAAKmF,KAE/BK,KAAK,MAAQzI,GAgChB2I,GAAiBnB,GAAY,UACjC,GAAI7H,EAAOgJ,KAAmBzI,EAAS,OAAOH,EAAKsB,EAAa,SAChE1B,EAAOiJ,gBAAkB1I,EACzBP,EAAOgJ,IAAkBzI,EAOzB,IAAI2I,GAAW,SAAUlB,EAAMmB,EAAUC,GACvCpB,EAAOoB,EAAepB,EAAOpC,EAAOyD,GAASC,GAAMtB,GAE/C/G,EAAIsI,QAAUH,IAAcpB,EAAKuB,MAAQhJ,GACzCU,EAAIuI,qBAAuBJ,IAAcpB,EAAKyB,KAAOlJ,GAGzD,IAAImJ,EAAQ,IAAIC,MACZR,IACFO,EAAME,QAAUT,EAChBO,EAAMG,OAASV,GAEjBO,EAAMI,IACJzH,EACA,eACAoC,OAAO4B,KAAK2B,GACTvB,OAAO,SAAUsD,GAChB,OAAO/B,EAAK+B,IAAQ1J,IAErBwI,IAAI,SAAUkB,GACb,OACElI,EAAuBkI,GACvB,IACAlI,EAAuBmG,EAAK+B,MAG/BjB,KAAK,KACR,SACAlC,KAAKD,OAILqD,GACF/J,EAAiBgK,UAAYjF,EAAKxB,EAAe,YAC/C0G,GAAkBF,IAAuB3I,EAEzC8I,GAAc,CAChBC,QA6oBJ,gBA5oBIH,SAAUC,IASZ/J,EAAY,SAAUkK,GACpBA,EAAiBA,EAAeC,MAC5BD,EAAiB,IAAMA,EAAeC,MACtCD,EACJjK,EAAKiK,GACLnB,GACEtD,EAAOuE,GAAa,CAClBI,KAAM1J,EACNwD,MAAOgG,EACPG,KAAMrJ,EAAIsJ,WAEZpK,EACAE,IAMJ4B,EACEtB,EACA,SAAU6J,GACJA,EAAMC,WAA+C,EAAnCD,EAAMC,SAASC,QAAQ1K,IAC3CC,EAAUuK,EAAMG,UAGpBrK,GAOF,IAwDIsK,GAxDAC,GAAQpE,KAERqE,GAAW,EAOXC,GAAOhL,EAAiBgL,MAAQjG,EAAKxB,EAAe,QAGpD0H,MAvKsBC,GAuKClL,EAAiBiL,cAtKvBC,GAuKjBlL,EAAiBiL,WACjBlG,EAAKxB,EAAe,eAAiB/C,GACrCuE,EAAKxB,EAAe,aAAe/C,GACnCuE,EAAKxB,EAAe,gBAAkB/C,EAGtC2K,KACqC,SAAvCpG,EAAKxB,EAAe,iBACpBvD,EAAiBmL,cAAgB5K,GAI/B6K,GACFpL,EAAiBqL,UACjBtG,EAAKxB,EAAe,cACpBqE,GAAY,IAAMjH,EAGhB2K,GAAcpG,EAChBlF,EAAiBsL,aAAevG,EAAKxB,EAAe,iBAIlDoF,GAAczD,EAChBlF,EAAiB2I,aAAe5D,EAAKxB,EAAe,iBAIlDgI,GAAqBrG,EACvBlF,EAAiBuL,oBACfxG,EAAKxB,EAAe,yBAIpBiI,GACFxL,EAAiBwL,gBAAkBzG,EAAKxB,EAAe,mBAGrD2E,GACFlI,EAAiBkI,mBACjBnD,EAAKxB,EAAe,sBAItB,IAEEsH,GAAWvE,GAAsB,KAC7BmF,KAAKC,iBAAiBC,kBAAkBC,SACxCxL,EACJ,MAAOgE,IACPjE,EAAKiE,IAOP,IAAIyH,GAAU9L,EAAO8L,QACjBC,GACF9K,EAAI+K,WACJhM,EAAOiM,aACPjM,EAAOkM,aACPlM,EAAOmM,UACNL,KAAYA,GAAQM,QACrBpM,EAAOqM,YACPrM,EAAOsM,MACPjJ,GACAmE,KAAKC,UAAYD,KAAKC,SAGpB8E,GACFhG,GAAsB,MAAQA,GAAsB,QAElDwF,KAAK5B,GAAY4B,IAAMxL,GAE3B,IAAI8I,GAAUzD,EAAOuE,GAAa,CAEhCqC,GAAIjG,GAAsB,MAAQ9E,EAAYpB,EAE9CK,MAAOS,EAAImB,UAAY5B,EACvBoK,SAAUA,GACV2B,QAASF,GAAqB1F,KAASxG,EAGvCqM,WAAYnG,GAAsB,MAAQM,KAASxG,IA0BrD,GAvBAgJ,GAAQsD,IAAMnM,EAIVmC,IACF0G,GAAQuD,OAASjK,EAAOiK,OACxBvD,GAAQwD,OAAS5K,EAAUU,EAAOkK,SAS/BtL,EAAIuL,SAAS1M,EAAK,4CAInB8J,KAAoB7I,IACtBgI,GAAQ0D,kBAAoB1L,IAGzB6J,IAAclK,KAAcC,GAA0B,KAAnBA,EAAID,GAC1C,OAAOZ,EACLuB,EAAiBX,EAAa,oBAAsBmC,EAAU,SAK7B,GAAlC9B,EAAiBuJ,QAAQ,OACxB,aAAatH,KAAKjC,IACnB2I,IAED5J,EACE,mBACEiB,EACA,SACA8B,EACA,0BAON,IACI6J,GA0DAC,GA3DA3D,GAAO,GAGP4D,GAAc,WAKhB,OAFEjN,EAAiBkN,UAAYnI,EAAKxB,EAAe,aAGzBjC,EAAI4L,UAAY,IACrCpI,QAAQ1D,EAAkB6I,IAC1BnF,QAAQ,sDAAuD,MAC/DA,QAAQ,YAAa,OAAS1E,GAKjC8M,GAAWD,KAOXE,GAAW,EAEXC,GAAc,SAAUC,EAAIC,GAC9B,GAAKhB,GAAL,CAEA,IAAIiB,EAAS5H,EAAOuE,GAAa,CAC/BI,KAAM,SACNkD,YAAaF,EAAOD,EAAKjE,GAAQoD,UAenC,GAXIlG,GAAsB,OACxBiH,EAAOE,SAAWlG,KAAKmG,OAAOhH,KAAQoE,GAAQqC,IA3fnC,MA6fbA,GAAW,EACXrC,GAAQpE,KAGJJ,GAAsB,UACxBiH,EAAOxC,SAAWxD,KAAKoG,IAAI,EAAG5C,GAAU6C,OAGtCN,IAAStM,EAAI6M,WAEf5E,GAASsE,EAAQnN,EAAcE,QAE/B,IACEU,EAAI6M,WAAWC,KAAK9M,EAApBA,CAAyBoB,EAAa,UAAWJ,EAAUuL,IAC3D,MAAOQ,GAEP9E,GAASsE,EAAQnN,EAAcE,MAMrC4B,EACE,mBACA,WACMZ,EAAI0M,QACA,KAAOjL,KAAYhD,GAASqN,KAClCJ,GAActG,MACTyG,IAAYzG,KAAQsG,IAE7BzM,GAGF2B,EAAqBa,EAAUqK,GAAa7M,GAE5C,IAAI0N,GAAO3M,EAAI2M,MAAQ,GACnBL,GAAW,WACb,IACE,IAAIM,EAAuB5L,EAAgBQ,IAAiB,EACxDqL,EAAS5G,KAAKoG,IAChBM,GAAKrL,IAAiB,EACtBqL,GAAKpL,IAAiB,EACtBP,EAAgBQ,IAAiB,EACjCR,EAAgBM,IAAiB,EACjCN,EAAgBO,IAAiB,GAEnC,OAAO0E,KAAK6G,IACV,IAKI,EAJJ7G,KAAKmG,MACF,MAAQpL,EAAgB+L,WAAa,GAAKH,GACzCC,EACA,IAGN,MAAO/J,IAEP,OADAjE,EAAKiE,IACE,IAIXlC,EAAqB,OAAQ,WAC3B6I,GAAW6C,KACX1L,EACEO,EACA,WACMsI,GAAW6C,OAAY7C,GAAW6C,OAExCrN,KAQJ,IAgCI+N,GAkCAC,GAAUC,GAlEVC,GAAU,SAAUC,GACtB,IAAInE,EAAO,GAIX,IACEA,EAAOmE,GAAa5M,EAAuBZ,EAAIsJ,UAC/C,MAAOpG,IACPjE,EAAKiE,IAGP,IAAIuK,EAAyB5O,EAAOyL,IACpC,GAAI/D,GAAWkH,GACb,IACEpE,EAAOoE,EAAuB/K,KAAK7D,EAAQ,CAAEwK,KAAMA,KAAWA,EAC9D,MAAOnG,IACPF,EAAe,OAAQE,IAK3B,IA5YiB,SAAUmG,GAC3B,IAAK,IAAIqE,KAAKtD,GAAa,CACzB,IAAIuD,EAAgBvD,GAAYsD,GAChC,GAAKC,EAAL,CAGA,IAAIC,EAtOI,KAuOND,EAAc,GAAcA,EAvOtB,IAuO8CA,EAEtD,GACEC,IAAevE,GACf,IAAI9D,OACF,IAAM7B,EAAYkK,GAAYhK,QAAQ,SAAU,QAAU,IAC1D,KACAzB,KAAKkH,GAEP,OAAOjK,GAEX,OAAOC,EA0XHwO,CAAaxE,GAQjB,MAFY,QAARS,IAAkB9J,EAAI8N,OAAMzE,GAAQrJ,EAAI8N,KAAKzJ,MAAM,KAAK,IAErDgF,EAPLpK,EAAKuB,EAAiB,YAAc6I,IA8CpC0E,GAAW,SACbC,EACAC,EACArH,EACAsH,IAEKA,GAAe3H,GAAWK,KAAWsH,EAActH,GACxD,IACIuH,EAGEC,EAJFpG,EAAWzB,GAAW2H,GAAeA,EAAc,aAEnD1K,EAASyK,KAAgD,EAA9BA,EAAcxE,QAAQ,OAGnDwE,GADIG,EAAQH,EAAc5J,MAAM,MACVgK,QACtBF,EAAc,IAAMC,EAAMzG,KAAK,MAGjC,IAAI0B,EAAOkE,GAAQU,GAGnB,GAAK5E,GAAQwC,IAAgBxC,EAA7B,CAEAwC,GAAexC,EACflB,GAAKkB,KAAOA,EAGRjE,GAAsB,OACxB+C,GAAKmG,eACHjI,KAAKoG,IAAIrL,EAA2B,aAAK,EAAGvC,EAAO0P,YAAc,IACjE,KACFpG,GAAKqG,gBACHnI,KAAKoG,IACHrL,EAAgBQ,IAAiB,EACjC/C,EAAO4P,aAAe,IACnB,MAILrJ,GAAsB,MACpBtF,EAAIuB,KAAW8G,GAAK9G,GAAYvB,EAAIuB,IAItCe,GAAUgD,GAAsB,QAClC+C,GAAKuG,aAAetM,EAAOuM,MAC3BxG,GAAKyG,cAAgBxM,EAAO6K,QAI9B,IAII4B,EAJAC,EAAOjQ,EAAOkQ,YACdC,EAAiB,aAIrB,IACEH,EAAsBC,EAAKG,iBAAiBD,GAAgB,GAAG5F,KAC/D,MAAOlG,IACPjE,EAAKiE,IAGPoK,GAAgBuB,GAC+C,EAA3D,CAAC,SAAU,gBAAgBpF,QAAQoF,GAGnCC,GACAA,EAAKE,KACwC,EAA7C,CAAC,EAAG,GAAGvF,QAAQqF,EAAKE,GAAgB5F,MAGxC,IAAI8F,EAA0BlD,GAC1BA,GAAS3H,MAhuBH,KAguBgB,GACtBnF,EACJmO,GAAWrB,IACgD,EAAvD3B,GAAmBZ,QAAQyF,IAC3BA,GAA2BhP,EAC3Bb,EAGJ8I,GAAKgH,OACH,QAAQhN,KAAK4J,OAAkBiC,GAAeV,GAC1CjO,GACCgO,GAEPzG,EAAWD,GAAeC,EAAU,CAClCwC,KAAM5J,EACN6J,KAAMlB,GAAKkB,OAGb,IAAI+F,EAAsB,WACxB3O,EAA2BrB,EAC3B,IAAIiQ,EACFrB,GAAeV,KAAkBlI,GAAsB,MA3H1C,SACjB4I,EACAsB,EACAjC,EACAkC,EACA3I,EACAoB,GAEIgG,GAAa9B,GAAY,GAAKhE,GAAQoD,QAASlM,GAC/CgM,KAAoBlD,GAAQoD,QAAU5F,MAE1C,IAAI8J,EAAczG,GAAkBwE,KAEpCxF,GACE,CACEoE,GAAIjE,GAAQoD,QACZlC,KAAM5J,EACNwM,UAAWsD,GAAoBjC,EAAWrB,GAAW,KACrDuD,MAAOA,GAASrI,GAAeoI,GAE/B1I,SAAU9F,EAAU8F,IAEtBoB,GAGFoF,GAAmBpB,GACnBA,GAAWwD,EAEXvN,IAgGEwN,CACEzB,EACAqB,EACAhC,GACAc,EAAcjH,GAAemI,EAAQlB,GAAejP,EACpD0H,EACAoB,IAIJ,GAAKvH,EAmBH2O,SAjBA,IACM5N,GAAU+E,GAAW/E,EAAOkO,sBAC9BlO,EACGkO,qBAAqB,CAAC5N,EAAcC,IACpC4N,KAAK,SAAUC,GACd1H,GAAQ2H,QAAUD,EAAkB9N,GACpCoG,GAAQ4H,WAAaF,EAAkB7N,GACvCqN,MAEDW,SAAMX,GAETA,IAEF,MAAOvC,GACPuC,OAWFY,GAAMnR,EAAOoR,QACbC,GAAeF,GAAMA,GAAIG,UAAYjR,EACrCkR,GAAMvR,EAAOwR,cACbC,GAAgB,YAIhBrG,IAAeiG,IAAgBK,OAASH,KAqB1CJ,GAAIG,WAnBEK,GAAOR,GADiB5G,GAoBAkH,IAlBrB,WACL,IAEI/G,EAFA5E,EAAMhC,UACN8N,EAAKD,GAAKzN,MAAM2N,KAAM/L,GAY1B,OAVI4B,GAAWgK,OACbhH,EAAQ,IAAIgH,MAAMnH,KAIlBG,EAAQnJ,EAAIuQ,YAAY,UAClBC,UAAUxH,GAAMhK,EAASA,GAEjCmK,EAAM5G,UAAYgC,EAClByL,GAAI7G,GACGkH,IAMXzP,EACEsP,GACA,WACEvC,GAAS,IAEX1O,GAGF2B,EACE,WACA,WACE+M,GAAS,IAEX1O,IAKA4K,IAAuB,QAARH,IAAkB,iBAAkBjL,GACrDmC,EACE,aACA,WACE+M,GAAS,IAEX1O,GAIA4K,IAAa8D,KAEjBlP,EAAOgS,YAAc,SAAUxH,EAAMzC,EAAUoB,GAC7C+F,GAAS,EAAG1E,EAAMzC,EAAUoB,IAQ9B,IAAI8I,GAAa,CAAC,SAAU,UAExBC,GAAY,SAAUxH,EAAO3C,EAAUsH,IACpCA,GAAe3H,GAAWK,KAAWsH,EAActH,GAExD,IAAIoK,EAAkBzK,GAAWgD,GAC7BvB,EAAWzB,GAAW2H,GAAeA,EAAc,aACnD+C,SAAmB1H,EAEvB,GAAIuH,GAAWrH,QAAQwH,GAAa,IAAMD,EAExC,OADAhO,EAAekH,GAAmBzK,EAAY,aAAewR,GACtDjJ,IAGT,IACE,GAAIgJ,EAAiB,CACnB,IAAIE,EAAc3H,IAClB,GAAIuH,GAAWrH,eAAeyH,GAAe,EAK3C,OAJAlO,EACEkH,GACAX,EAAQ,uBAAyB2H,GAE5BlJ,IAETuB,EAAQ2H,GAEV,MAAOhO,IAEP,OADAF,EAAekH,GAAmBhH,IAC3B8E,IAGTuB,GAAS,GAAKA,GAAO3F,QAAQ,eAAgB,KAAKA,QAAQ,WAAY,IAEtE,IAAIuN,EAAc,CAAE/H,KAAM3J,EAAW8J,MAAOA,GACxC6H,GAAa9D,IAAiBrL,EAAQ,EAE1C2E,EAAWD,GAAeC,EAAUuK,GAEhC5H,GACFxB,GACEtD,EAAO0M,EAAa,CAClBhF,GAAIzG,KACJ6J,MAAOrI,IAAgBkK,GACvBpF,UACGoF,GAAa/D,KAAajI,GAAsB,KAC7CgI,GACA,KAENxG,SAAU9F,EAAU8F,KAEtBoB,IAKFqJ,GAAmB,SAAU9H,EAAO3C,EAAUoB,GAChD+I,GAAUxH,EAAO3C,EAAUoB,IAIxBnJ,EAAOqL,MACVrL,EAAOqL,IAAqBmH,IAE9B,IAAIC,GAAYzS,EAAOqL,IAGnBqH,GAAQD,IAAaA,GAAUE,EAAIF,GAAUE,EAAI,GAMrD,IAAK,IAAIjI,MAHT1K,EAAOqL,IAAqBmH,GAGVE,GACZpO,EAAQoO,GAAOhI,MACjBrF,MAAMC,QAAQoN,GAAMhI,KAChBwH,GAAUhO,MAAM,KAAMwO,GAAMhI,KAC5BwH,GAAUQ,GAAMhI,MAGxB,MAAOsD,IACP7N,EAAU6N,IA7IY,IAAUzD,GACxBoH,GA3mBkBxG,GAnN9B,CA68BEnL,OACA,uBACA"} \ No newline at end of file diff --git a/dist/latest/light.js b/dist/latest/light.js index 4b71c465..dda15604 100644 --- a/dist/latest/light.js +++ b/dist/latest/light.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2025-06-13; bc2f; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2025-06-24; bc2f; v12) */ !function(l,e,t,f){try{var m=undefined,n="https:",r=l.console,a="doNotTrack",g=l.navigator,i=l.location,h=i.host,o=l.document,c=g.userAgent,s="Not sending request ",v=!1,u=encodeURIComponent,p=decodeURIComponent,d=JSON.stringify,y=l.addEventListener,_="https://queue."+t,b=(o.documentElement,"language"),w=g.userAgentData,O="platform",S="platformVersion",j="https://docs.simpleanalytics.com",k=/(bot|spider|crawl)/i.test(c)&&!/(cubot)/i.test(c),E=o.currentScript||o.querySelector('script[src*="'+t+'"]');f=function(){var e=[].slice.call(arguments);return e.unshift("Simple Analytics:"),Function.prototype.apply.call(r.warn,r,e)};var q=function(e){return"string"==typeof e},x=function(e,t){return e&&e.getAttribute("data-"+t)},A=function(){for(var e,t,n,r={},a=arguments,i=0;i>e/4).toString(16)})}catch(r){return e.replace(n,function(e){var t=16*Math.random()|0;return(e<2?t:3&t|8).toString(16)})}},N=function(e){return"function"==typeof e},R="namespace",U=e[R]||x(E,R)||"sa",V=e.strictUtm||"true"==x(E,"strict-utm"),B=function(t,e){return(e||i.search).slice(1).split("&").filter(function(e){return!t&&new RegExp("^((utm_)"+(V?"":"?")+"(source|medium|content|term|campaign)"+(V?"":"|ref")+")=").test(e)}).join("&")||m},C=U+"_loaded";if(1==l[C])return f(s+"twice");l.sa_event_loaded=!0,l[C]=!0;var T,F=function(t,e,n){t=n?t:A(L,P,t),g.brave&&!n&&(t.brave=!0),g._duckduckgoloader_&&!n&&(t.duck=!0),(new Image).src=_+"/simple.gif?"+Object.keys(t).filter(function(e){return t[e]!=m}).map(function(e){return u(e)+"="+u(t[e])}).join("&")+"&time="+Date.now()},H=e.hostname||x(E,"hostname"),z=H||h,J={version:"cdn_light_12",hostname:z};e.mode||x(E,"mode");try{T=Intl.DateTimeFormat().resolvedOptions().timeZone}catch(X){f(X)}k&&(J.bot=!0);var L=A(J,{ua:c,https:i.protocol==n,timezone:T,page_id:I(),session_id:I()});if(L.sri=!1,w&&(L.mobile=w.mobile,L.brands=d(w.brands)),z!==h&&(L.hostname_original=h),a in g&&"1"==g[a])return f("Not sending request when "+a+" is enabled. See "+j+"/dnt");-1!=h.indexOf(".")&&!/^[0-9.:]+$/.test(h)||H||f("Set hostname on "+h+". See "+j+"/overwrite-domain-name");var M,P={},Z=(e.referrer||x(E,"referrer")||o.referrer||"").replace(h,z).replace(/^https?:\/\/((m|l|w{2,3}([0-9]+)?)\.)?([^?#]+)(.*)$/,"$4").replace(/^([^/]+)$/,"$1")||m,G=function(e,t){var n=A(J,{type:"append",original_id:t?e:L.page_id});if(t||!g.sendBeacon)F(n,0,!0);else try{g.sendBeacon.bind(g)(_+"/append",d(n))}catch(r){F(n,0,!0)}};y("pagehide",G,!1);var K,Q,W=function(e){var t="";try{t=e||p(i.pathname)}catch(X){f(X)}return t};!function(t,e,n,r){!r&&N(n)&&(r=n);var a,i;N(r);q(e)&&-1>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},at=function(t){return"function"==typeof t},it="namespace",ot=t[it]||L(z,it)||"sa",ct=function(t,e){var n=d[ot+"_metadata"];Z(n)&&(t=K(t,n));var r=d[Mt];if(!at(r))return t;try{return K(t,r.call(d,K(t,e)))}catch(a){F("metadata",a)}},st=t.strictUtm||L(z,"strict-utm")==r,ut=function(a,t){return(t||s.search).slice(1).split("&").filter(function(t){var e=a||!et("ut"),n=Et.map(J).join("|"),r=e?"^("+n+")=":"^((utm_)"+(st?"":"?")+"(source|medium|content|term|campaign)"+(st?"":"|ref")+"|"+n+")=";return e&&!Et.length?y:new RegExp(r).test(t)}).join("&")||v},lt=ot+"_loaded";if(d[lt]==g)return m(f+"twice");d.sa_event_loaded=g,d[lt]=g;var pt=function(e,t,n){e=n?e:K($t,Ct,e),w.brave&&!n&&(e.brave=g),w._duckduckgoloader_&&!n&&(e.duck=g);var r=new Image;t&&(r.onerror=t,r.onload=t),r.src=k+"/simple.gif?"+Object.keys(e).filter(function(t){return e[t]!=v}).map(function(t){return E(t)+"="+E(e[t])}).join("&")+"&time="+Date.now()},ft=t.hostname||L(z,"hostname"),ht=ft||b,dt={version:"cdn_latest_12",hostname:ht};n=function(t){t=t.stack?t+" "+t.stack:t,m(t),pt(K(dt,{type:i,error:t,path:s.pathname}),v,g)},M(i,function(t){t.filename&&-1>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},at=function(t){return"function"==typeof t},it="namespace",ot=t[it]||L(z,it)||"sa",ct=function(t,e){var n=d[ot+"_metadata"];Z(n)&&(t=K(t,n));var r=d[Mt];if(!at(r))return Mt&&m(Mt+" not found, set window."+Mt),t;try{return K(t,r.call(d,K(t,e)))}catch(a){F("metadata",a)}},st=t.strictUtm||L(z,"strict-utm")==r,ut=function(a,t){return(t||s.search).slice(1).split("&").filter(function(t){var e=a||!et("ut"),n=Et.map(J).join("|"),r=e?"^("+n+")=":"^((utm_)"+(st?"":"?")+"(source|medium|content|term|campaign)"+(st?"":"|ref")+"|"+n+")=";return e&&!Et.length?y:new RegExp(r).test(t)}).join("&")||v},lt=ot+"_loaded";if(d[lt]==g)return m(f+"twice");d.sa_event_loaded=g,d[lt]=g;var pt=function(e,t,n){e=n?e:K($t,Ct,e),w.brave&&!n&&(e.brave=g),w._duckduckgoloader_&&!n&&(e.duck=g);var r=new Image;t&&(r.onerror=t,r.onload=t),r.src=k+"/simple.gif?"+Object.keys(e).filter(function(t){return e[t]!=v}).map(function(t){return E(t)+"="+E(e[t])}).join("&")+"&time="+Date.now()},ft=t.hostname||L(z,"hostname"),ht=ft||b,dt={version:"cdn_latest_12",hostname:ht};n=function(t){t=t.stack?t+" "+t.stack:t,m(t),pt(K(dt,{type:i,error:t,path:s.pathname}),v,g)},M(i,function(t){t.filename&&-1> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) return metadata;\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n return (\n (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex).test(keyValue);\n })\n .join(\"&\") || undefinedVar\n );\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = trueVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n query,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query || getQueryParams(deleteSourceInfo),\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch ? getQueryParams(delSrc, querySearch) : undefinedVar,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"simpleanalyticscdn.com\",\n \"queue.\",\n \"cdn_latest_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","protocol","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","search","keyValue","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","indexOf","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","i","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","query","currentPage","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue","q"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"app.js","sources":["app.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n return (\n (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex).test(keyValue);\n })\n .join(\"&\") || undefinedVar\n );\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = trueVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n query,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query || getQueryParams(deleteSourceInfo),\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch ? getQueryParams(delSrc, querySearch) : undefinedVar,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"simpleanalyticscdn.com\",\n \"queue.\",\n \"cdn_latest_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","protocol","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","search","keyValue","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","indexOf","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","i","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","query","currentPage","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue","q"],"mappings":"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"} \ No newline at end of file diff --git a/dist/v12/auto-events.js b/dist/v12/auto-events.js index 6ad6c9b7..410b2bc3 100644 --- a/dist/v12/auto-events.js +++ b/dist/v12/auto-events.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2025-06-13; 7048; SRI-version; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2025-06-24; 7048; SRI-version; v12) */ function r(t,e){var a,n;t.hasAttribute("data-simple-event")||(a=!1,h.downloads&&/^https?:\/\//i.test(t.href)&&new RegExp("\\.("+(h.downloadsExtensions||[]).join("|")+")$","i").test(t.pathname)?a="download":h.outbound&&/^https?:\/\//i.test(t.href)&&t.hostname!==m.location.hostname?a="outbound":h.emails&&/^mailto:/i.test(t.href)&&(a="email"),a&&(e?(n="saAutomatedLink(this, '"+a+"');",t.hasAttribute("target")&&"_self"!==t.getAttribute("target")||(n+=" return false;"),t.setAttribute("onclick",n)):t.addEventListener("click",function(){g(t,a)})))}function e(){try{for(var t=document.getElementsByTagName("a"),e=0;e>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},at=function(t){return"function"==typeof t},it="namespace",ot=t[it]||L(z,it)||"sa",ct=function(t,e){var n=d[ot+"_metadata"];Z(n)&&(t=K(t,n));var r=d[Mt];if(!at(r))return t;try{return K(t,r.call(d,K(t,e)))}catch(a){F("metadata",a)}},st=t.strictUtm||L(z,"strict-utm")==r,ut=function(a,t){return(t||s.search).slice(1).split("&").filter(function(t){var e=a||!et("ut"),n=Et.map(J).join("|"),r=e?"^("+n+")=":"^((utm_)"+(st?"":"?")+"(source|medium|content|term|campaign)"+(st?"":"|ref")+"|"+n+")=";return e&&!Et.length?y:new RegExp(r).test(t)}).join("&")||g},lt=ot+"_loaded";if(d[lt]==v)return m(f+"twice");d.sa_event_loaded=v,d[lt]=v;var pt=function(e,t,n){e=n?e:K($t,Ct,e),w.brave&&!n&&(e.brave=v),w._duckduckgoloader_&&!n&&(e.duck=v);var r=new Image;t&&(r.onerror=t,r.onload=t),r.src=k+"/simple.gif?"+Object.keys(e).filter(function(t){return e[t]!=g}).map(function(t){return E(t)+"="+E(e[t])}).join("&")+"&time="+Date.now()},ft=t.hostname||L(z,"hostname"),ht=ft||b,dt={version:"custom_app_12",hostname:ht};n=function(t){t=t.stack?t+" "+t.stack:t,m(t),pt(K(dt,{type:i,error:t,path:s.pathname}),g,v)},M(i,function(t){t.filename&&-1"); +!function(d,t,e,n,m){try{var g=undefined,v=!0,y=!1,r="true",a="https:",_="pageview",u="event",i="error",o=d.console,c="doNotTrack",w=d.navigator,s=d.location,b=s.host,l=d.document,p=w.userAgent,f="Not sending request ",h=f+"when ",O=y,E=encodeURIComponent,x=decodeURIComponent,S=JSON.stringify,M=d.addEventListener,k="https://"+e,A=l.documentElement||{},q="language",$="Height",j="scroll",D=w.userAgentData,C=j+$,H="offset"+$,R="client"+$,P="pagehide",T="platform",U="platformVersion",I="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),N=d.screen,z=l.currentScript||l.querySelector('script[src*="'+e+'"]');m=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){m("Error in your "+t+" function:",e)},W=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},G=function(t){return"string"==typeof t},J=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},L=function(t,e){return t&&t.getAttribute("data-"+e)},Y=function(t){return Array.isArray(t)?t:G(t)&&t.length?t.split(/, ?/):[]},Z=function(t){return t&&t.constructor===Object},K=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},at=function(t){return"function"==typeof t},it="namespace",ot=t[it]||L(z,it)||"sa",ct=function(t,e){var n=d[ot+"_metadata"];Z(n)&&(t=K(t,n));var r=d[Mt];if(!at(r))return Mt&&m(Mt+" not found, set window."+Mt),t;try{return K(t,r.call(d,K(t,e)))}catch(a){F("metadata",a)}},st=t.strictUtm||L(z,"strict-utm")==r,ut=function(a,t){return(t||s.search).slice(1).split("&").filter(function(t){var e=a||!et("ut"),n=Et.map(J).join("|"),r=e?"^("+n+")=":"^((utm_)"+(st?"":"?")+"(source|medium|content|term|campaign)"+(st?"":"|ref")+"|"+n+")=";return e&&!Et.length?y:new RegExp(r).test(t)}).join("&")||g},lt=ot+"_loaded";if(d[lt]==v)return m(f+"twice");d.sa_event_loaded=v,d[lt]=v;var pt=function(e,t,n){e=n?e:K($t,Ct,e),w.brave&&!n&&(e.brave=v),w._duckduckgoloader_&&!n&&(e.duck=v);var r=new Image;t&&(r.onerror=t,r.onload=t),r.src=k+"/simple.gif?"+Object.keys(e).filter(function(t){return e[t]!=g}).map(function(t){return E(t)+"="+E(e[t])}).join("&")+"&time="+Date.now()},ft=t.hostname||L(z,"hostname"),ht=ft||b,dt={version:"custom_app_12",hostname:ht};n=function(t){t=t.stack?t+" "+t.stack:t,m(t),pt(K(dt,{type:i,error:t,path:s.pathname}),g,v)},M(i,function(t){t.filename&&-1"); //# sourceMappingURL=app.js.map \ No newline at end of file diff --git a/dist/v12/custom/app.js.map b/dist/v12/custom/app.js.map index 8567a1db..c66414f9 100644 --- a/dist/v12/custom/app.js.map +++ b/dist/v12/custom/app.js.map @@ -1 +1 @@ -{"version":3,"file":"app.source.js","sources":["app.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) return metadata;\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n return (\n (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex).test(keyValue);\n })\n .join(\"&\") || undefinedVar\n );\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = trueVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n query,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query || getQueryParams(deleteSourceInfo),\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch ? getQueryParams(delSrc, querySearch) : undefinedVar,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_app_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","search","keyValue","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","indexOf","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","protocol","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","i","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","query","currentPage","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue","q"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"app.source.js","sources":["app.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n return (\n (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex).test(keyValue);\n })\n .join(\"&\") || undefinedVar\n );\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = trueVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n query,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query || getQueryParams(deleteSourceInfo),\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch ? getQueryParams(delSrc, querySearch) : undefinedVar,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_app_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","search","keyValue","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","indexOf","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","protocol","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","i","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","query","currentPage","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue","q"],"mappings":"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"} \ No newline at end of file diff --git a/dist/v12/custom/auto-events.js b/dist/v12/custom/auto-events.js index 6ad6c9b7..410b2bc3 100644 --- a/dist/v12/custom/auto-events.js +++ b/dist/v12/custom/auto-events.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2025-06-13; 7048; SRI-version; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2025-06-24; 7048; SRI-version; v12) */ function r(t,e){var a,n;t.hasAttribute("data-simple-event")||(a=!1,h.downloads&&/^https?:\/\//i.test(t.href)&&new RegExp("\\.("+(h.downloadsExtensions||[]).join("|")+")$","i").test(t.pathname)?a="download":h.outbound&&/^https?:\/\//i.test(t.href)&&t.hostname!==m.location.hostname?a="outbound":h.emails&&/^mailto:/i.test(t.href)&&(a="email"),a&&(e?(n="saAutomatedLink(this, '"+a+"');",t.hasAttribute("target")&&"_self"!==t.getAttribute("target")||(n+=" return false;"),t.setAttribute("onclick",n)):t.addEventListener("click",function(){g(t,a)})))}function e(){try{for(var t=document.getElementsByTagName("a"),e=0;e>e/4).toString(16)})}catch(r){return e.replace(n,function(e){var t=16*Math.random()|0;return(e<2?t:3&t|8).toString(16)})}},N=function(e){return"function"==typeof e},R="namespace",U=e[R]||A(x,R)||"sa",V=e.strictUtm||"true"==A(x,"strict-utm"),B=function(t,e){return(e||i.search).slice(1).split("&").filter(function(e){return!t&&new RegExp("^((utm_)"+(V?"":"?")+"(source|medium|content|term|campaign)"+(V?"":"|ref")+")=").test(e)}).join("&")||m},C=U+"_loaded";if(1==l[C])return f(s+"twice");l.sa_event_loaded=!0,l[C]=!0;var H,T=function(t,e,n){t=n?t:$(L,P,t),g.brave&&!n&&(t.brave=!0),g._duckduckgoloader_&&!n&&(t.duck=!0),(new Image).src=_+"/simple.gif?"+Object.keys(t).filter(function(e){return t[e]!=m}).map(function(e){return u(e)+"="+u(t[e])}).join("&")+"&time="+Date.now()},F=e.hostname||A(x,"hostname"),z=F||h,J={version:"custom_light_12",hostname:z};e.mode||A(x,"mode");try{H=Intl.DateTimeFormat().resolvedOptions().timeZone}catch(X){f(X)}k&&(J.bot=!0);var L=$(J,{ua:c,https:i.protocol==n,timezone:H,page_id:I(),session_id:I()});if(L.sri=!0,w&&(L.mobile=w.mobile,L.brands=d(w.brands)),z!==h&&(L.hostname_original=h),a in g&&"1"==g[a])return f("Not sending request when "+a+" is enabled. See "+j+"/dnt");-1!=h.indexOf(".")&&!/^[0-9.:]+$/.test(h)||F||f("Set hostname on "+h+". See "+j+"/overwrite-domain-name");var M,P={},Z=(e.referrer||A(x,"referrer")||o.referrer||"").replace(h,z).replace(/^https?:\/\/((m|l|w{2,3}([0-9]+)?)\.)?([^?#]+)(.*)$/,"$4").replace(/^([^/]+)$/,"$1")||m,G=function(e,t){var n=$(J,{type:"append",original_id:t?e:L.page_id});if(t||!g.sendBeacon)T(n,0,!0);else try{g.sendBeacon.bind(g)(_+"/append",d(n))}catch(r){T(n,0,!0)}};y("pagehide",G,!1);var K,Q,W=function(e){var t="";try{t=e||p(i.pathname)}catch(X){f(X)}return t};!function(t,e,n,r){!r&&N(n)&&(r=n);var a,i;N(r);E(e)&&-1"); //# sourceMappingURL=light.js.map \ No newline at end of file diff --git a/dist/v12/custom/proxy.js b/dist/v12/custom/proxy.js index 37fbcb06..fefde6a6 100644 --- a/dist/v12/custom/proxy.js +++ b/dist/v12/custom/proxy.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2025-06-13; 87b1; SRI-version; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2025-06-24; 7647; SRI-version; v12) */ -!function(d,t,e,n,m){try{var g=undefined,v=!0,y=!1,r="true",a="https:",_="pageview",u="event",i="error",o=d.console,c="doNotTrack",w=d.navigator,s=d.location,b=s.host,l=d.document,p=w.userAgent,f="Not sending request ",h=f+"when ",x=y,O=encodeURIComponent,E=decodeURIComponent,S=JSON.stringify,M=d.addEventListener,k="https://"+e,A=l.documentElement||{},q="language",$="Height",j="scroll",D=w.userAgentData,C=j+$,H="offset"+$,P="client"+$,R="pagehide",T="platform",U="platformVersion",I="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),N=d.screen,z=l.currentScript||l.querySelector('script[src*="'+e+'"]');m=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){m("Error in your "+t+" function:",e)},W=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},G=function(t){return"string"==typeof t},J=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},L=function(t,e){return t&&t.getAttribute("data-"+e)},Y=function(t){return Array.isArray(t)?t:G(t)&&t.length?t.split(/, ?/):[]},Z=function(t){return t&&t.constructor===Object},K=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},at=function(t){return"function"==typeof t},it="namespace",ot=t[it]||L(z,it)||"sa",ct=function(t,e){var n=d[ot+"_metadata"];Z(n)&&(t=K(t,n));var r=d[Mt];if(!at(r))return t;try{return K(t,r.call(d,K(t,e)))}catch(a){F("metadata",a)}},st=t.strictUtm||L(z,"strict-utm")==r,ut=function(a,t){return(t||s.search).slice(1).split("&").filter(function(t){var e=a||!et("ut"),n=Ot.map(J).join("|"),r=e?"^("+n+")=":"^((utm_)"+(st?"":"?")+"(source|medium|content|term|campaign)"+(st?"":"|ref")+"|"+n+")=";return e&&!Ot.length?y:new RegExp(r).test(t)}).join("&")||g},lt=ot+"_loaded";if(d[lt]==v)return m(f+"twice");d.sa_event_loaded=v,d[lt]=v;var pt=function(e,t,n){e=n?e:K($t,Ct,e),w.brave&&!n&&(e.brave=v),w._duckduckgoloader_&&!n&&(e.duck=v);var r=new Image;t&&(r.onerror=t,r.onload=t),r.src=k+"/simple.gif?"+Object.keys(e).filter(function(t){return e[t]!=g}).map(function(t){return O(t)+"="+O(e[t])}).join("&")+"&time="+Date.now()},ft=t.hostname||L(z,"hostname"),ht=ft||b,dt={version:"custom_proxy_12",hostname:ht};n=function(t){t=t.stack?t+" "+t.stack:t,m(t),pt(K(dt,{type:i,error:t,path:s.pathname}),g,v)},M(i,function(t){t.filename&&-1"); +!function(d,t,e,n,m){try{var g=undefined,v=!0,y=!1,r="true",a="https:",_="pageview",u="event",i="error",o=d.console,c="doNotTrack",w=d.navigator,s=d.location,b=s.host,l=d.document,p=w.userAgent,f="Not sending request ",h=f+"when ",x=y,O=encodeURIComponent,E=decodeURIComponent,S=JSON.stringify,M=d.addEventListener,k="https://"+e,A=l.documentElement||{},q="language",$="Height",j="scroll",D=w.userAgentData,C=j+$,H="offset"+$,P="client"+$,R="pagehide",T="platform",U="platformVersion",I="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),N=d.screen,z=l.currentScript||l.querySelector('script[src*="'+e+'"]');m=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){m("Error in your "+t+" function:",e)},W=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},G=function(t){return"string"==typeof t},J=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},L=function(t,e){return t&&t.getAttribute("data-"+e)},Y=function(t){return Array.isArray(t)?t:G(t)&&t.length?t.split(/, ?/):[]},Z=function(t){return t&&t.constructor===Object},K=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},at=function(t){return"function"==typeof t},it="namespace",ot=t[it]||L(z,it)||"sa",ct=function(t,e){var n=d[ot+"_metadata"];Z(n)&&(t=K(t,n));var r=d[Mt];if(!at(r))return Mt&&m(Mt+" not found, set window."+Mt),t;try{return K(t,r.call(d,K(t,e)))}catch(a){F("metadata",a)}},st=t.strictUtm||L(z,"strict-utm")==r,ut=function(a,t){return(t||s.search).slice(1).split("&").filter(function(t){var e=a||!et("ut"),n=Ot.map(J).join("|"),r=e?"^("+n+")=":"^((utm_)"+(st?"":"?")+"(source|medium|content|term|campaign)"+(st?"":"|ref")+"|"+n+")=";return e&&!Ot.length?y:new RegExp(r).test(t)}).join("&")||g},lt=ot+"_loaded";if(d[lt]==v)return m(f+"twice");d.sa_event_loaded=v,d[lt]=v;var pt=function(e,t,n){e=n?e:K($t,Ct,e),w.brave&&!n&&(e.brave=v),w._duckduckgoloader_&&!n&&(e.duck=v);var r=new Image;t&&(r.onerror=t,r.onload=t),r.src=k+"/simple.gif?"+Object.keys(e).filter(function(t){return e[t]!=g}).map(function(t){return O(t)+"="+O(e[t])}).join("&")+"&time="+Date.now()},ft=t.hostname||L(z,"hostname"),ht=ft||b,dt={version:"custom_proxy_12",hostname:ht};n=function(t){t=t.stack?t+" "+t.stack:t,m(t),pt(K(dt,{type:i,error:t,path:s.pathname}),g,v)},M(i,function(t){t.filename&&-1"); //# sourceMappingURL=proxy.js.map \ No newline at end of file diff --git a/dist/v12/custom/proxy.js.map b/dist/v12/custom/proxy.js.map index da4422bb..e7e6496d 100644 --- a/dist/v12/custom/proxy.js.map +++ b/dist/v12/custom/proxy.js.map @@ -1 +1 @@ -{"version":3,"file":"proxy.source.js","sources":["proxy.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) return metadata;\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n return (\n (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex).test(keyValue);\n })\n .join(\"&\") || undefinedVar\n );\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = trueVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n query,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query || getQueryParams(deleteSourceInfo),\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch ? getQueryParams(delSrc, querySearch) : undefinedVar,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_proxy_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","search","keyValue","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","indexOf","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","protocol","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","i","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","query","currentPage","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue","q"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"proxy.source.js","sources":["proxy.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n return (\n (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex).test(keyValue);\n })\n .join(\"&\") || undefinedVar\n );\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = trueVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n query,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query || getQueryParams(deleteSourceInfo),\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch ? getQueryParams(delSrc, querySearch) : undefinedVar,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_proxy_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","search","keyValue","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","indexOf","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","protocol","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","i","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","query","currentPage","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue","q"],"mappings":"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"} \ No newline at end of file diff --git a/dist/v12/light.js b/dist/v12/light.js index 34e86dd8..d8233766 100644 --- a/dist/v12/light.js +++ b/dist/v12/light.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2025-06-13; 95f8; SRI-version; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2025-06-24; 95f8; SRI-version; v12) */ !function(l,e,t,f){try{var m=undefined,n="https:",r=l.console,a="doNotTrack",g=l.navigator,i=l.location,h=i.host,o=l.document,c=g.userAgent,s="Not sending request ",v=!1,u=encodeURIComponent,p=decodeURIComponent,d=JSON.stringify,y=l.addEventListener,_="https://queue."+t,b=(o.documentElement,"language"),w=g.userAgentData,O="platform",S="platformVersion",j="https://docs.simpleanalytics.com",k=/(bot|spider|crawl)/i.test(c)&&!/(cubot)/i.test(c),E=o.currentScript||o.querySelector('script[src*="'+t+'"]');f=function(){var e=[].slice.call(arguments);return e.unshift("Simple Analytics:"),Function.prototype.apply.call(r.warn,r,e)};var q=function(e){return"string"==typeof e},x=function(e,t){return e&&e.getAttribute("data-"+t)},A=function(){for(var e,t,n,r={},a=arguments,i=0;i>e/4).toString(16)})}catch(r){return e.replace(n,function(e){var t=16*Math.random()|0;return(e<2?t:3&t|8).toString(16)})}},N=function(e){return"function"==typeof e},R="namespace",U=e[R]||x(E,R)||"sa",V=e.strictUtm||"true"==x(E,"strict-utm"),B=function(t,e){return(e||i.search).slice(1).split("&").filter(function(e){return!t&&new RegExp("^((utm_)"+(V?"":"?")+"(source|medium|content|term|campaign)"+(V?"":"|ref")+")=").test(e)}).join("&")||m},C=U+"_loaded";if(1==l[C])return f(s+"twice");l.sa_event_loaded=!0,l[C]=!0;var T,F=function(t,e,n){t=n?t:A(L,P,t),g.brave&&!n&&(t.brave=!0),g._duckduckgoloader_&&!n&&(t.duck=!0),(new Image).src=_+"/simple.gif?"+Object.keys(t).filter(function(e){return t[e]!=m}).map(function(e){return u(e)+"="+u(t[e])}).join("&")+"&time="+Date.now()},H=e.hostname||x(E,"hostname"),z=H||h,J={version:"cdn_light_12",hostname:z};e.mode||x(E,"mode");try{T=Intl.DateTimeFormat().resolvedOptions().timeZone}catch(X){f(X)}k&&(J.bot=!0);var L=A(J,{ua:c,https:i.protocol==n,timezone:T,page_id:I(),session_id:I()});if(L.sri=!0,w&&(L.mobile=w.mobile,L.brands=d(w.brands)),z!==h&&(L.hostname_original=h),a in g&&"1"==g[a])return f("Not sending request when "+a+" is enabled. See "+j+"/dnt");-1!=h.indexOf(".")&&!/^[0-9.:]+$/.test(h)||H||f("Set hostname on "+h+". See "+j+"/overwrite-domain-name");var M,P={},Z=(e.referrer||x(E,"referrer")||o.referrer||"").replace(h,z).replace(/^https?:\/\/((m|l|w{2,3}([0-9]+)?)\.)?([^?#]+)(.*)$/,"$4").replace(/^([^/]+)$/,"$1")||m,G=function(e,t){var n=A(J,{type:"append",original_id:t?e:L.page_id});if(t||!g.sendBeacon)F(n,0,!0);else try{g.sendBeacon.bind(g)(_+"/append",d(n))}catch(r){F(n,0,!0)}};y("pagehide",G,!1);var K,Q,W=function(e){var t="";try{t=e||p(i.pathname)}catch(X){f(X)}return t};!function(t,e,n,r){!r&&N(n)&&(r=n);var a,i;N(r);q(e)&&-1 Date: Tue, 24 Jun 2025 19:02:28 +0200 Subject: [PATCH 43/62] Fix delayed phone link events --- src/auto-events.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/auto-events.js b/src/auto-events.js index 3a6e9370..27ab717d 100644 --- a/src/auto-events.js +++ b/src/auto-events.js @@ -142,7 +142,7 @@ log("collected " + clean); - return type === "email" + return type === "email" || type === "phone" ? callback() : window.setTimeout(callback, 5000); } else { From 9294410a19e015898ae637e4f20bf4d55280b979 Mon Sep 17 00:00:00 2001 From: Adriaan <1079135+adriaandotcom@users.noreply.github.com> Date: Tue, 29 Jul 2025 15:36:14 +0200 Subject: [PATCH 44/62] fix allowParams regex to be case insensitive --- dist/latest/latest.dev.js | 4 ++-- src/default.js | 2 +- test/unit/pageview-query.test.js | 18 ++++++++++++++++++ 3 files changed, 21 insertions(+), 3 deletions(-) diff --git a/dist/latest/latest.dev.js b/dist/latest/latest.dev.js index 17543b84..5bfaa047 100644 --- a/dist/latest/latest.dev.js +++ b/dist/latest/latest.dev.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2025-06-24; 80f5; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2025-07-29; 9107; v12) */ /* eslint-env browser */ (function ( @@ -244,7 +244,7 @@ // The prefix "utm_" is optional with "strictUtm" disabled // "ref" is only collected when "strictUtm" is disabled - return new RegExp(regex).test(keyValue); + return new RegExp(regex, "i").test(keyValue); }) .join("&") || undefinedVar ); diff --git a/src/default.js b/src/default.js index 2b4e925e..4837fba8 100644 --- a/src/default.js +++ b/src/default.js @@ -271,7 +271,7 @@ // The prefix "utm_" is optional with "strictUtm" disabled // "ref" is only collected when "strictUtm" is disabled - return new RegExp(regex).test(keyValue); + return new RegExp(regex, "i").test(keyValue); }) .join("&") || undefinedVar ); diff --git a/test/unit/pageview-query.test.js b/test/unit/pageview-query.test.js index 0f4478d3..363641de 100644 --- a/test/unit/pageview-query.test.js +++ b/test/unit/pageview-query.test.js @@ -19,4 +19,22 @@ describe("pageview query", function () { done(); }, 10); }); + + it("matches allowed params case insensitively", function (done) { + const dom = createDOM({ + settings: { autoCollect: false, allowParams: "foo" }, + }); + + dom.window.sa_pageview("/manual?FOO=bar"); + + setTimeout(() => { + const req = dom.sent.find( + (r) => r.type === "image" && /path=%2Fmanual/.test(r.url) + ); + expect(req, "pageview request").to.exist; + const url = new URL(req.url); + expect(url.searchParams.get("query")).to.equal("FOO=bar"); + done(); + }, 10); + }); }); From 52d297e404851d3a1eb3ede965c930de8d48136b Mon Sep 17 00:00:00 2001 From: Simple Analytics Codex Date: Wed, 12 Aug 2026 01:12:58 +0200 Subject: [PATCH 45/62] Fix merged BrowserStack test setup --- test/index.js | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/test/index.js b/test/index.js index 4356d5ee..2ffd88dd 100644 --- a/test/index.js +++ b/test/index.js @@ -12,6 +12,11 @@ const { REQUIRED_BROWSERS, REQUIRED_OSES, } = require("./helpers/browser-matrix"); +const server = require("./helpers/server"); + +const { + BS_CAPABILITIES, + BS_LOCAL_OPTIONS, STOP_ON_FAIL, BROWSERSTACK_USERNAME, BROWSERSTACK_ACCESS_KEY, @@ -244,6 +249,7 @@ const getDeviceName = ({ ) ); + suiteInstance.addTest( new Mocha.Test(`Test Node.js environment`, async function () { expect(process.version, "Should use Node.js 22.16").to.match(/^v22\.16/); }) From 3e8bc7e6d0ec0a5f76def6c447745fa7541d1f0d Mon Sep 17 00:00:00 2001 From: Simple Analytics Codex Date: Wed, 12 Aug 2026 14:26:10 +0200 Subject: [PATCH 46/62] Collect compact query parameter names via ignore metrics --- dist/latest/.DS_Store | Bin 0 -> 6148 bytes dist/latest/auto-events.js | 4 +- dist/latest/auto-events.js.map | 2 +- dist/latest/cloudflare.js | 68 +++++++++++--------- dist/latest/custom/app.js | 4 +- dist/latest/custom/app.js.map | 2 +- dist/latest/custom/auto-events.js | 4 +- dist/latest/custom/auto-events.js.map | 2 +- dist/latest/custom/e.js | 4 +- dist/latest/custom/e.js.map | 2 +- dist/latest/custom/latest.dev.js | 68 +++++++++++--------- dist/latest/custom/latest.js | 4 +- dist/latest/custom/latest.js.map | 2 +- dist/latest/custom/light.js | 4 +- dist/latest/custom/light.js.map | 2 +- dist/latest/custom/proxy.js | 4 +- dist/latest/custom/proxy.js.map | 2 +- dist/latest/hello.js | 4 +- dist/latest/hello.js.map | 2 +- dist/latest/latest.dev.js | 68 +++++++++++--------- dist/latest/latest.js | 4 +- dist/latest/latest.js.map | 2 +- dist/latest/light.js | 4 +- dist/latest/light.js.map | 2 +- dist/v12/app.js | 4 +- dist/v12/app.js.map | 2 +- dist/v12/auto-events.js | 4 +- dist/v12/auto-events.js.map | 2 +- dist/v12/custom/app.js | 4 +- dist/v12/custom/app.js.map | 2 +- dist/v12/custom/auto-events.js | 4 +- dist/v12/custom/auto-events.js.map | 2 +- dist/v12/custom/light.js | 4 +- dist/v12/custom/light.js.map | 2 +- dist/v12/custom/proxy.js | 4 +- dist/v12/custom/proxy.js.map | 2 +- dist/v12/light.js | 4 +- dist/v12/light.js.map | 2 +- src/default.js | 88 ++++++++++++++++---------- test/unit/pageview-query.test.js | 38 +++++++++++ 40 files changed, 260 insertions(+), 172 deletions(-) create mode 100644 dist/latest/.DS_Store diff --git a/dist/latest/.DS_Store b/dist/latest/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..13611aee59a0f5c943b8ce2ce89e28771e82b025 GIT binary patch literal 6148 zcmeHKI|>3p3{6x-u-VdbuHX#@(Gz$9QL$3CQ2VVsmq+vEgCMJoU?VS(yqQeiEc=Sh zMnrUR-OoiD5t+aZ`A~!P_y=+c7rQj%QvJb;Z^= WuZdlt(~);NkUs;a3yli=T7d`prWK -1,\n emails: collectTypes.indexOf(\"emails\") > -1,\n downloads: collectTypes.indexOf(\"downloads\") > -1,\n // Downloads: enter file extensions you want to collect\n downloadsExtensions: setting(\"extensions\", \"array\", [\n \"pdf\",\n \"csv\",\n \"docx\",\n \"xlsx\",\n \"zip\",\n \"doc\",\n \"xls\",\n ]),\n\n // All: use title attribute if set for event name (for all events)\n // THIS TAKES PRECEDENCE OVER OTHER SETTINGS BELOW\n title: setting(\"useTitle\", \"bool\", true),\n // Outbound: use full URL of the links? false for just the hostname\n outboundFullUrl: fullUrls,\n // Downloads: if taking event name from URL, use full URL or just filename (default)\n downloadsFullUrl: fullUrls,\n };\n\n var saGlobal = setting(\"saGlobal\", \"string\", \"sa_event\");\n\n // For compiling the script\n var optionsLink = options;\n\n if (typeof optionsLink === \"undefined\")\n log(\"options object not found, please specify\", \"warn\");\n\n var saAutomatedLink = function saAutomatedLink(element, type) {\n try {\n if (!element) return log(\"no element found\");\n var sent = false;\n\n var callback = function () {\n if (!sent && !element.hasAttribute(\"target\"))\n document.location = element.getAttribute(\"href\");\n sent = true;\n };\n\n if (window[saGlobal] && window[saGlobal + \"_loaded\"]) {\n var hostname = element.hostname;\n var pathname = element.pathname;\n\n var event;\n var metadata = {\n title: element.getAttribute(\"title\") || undefined,\n };\n var url = element.href || undefined;\n\n var useTitle = false;\n if (optionsLink.title && element.hasAttribute(\"title\")) {\n var theTitle = element.getAttribute(\"title\").trim();\n if (theTitle != \"\") useTitle = true;\n }\n\n if (useTitle) {\n event = theTitle;\n } else {\n switch (type) {\n case \"outbound\": {\n event = hostname + (optionsLink.outboundFullUrl ? pathname : \"\");\n metadata.url = url;\n break;\n }\n case \"download\": {\n event = optionsLink.downloadsFullUrl\n ? hostname + pathname\n : pathname.split(\"/\").pop();\n metadata.url = url;\n break;\n }\n case \"email\": {\n var href = element.getAttribute(\"href\");\n event = (href.split(\":\")[1] || \"\").split(\"?\")[0];\n metadata.email = event;\n break;\n }\n }\n }\n\n var clean =\n type +\n \"_\" +\n event.replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_+|_+$)/g, \"\");\n\n window[saGlobal](clean, metadata, callback);\n\n log(\"collected \" + clean);\n\n return type === \"email\"\n ? callback()\n : window.setTimeout(callback, 5000);\n } else {\n log(saGlobal + \" is not defined\", \"warn\");\n return callback();\n }\n } catch (error) {\n log(error.message, \"warn\");\n }\n };\n\n window.saAutomatedLink = saAutomatedLink;\n\n function collectLink(link, onclick) {\n if (link.hasAttribute(\"data-simple-event\")) return;\n var collect = false;\n\n // Collect download clicks\n if (\n optionsLink.downloads &&\n /^https?:\\/\\//i.test(link.href) &&\n new RegExp(\n \"\\\\.(\" + (optionsLink.downloadsExtensions || []).join(\"|\") + \")$\",\n \"i\"\n ).test(link.pathname)\n ) {\n collect = \"download\";\n\n // Collect outbound links clicks\n } else if (\n optionsLink.outbound &&\n /^https?:\\/\\//i.test(link.href) &&\n link.hostname !== window.location.hostname\n ) {\n collect = \"outbound\";\n\n // Collect email clicks\n } else if (optionsLink.emails && /^mailto:/i.test(link.href)) {\n collect = \"email\";\n }\n\n if (!collect) return;\n\n if (onclick) {\n var onClickAttribute = \"saAutomatedLink(this, '\" + collect + \"');\";\n\n if (\n !link.hasAttribute(\"target\") ||\n link.getAttribute(\"target\") === \"_self\"\n )\n onClickAttribute += \" return false;\";\n\n link.setAttribute(\"onclick\", onClickAttribute);\n } else {\n link.addEventListener(\"click\", function () {\n saAutomatedLink(link, collect);\n });\n }\n }\n\n function onDOMContentLoaded() {\n try {\n var a = document.getElementsByTagName(\"a\");\n\n // Loop over all links on the page\n for (var i = 0; i < a.length; i++) {\n var link = a[i];\n var href = link.getAttribute(\"href\");\n\n // Skip links that don't have an href\n if (!href) continue;\n\n // We don't want to overwrite website behaviour so we check for the onclick attribute\n if (!link.getAttribute(\"onclick\") && !/^mailto:/.test(href)) {\n collectLink(link, true);\n } else {\n collectLink(link, false);\n }\n }\n } catch (error) {\n log(error.message, \"warn\");\n }\n }\n\n if (doc.readyState === \"ready\" || doc.readyState === \"complete\") {\n onDOMContentLoaded();\n } else {\n document.addEventListener(\"readystatechange\", function (event) {\n if (event.target.readyState === \"complete\") onDOMContentLoaded();\n });\n }\n})(window);\n"],"names":["collectLink","link","onclick","collect","onClickAttribute","hasAttribute","optionsLink","downloads","test","href","RegExp","downloadsExtensions","join","pathname","outbound","hostname","window","location","emails","getAttribute","setAttribute","addEventListener","saAutomatedLink","onDOMContentLoaded","a","document","getElementsByTagName","i","length","error","log","message","doc","scriptElement","setting","collectTypes","fullUrls","options","saGlobal","type","logger","console","warn","info","currentScript","querySelector","attribute","defaultValue","value","dataset","split","map","item","trim","filter","Boolean","indexOf","title","outboundFullUrl","downloadsFullUrl","element","sent","callback","theTitle","metadata","undefined","url","useTitle","event","pop","email","clean","replace","setTimeout","readyState","target"],"mappings":";;AAsJE,SAASA,EAAYC,EAAMC,GACzB,IACIC,EA6BEC,EA9BFH,EAAKI,aAAa,uBAClBF,GAAU,EAIZG,EAAYC,WACZ,gBAAgBC,KAAKP,EAAKQ,OAC1B,IAAIC,OACF,QAAUJ,EAAYK,qBAAuB,IAAIC,KAAK,KAAO,KAC7D,KACAJ,KAAKP,EAAKY,UAEZV,EAAU,WAIVG,EAAYQ,UACZ,gBAAgBN,KAAKP,EAAKQ,OAC1BR,EAAKc,WAAaC,EAAOC,SAASF,SAElCZ,EAAU,WAGDG,EAAYY,QAAU,YAAYV,KAAKP,EAAKQ,QACrDN,EAAU,SAGPA,IAEDD,GACEE,EAAmB,0BAA4BD,EAAU,MAG1DF,EAAKI,aAAa,WACa,UAAhCJ,EAAKkB,aAAa,YAElBf,GAAoB,kBAEtBH,EAAKmB,aAAa,UAAWhB,IAE7BH,EAAKoB,iBAAiB,QAAS,WAC7BC,EAAgBrB,EAAME,OAK5B,SAASoB,IACP,IAIE,IAHA,IAAIC,EAAIC,SAASC,qBAAqB,KAG7BC,EAAI,EAAGA,EAAIH,EAAEI,OAAQD,IAAK,CACjC,IAAI1B,EAAOuB,EAAEG,GACTlB,EAAOR,EAAKkB,aAAa,QAGxBV,IAGAR,EAAKkB,aAAa,YAAe,WAAWX,KAAKC,GAGpDT,EAAYC,GAAM,GAFlBD,EAAYC,GAAM,KAKtB,MAAO4B,GACPC,EAAID,EAAME,QAAS,SAzNzB,IAA4Bf,EAItBc,EAKAE,EAEAC,EAGAC,EAqBAC,EAKAC,EAEAC,EAyBAC,EAGAhC,EAKAgB,OAzEkB,KAFIN,EAoOzBA,UAhOGc,EAAM,SAAUC,EAASQ,GAC3B,IAAIC,EAAkB,SAATD,EAAkBE,QAAQC,KAAOD,QAAQE,KACtD,OAAOH,GAAUA,EAAO,gCAAiCT,IAGvDC,EAAMhB,EAAOS,SAEbQ,EACFD,EAAIY,eAAiBZ,EAAIa,cAAc,iCAuBrCV,GArBAD,EAAU,SAAUY,EAAWP,EAAMQ,GACvC,IAAIC,EAAQf,GAAiBA,EAAcgB,QAAQH,GAGnD,MAAa,SAATP,GAA8B,SAAVS,GAA8B,UAAVA,EAE1B,SAATT,EAAwBQ,EAGpB,UAATR,GAAoBS,EACfA,EACJE,MAAM,KACNC,IAAI,SAAUC,GACb,OAAOA,EAAKC,SAEbC,OAAOC,SACM,UAAThB,GAEFS,GAF2BD,EAXf,SAAVC,IAgBgB,UAAW,QAAS,CAC7C,WACA,SACA,cAEEZ,EAAWF,EAAQ,WAAY,QAAQ,GAEvCG,EAAU,CAEZvB,UAA8C,EAApCqB,EAAaqB,QAAQ,YAC/BtC,QAA0C,EAAlCiB,EAAaqB,QAAQ,UAC7BjD,WAAgD,EAArC4B,EAAaqB,QAAQ,aAEhC7C,oBAAqBuB,EAAQ,aAAc,QAAS,CAClD,MACA,MACA,OACA,OACA,MACA,MACA,QAKFuB,MAAOvB,EAAQ,WAAY,QAAQ,GAEnCwB,gBAAiBtB,EAEjBuB,iBAAkBvB,GAGhBE,EAAWJ,EAAQ,WAAY,SAAU,iBAKlB,KAFvB5B,EAAc+B,IAGhBP,EAAI,2CAA4C,QAE9CR,EAAkB,SAASA,EAAgBsC,EAASrB,GACtD,IACE,IAAKqB,EAAS,OAAO9B,EAAI,oBACzB,IAAI+B,GAAO,EAEPC,EAAW,WACRD,GAASD,EAAQvD,aAAa,YACjCoB,SAASR,SAAW2C,EAAQzC,aAAa,SAC3C0C,GAAO,GAGT,GAAI7C,EAAOsB,IAAatB,EAAOsB,EAAW,WAAY,CACpD,IAWMyB,EAXFhD,EAAW6C,EAAQ7C,SACnBF,EAAW+C,EAAQ/C,SAGnBmD,EAAW,CACbP,MAAOG,EAAQzC,aAAa,UAAY8C,WAEtCC,EAAMN,EAAQnD,MAAQwD,UAEtBE,GAAW,EAMf,GALI7D,EAAYmD,OAASG,EAAQvD,aAAa,WAE5B,KADZ0D,EAAWH,EAAQzC,aAAa,SAASkC,UACzBc,GAAW,IAG7BA,EACFC,EAAQL,OAER,OAAQxB,GACN,IAAK,WACH6B,EAAQrD,GAAYT,EAAYoD,gBAAkB7C,EAAW,IAC7DmD,EAASE,IAAMA,EACf,MAEF,IAAK,WACHE,EAAQ9D,EAAYqD,iBAChB5C,EAAWF,EACXA,EAASqC,MAAM,KAAKmB,MACxBL,EAASE,IAAMA,EACf,MAEF,IAAK,QACH,IACAE,GADWR,EAAQzC,aAAa,QAClB+B,MAAM,KAAK,IAAM,IAAIA,MAAM,KAAK,GAC9Cc,EAASM,MAAQF,EAMvB,IAAIG,EACFhC,EACA,IACA6B,EAAMI,QAAQ,eAAgB,KAAKA,QAAQ,aAAc,IAM3D,OAJAxD,EAAOsB,GAAUiC,EAAOP,EAAUF,GAElChC,EAAI,aAAeyC,GAEH,UAAThC,EACHuB,IACA9C,EAAOyD,WAAWX,EAAU,KAGhC,OADAhC,EAAIQ,EAAW,kBAAmB,QAC3BwB,IAET,MAAOjC,GACPC,EAAID,EAAME,QAAS,UAIvBf,EAAOM,gBAAkBA,EAyEF,UAAnBU,EAAI0C,YAA6C,aAAnB1C,EAAI0C,WACpCnD,IAEAE,SAASJ,iBAAiB,mBAAoB,SAAU+C,GACtB,aAA5BA,EAAMO,OAAOD,YAA2BnD"} \ No newline at end of file +{"version":3,"file":"auto-events.source.js","sources":["auto-events.source.js"],"sourcesContent":["(function saAutomatedEvents(window) {\n // Skip server side rendered pages\n if (typeof window === \"undefined\") return;\n\n var log = function (message, type) {\n var logger = type === \"warn\" ? console.warn : console.info;\n return logger && logger(\"Simple Analytics auto events:\", message);\n };\n\n var doc = window.document;\n\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"auto-events.js\"]');\n\n var setting = function (attribute, type, defaultValue) {\n var value = scriptElement && scriptElement.dataset[attribute];\n\n // Booleans\n if (type === \"bool\" && (value === \"true\" || value === \"false\"))\n return value === \"true\";\n else if (type === \"bool\") return defaultValue;\n\n // Arrays\n if (type === \"array\" && value)\n return value\n .split(\",\")\n .map(function (item) {\n return item.trim();\n })\n .filter(Boolean);\n else if (type === \"array\") return defaultValue;\n\n return value || defaultValue;\n };\n\n var collectTypes = setting(\"collect\", \"array\", [\n \"outbound\",\n \"emails\",\n \"downloads\",\n \"phones\",\n ]);\n var fullUrls = setting(\"fullUrls\", \"bool\", false);\n\n var options = {\n // What to collect\n outbound: collectTypes.indexOf(\"outbound\") > -1,\n emails: collectTypes.indexOf(\"emails\") > -1,\n downloads: collectTypes.indexOf(\"downloads\") > -1,\n phones: collectTypes.indexOf(\"phones\") > -1,\n // Downloads: enter file extensions you want to collect\n downloadsExtensions: setting(\"extensions\", \"array\", [\n \"pdf\",\n \"csv\",\n \"docx\",\n \"xlsx\",\n \"zip\",\n \"doc\",\n \"xls\",\n ]),\n\n // All: use title attribute if set for event name (for all events)\n // THIS TAKES PRECEDENCE OVER OTHER SETTINGS BELOW\n title: setting(\"useTitle\", \"bool\", true),\n // Outbound: use full URL of the links? false for just the hostname\n outboundFullUrl: fullUrls,\n // Downloads: if taking event name from URL, use full URL or just filename (default)\n downloadsFullUrl: fullUrls,\n };\n\n var saGlobal = setting(\"saGlobal\", \"string\", \"sa_event\");\n\n // For compiling the script\n var optionsLink = options;\n\n if (typeof optionsLink === \"undefined\")\n log(\"options object not found, please specify\", \"warn\");\n\n var saAutomatedLink = function saAutomatedLink(element, type) {\n try {\n if (!element) return log(\"no element found\");\n var sent = false;\n\n var callback = function () {\n if (\n !sent &&\n (!element.hasAttribute(\"target\") ||\n element.getAttribute(\"target\") === \"_self\")\n )\n document.location = element.getAttribute(\"href\");\n sent = true;\n };\n\n if (window[saGlobal] && window[saGlobal + \"_loaded\"]) {\n var hostname = element.hostname;\n var pathname = element.pathname;\n\n var event;\n var metadata = {\n title: element.getAttribute(\"title\") || undefined,\n };\n var url = element.href || undefined;\n\n var useTitle = false;\n if (optionsLink.title && element.hasAttribute(\"title\")) {\n var theTitle = element.getAttribute(\"title\").trim();\n if (theTitle != \"\") useTitle = true;\n }\n\n if (useTitle) {\n event = theTitle;\n } else {\n switch (type) {\n case \"outbound\": {\n event = hostname + (optionsLink.outboundFullUrl ? pathname : \"\");\n metadata.url = url;\n break;\n }\n case \"download\": {\n event = optionsLink.downloadsFullUrl\n ? hostname + pathname\n : pathname.split(\"/\").pop();\n metadata.url = url;\n break;\n }\n case \"email\": {\n var href = element.getAttribute(\"href\");\n event = (href.split(\":\")[1] || \"\").split(\"?\")[0];\n metadata.email = event;\n break;\n }\n case \"phone\": {\n var hrefPhone = element.getAttribute(\"href\");\n event = (hrefPhone.split(\":\")[1] || \"\").split(\"?\")[0];\n metadata.phone = event;\n break;\n }\n }\n }\n\n var clean =\n type +\n \"_\" +\n event.replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_+|_+$)/g, \"\");\n\n window[saGlobal](clean, metadata, callback);\n\n log(\"collected \" + clean);\n\n return type === \"email\" || type === \"phone\"\n ? callback()\n : window.setTimeout(callback, 5000);\n } else {\n log(saGlobal + \" is not defined\", \"warn\");\n return callback();\n }\n } catch (error) {\n log(error.message, \"warn\");\n }\n };\n\n window.saAutomatedLink = saAutomatedLink;\n\n function collectLink(link, onclick) {\n if (link.hasAttribute(\"data-simple-event\")) return;\n var collect = false;\n\n // Collect download clicks\n if (\n optionsLink.downloads &&\n /^https?:\\/\\//i.test(link.href) &&\n new RegExp(\n \"\\\\.(\" + (optionsLink.downloadsExtensions || []).join(\"|\") + \")$\",\n \"i\"\n ).test(link.pathname)\n ) {\n collect = \"download\";\n\n // Collect outbound links clicks\n } else if (\n optionsLink.outbound &&\n /^https?:\\/\\//i.test(link.href) &&\n link.hostname !== window.location.hostname\n ) {\n collect = \"outbound\";\n\n // Collect email clicks\n } else if (optionsLink.emails && /^mailto:/i.test(link.href)) {\n collect = \"email\";\n\n // Collect telephone clicks\n } else if (optionsLink.phones && /^tel:/i.test(link.href)) {\n collect = \"phone\";\n }\n\n if (!collect) return;\n\n if (onclick) {\n var onClickAttribute = \"saAutomatedLink(this, '\" + collect + \"');\";\n\n if (\n !link.hasAttribute(\"target\") ||\n link.getAttribute(\"target\") === \"_self\"\n )\n onClickAttribute += \" return false;\";\n\n link.setAttribute(\"onclick\", onClickAttribute);\n } else {\n link.addEventListener(\"click\", function () {\n saAutomatedLink(this, collect);\n });\n }\n }\n\n function onDOMContentLoaded() {\n try {\n var a = document.getElementsByTagName(\"a\");\n\n // Loop over all links on the page\n for (var i = 0; i < a.length; i++) {\n var link = a[i];\n var href = link.getAttribute(\"href\");\n\n // Skip links that don't have an href\n if (!href) continue;\n\n // We don't want to overwrite website behaviour so we check for the onclick attribute\n if (\n !link.getAttribute(\"onclick\") &&\n !/^mailto:/.test(href) &&\n !/^tel:/.test(href)\n ) {\n collectLink(link, true);\n } else {\n collectLink(link, false);\n }\n }\n } catch (error) {\n log(error.message, \"warn\");\n }\n }\n\n if (doc.readyState === \"ready\" || doc.readyState === \"complete\") {\n onDOMContentLoaded();\n } else {\n document.addEventListener(\"readystatechange\", function (event) {\n if (event.target.readyState === \"complete\") onDOMContentLoaded();\n });\n }\n})(window);\n"],"names":["collectLink","link","onclick","collect","onClickAttribute","hasAttribute","optionsLink","downloads","test","href","RegExp","downloadsExtensions","join","pathname","outbound","hostname","window","location","emails","phones","getAttribute","setAttribute","addEventListener","saAutomatedLink","this","onDOMContentLoaded","a","document","getElementsByTagName","i","length","error","log","message","doc","scriptElement","setting","collectTypes","fullUrls","options","saGlobal","type","logger","console","warn","info","currentScript","querySelector","attribute","defaultValue","value","dataset","split","map","item","trim","filter","Boolean","indexOf","title","outboundFullUrl","downloadsFullUrl","element","sent","callback","theTitle","metadata","undefined","url","useTitle","event","pop","email","phone","clean","replace","setTimeout","readyState","target"],"mappings":"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"} \ No newline at end of file diff --git a/dist/latest/cloudflare.js b/dist/latest/cloudflare.js index e036bbea..ebf1329d 100644 --- a/dist/latest/cloudflare.js +++ b/dist/latest/cloudflare.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2025-06-24; 3257; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-08-12; 9ec6; v12) */ /* eslint-env browser */ (function ( @@ -224,32 +224,40 @@ overwriteOptions.strictUtm || attr(scriptElement, "strict-utm") == trueText; + var p; + var getQueryParams = function (ignoreSource, overwriteSearch) { - return ( - (overwriteSearch || loc.search) - .slice(1) - .split("&") - .filter(function (keyValue) { - var ignore = ignoreSource || !collectMetricByString("ut"); - - var paramsRegexList = allowParams.map(filterRegex).join("|"); - var regex = ignore - ? "^(" + paramsRegexList + ")=" - : "^((utm_)" + - (strictUtm ? "" : "?") + - "(source|medium|content|term|campaign)" + - (strictUtm ? "" : "|ref") + - "|" + - paramsRegexList + - ")="; - if (ignore && !allowParams.length) return falseVar; - - // The prefix "utm_" is optional with "strictUtm" disabled - // "ref" is only collected when "strictUtm" is disabled - return new RegExp(regex).test(keyValue); - }) - .join("&") || undefinedVar - ); + p = !ignoreSource && collectMetricByString("p") ? "" : falseVar; + var q = (overwriteSearch || loc.search) + .slice(1) + .split("&") + .filter(function (keyValue) { + var i = keyValue.indexOf("="); + if (p !== falseVar && i > 0 && keyValue.slice(i + 1)) + p += (p ? "," : "") + keyValue.slice(0, i); + + var ignore = ignoreSource || !collectMetricByString("ut"); + + var paramsRegexList = allowParams.map(filterRegex).join("|"); + var regex = ignore + ? "^(" + paramsRegexList + ")=" + : "^((utm_)" + + (strictUtm ? "" : "?") + + "(source|medium|content|term|campaign)" + + (strictUtm ? "" : "|ref") + + "|" + + paramsRegexList + + ")="; + if (ignore && !allowParams.length) return falseVar; + + // The prefix "utm_" is optional with "strictUtm" disabled + // "ref" is only collected when "strictUtm" is disabled + return new RegExp(regex, "i").test(keyValue); + }) + .join("&"); + + p = p || undefinedVar; + return q || undefinedVar; }; // Ignore pages specified in data-ignore-pages @@ -667,7 +675,7 @@ isPushState, deleteSourceInfo, sameSite, - query, + search, metadata, callback ) { @@ -675,13 +683,15 @@ if (collectDataOnLeave) payload.page_id = uuid(); var currentPage = definedHostname + getPath(); + var query = getQueryParams(deleteSourceInfo, search); sendData( { id: payload.page_id, type: pageviewText, referrer: !deleteSourceInfo || sameSite ? referrer : null, - query: query || getQueryParams(deleteSourceInfo), + query: query, + p: p, metadata: stringify(metadata), }, @@ -791,7 +801,7 @@ isPushState, delSrc, // r = referrers sameSite, - querySearch ? getQueryParams(delSrc, querySearch) : undefinedVar, + querySearch, metadata, callback ); diff --git a/dist/latest/custom/app.js b/dist/latest/custom/app.js index b0fc1b1e..fbc94289 100644 --- a/dist/latest/custom/app.js +++ b/dist/latest/custom/app.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2025-06-24; b78b; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-08-12; c8bd; v12) */ -!function(d,t,e,n,m){try{var g=undefined,v=!0,y=!1,r="true",a="https:",_="pageview",u="event",i="error",o=d.console,c="doNotTrack",w=d.navigator,s=d.location,b=s.host,l=d.document,p=w.userAgent,f="Not sending request ",h=f+"when ",O=y,E=encodeURIComponent,x=decodeURIComponent,S=JSON.stringify,M=d.addEventListener,k="https://"+e,A=l.documentElement||{},q="language",$="Height",j="scroll",D=w.userAgentData,C=j+$,H="offset"+$,R="client"+$,P="pagehide",T="platform",U="platformVersion",I="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),N=d.screen,z=l.currentScript||l.querySelector('script[src*="'+e+'"]');m=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){m("Error in your "+t+" function:",e)},W=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},G=function(t){return"string"==typeof t},J=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},L=function(t,e){return t&&t.getAttribute("data-"+e)},Y=function(t){return Array.isArray(t)?t:G(t)&&t.length?t.split(/, ?/):[]},Z=function(t){return t&&t.constructor===Object},K=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},at=function(t){return"function"==typeof t},it="namespace",ot=t[it]||L(z,it)||"sa",ct=function(t,e){var n=d[ot+"_metadata"];Z(n)&&(t=K(t,n));var r=d[Mt];if(!at(r))return Mt&&m(Mt+" not found, set window."+Mt),t;try{return K(t,r.call(d,K(t,e)))}catch(a){F("metadata",a)}},st=t.strictUtm||L(z,"strict-utm")==r,ut=function(a,t){return(t||s.search).slice(1).split("&").filter(function(t){var e=a||!et("ut"),n=Et.map(J).join("|"),r=e?"^("+n+")=":"^((utm_)"+(st?"":"?")+"(source|medium|content|term|campaign)"+(st?"":"|ref")+"|"+n+")=";return e&&!Et.length?y:new RegExp(r).test(t)}).join("&")||g},lt=ot+"_loaded";if(d[lt]==v)return m(f+"twice");d.sa_event_loaded=v,d[lt]=v;var pt=function(e,t,n){e=n?e:K($t,Ct,e),w.brave&&!n&&(e.brave=v),w._duckduckgoloader_&&!n&&(e.duck=v);var r=new Image;t&&(r.onerror=t,r.onload=t),r.src=k+"/simple.gif?"+Object.keys(e).filter(function(t){return e[t]!=g}).map(function(t){return E(t)+"="+E(e[t])}).join("&")+"&time="+Date.now()},ft=t.hostname||L(z,"hostname"),ht=ft||b,dt={version:"custom_app_12",hostname:ht};n=function(t){t=t.stack?t+" "+t.stack:t,m(t),pt(K(dt,{type:i,error:t,path:s.pathname}),g,v)},M(i,function(t){t.filename&&-1"); +!function(d,t,e,n,m){try{var v=undefined,g=!0,y=!1,r="true",a="https:",_="pageview",u="event",i="error",o=d.console,c="doNotTrack",w=d.navigator,s=d.location,b=s.host,l=d.document,p=w.userAgent,f="Not sending request ",h=f+"when ",O=y,x=encodeURIComponent,E=decodeURIComponent,S=JSON.stringify,M=d.addEventListener,k="https://"+e,A=l.documentElement||{},q="language",$="Height",j="scroll",D=w.userAgentData,C=j+$,H="offset"+$,R="client"+$,P="pagehide",T="platform",U="platformVersion",I="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),N=d.screen,z=l.currentScript||l.querySelector('script[src*="'+e+'"]');m=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){m("Error in your "+t+" function:",e)},W=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},G=function(t){return"string"==typeof t},J=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},L=function(t,e){return t&&t.getAttribute("data-"+e)},Y=function(t){return Array.isArray(t)?t:G(t)&&t.length?t.split(/, ?/):[]},Z=function(t){return t&&t.constructor===Object},K=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},it=function(t){return"function"==typeof t},ot="namespace",ct=t[ot]||L(z,ot)||"sa",st=function(t,e){var n=d[ct+"_metadata"];Z(n)&&(t=K(t,n));var r=d[kt];if(!it(r))return kt&&m(kt+" not found, set window."+kt),t;try{return K(t,r.call(d,K(t,e)))}catch(a){F("metadata",a)}},ut=t.strictUtm||L(z,"strict-utm")==r,lt=function(i,t){tt=!i&&nt("p")?"":y;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");tt!==y&&0"); //# sourceMappingURL=app.js.map \ No newline at end of file diff --git a/dist/latest/custom/app.js.map b/dist/latest/custom/app.js.map index 7cbc2558..9c2f27f3 100644 --- a/dist/latest/custom/app.js.map +++ b/dist/latest/custom/app.js.map @@ -1 +1 @@ -{"version":3,"file":"app.source.js","sources":["app.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n return (\n (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex).test(keyValue);\n })\n .join(\"&\") || undefinedVar\n );\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n query,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query || getQueryParams(deleteSourceInfo),\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch ? getQueryParams(delSrc, querySearch) : undefinedVar,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_app_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","search","keyValue","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","indexOf","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","protocol","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","i","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","query","currentPage","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue","q"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"app.source.js","sources":["app.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var p;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n p = !ignoreSource && collectMetricByString(\"p\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (p !== falseVar && i > 0 && keyValue.slice(i + 1))\n p += (p ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n p = p || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n p: p,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_app_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","p","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","protocol","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue"],"mappings":"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"} \ No newline at end of file diff --git a/dist/latest/custom/auto-events.js b/dist/latest/custom/auto-events.js index d3657139..1d46cfd7 100644 --- a/dist/latest/custom/auto-events.js +++ b/dist/latest/custom/auto-events.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2025-06-24; 7048; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-08-12; e658; v12) */ -function r(t,e){var a,n;t.hasAttribute("data-simple-event")||(a=!1,h.downloads&&/^https?:\/\//i.test(t.href)&&new RegExp("\\.("+(h.downloadsExtensions||[]).join("|")+")$","i").test(t.pathname)?a="download":h.outbound&&/^https?:\/\//i.test(t.href)&&t.hostname!==m.location.hostname?a="outbound":h.emails&&/^mailto:/i.test(t.href)&&(a="email"),a&&(e?(n="saAutomatedLink(this, '"+a+"');",t.hasAttribute("target")&&"_self"!==t.getAttribute("target")||(n+=" return false;"),t.setAttribute("onclick",n)):t.addEventListener("click",function(){g(t,a)})))}function e(){try{for(var t=document.getElementsByTagName("a"),e=0;e -1,\n emails: collectTypes.indexOf(\"emails\") > -1,\n downloads: collectTypes.indexOf(\"downloads\") > -1,\n // Downloads: enter file extensions you want to collect\n downloadsExtensions: setting(\"extensions\", \"array\", [\n \"pdf\",\n \"csv\",\n \"docx\",\n \"xlsx\",\n \"zip\",\n \"doc\",\n \"xls\",\n ]),\n\n // All: use title attribute if set for event name (for all events)\n // THIS TAKES PRECEDENCE OVER OTHER SETTINGS BELOW\n title: setting(\"useTitle\", \"bool\", true),\n // Outbound: use full URL of the links? false for just the hostname\n outboundFullUrl: fullUrls,\n // Downloads: if taking event name from URL, use full URL or just filename (default)\n downloadsFullUrl: fullUrls,\n };\n\n var saGlobal = setting(\"saGlobal\", \"string\", \"sa_event\");\n\n // For compiling the script\n var optionsLink = options;\n\n if (typeof optionsLink === \"undefined\")\n log(\"options object not found, please specify\", \"warn\");\n\n var saAutomatedLink = function saAutomatedLink(element, type) {\n try {\n if (!element) return log(\"no element found\");\n var sent = false;\n\n var callback = function () {\n if (!sent && !element.hasAttribute(\"target\"))\n document.location = element.getAttribute(\"href\");\n sent = true;\n };\n\n if (window[saGlobal] && window[saGlobal + \"_loaded\"]) {\n var hostname = element.hostname;\n var pathname = element.pathname;\n\n var event;\n var metadata = {\n title: element.getAttribute(\"title\") || undefined,\n };\n var url = element.href || undefined;\n\n var useTitle = false;\n if (optionsLink.title && element.hasAttribute(\"title\")) {\n var theTitle = element.getAttribute(\"title\").trim();\n if (theTitle != \"\") useTitle = true;\n }\n\n if (useTitle) {\n event = theTitle;\n } else {\n switch (type) {\n case \"outbound\": {\n event = hostname + (optionsLink.outboundFullUrl ? pathname : \"\");\n metadata.url = url;\n break;\n }\n case \"download\": {\n event = optionsLink.downloadsFullUrl\n ? hostname + pathname\n : pathname.split(\"/\").pop();\n metadata.url = url;\n break;\n }\n case \"email\": {\n var href = element.getAttribute(\"href\");\n event = (href.split(\":\")[1] || \"\").split(\"?\")[0];\n metadata.email = event;\n break;\n }\n }\n }\n\n var clean =\n type +\n \"_\" +\n event.replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_+|_+$)/g, \"\");\n\n window[saGlobal](clean, metadata, callback);\n\n log(\"collected \" + clean);\n\n return type === \"email\"\n ? callback()\n : window.setTimeout(callback, 5000);\n } else {\n log(saGlobal + \" is not defined\", \"warn\");\n return callback();\n }\n } catch (error) {\n log(error.message, \"warn\");\n }\n };\n\n window.saAutomatedLink = saAutomatedLink;\n\n function collectLink(link, onclick) {\n if (link.hasAttribute(\"data-simple-event\")) return;\n var collect = false;\n\n // Collect download clicks\n if (\n optionsLink.downloads &&\n /^https?:\\/\\//i.test(link.href) &&\n new RegExp(\n \"\\\\.(\" + (optionsLink.downloadsExtensions || []).join(\"|\") + \")$\",\n \"i\"\n ).test(link.pathname)\n ) {\n collect = \"download\";\n\n // Collect outbound links clicks\n } else if (\n optionsLink.outbound &&\n /^https?:\\/\\//i.test(link.href) &&\n link.hostname !== window.location.hostname\n ) {\n collect = \"outbound\";\n\n // Collect email clicks\n } else if (optionsLink.emails && /^mailto:/i.test(link.href)) {\n collect = \"email\";\n }\n\n if (!collect) return;\n\n if (onclick) {\n var onClickAttribute = \"saAutomatedLink(this, '\" + collect + \"');\";\n\n if (\n !link.hasAttribute(\"target\") ||\n link.getAttribute(\"target\") === \"_self\"\n )\n onClickAttribute += \" return false;\";\n\n link.setAttribute(\"onclick\", onClickAttribute);\n } else {\n link.addEventListener(\"click\", function () {\n saAutomatedLink(link, collect);\n });\n }\n }\n\n function onDOMContentLoaded() {\n try {\n var a = document.getElementsByTagName(\"a\");\n\n // Loop over all links on the page\n for (var i = 0; i < a.length; i++) {\n var link = a[i];\n var href = link.getAttribute(\"href\");\n\n // Skip links that don't have an href\n if (!href) continue;\n\n // We don't want to overwrite website behaviour so we check for the onclick attribute\n if (!link.getAttribute(\"onclick\") && !/^mailto:/.test(href)) {\n collectLink(link, true);\n } else {\n collectLink(link, false);\n }\n }\n } catch (error) {\n log(error.message, \"warn\");\n }\n }\n\n if (doc.readyState === \"ready\" || doc.readyState === \"complete\") {\n onDOMContentLoaded();\n } else {\n document.addEventListener(\"readystatechange\", function (event) {\n if (event.target.readyState === \"complete\") onDOMContentLoaded();\n });\n }\n})(window);\n"],"names":["collectLink","link","onclick","collect","onClickAttribute","hasAttribute","optionsLink","downloads","test","href","RegExp","downloadsExtensions","join","pathname","outbound","hostname","window","location","emails","getAttribute","setAttribute","addEventListener","saAutomatedLink","onDOMContentLoaded","a","document","getElementsByTagName","i","length","error","log","message","doc","scriptElement","setting","collectTypes","fullUrls","options","saGlobal","type","logger","console","warn","info","currentScript","querySelector","attribute","defaultValue","value","dataset","split","map","item","trim","filter","Boolean","indexOf","title","outboundFullUrl","downloadsFullUrl","element","sent","callback","theTitle","metadata","undefined","url","useTitle","event","pop","email","clean","replace","setTimeout","readyState","target"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"auto-events.source.js","sources":["auto-events.source.js"],"sourcesContent":["(function saAutomatedEvents(window) {\n // Skip server side rendered pages\n if (typeof window === \"undefined\") return;\n\n var log = function (message, type) {\n var logger = type === \"warn\" ? console.warn : console.info;\n return logger && logger(\"Simple Analytics auto events:\", message);\n };\n\n var doc = window.document;\n\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"auto-events.js\"]');\n\n var setting = function (attribute, type, defaultValue) {\n var value = scriptElement && scriptElement.dataset[attribute];\n\n // Booleans\n if (type === \"bool\" && (value === \"true\" || value === \"false\"))\n return value === \"true\";\n else if (type === \"bool\") return defaultValue;\n\n // Arrays\n if (type === \"array\" && value)\n return value\n .split(\",\")\n .map(function (item) {\n return item.trim();\n })\n .filter(Boolean);\n else if (type === \"array\") return defaultValue;\n\n return value || defaultValue;\n };\n\n var collectTypes = setting(\"collect\", \"array\", [\n \"outbound\",\n \"emails\",\n \"downloads\",\n \"phones\",\n ]);\n var fullUrls = setting(\"fullUrls\", \"bool\", false);\n\n var options = {\n // What to collect\n outbound: collectTypes.indexOf(\"outbound\") > -1,\n emails: collectTypes.indexOf(\"emails\") > -1,\n downloads: collectTypes.indexOf(\"downloads\") > -1,\n phones: collectTypes.indexOf(\"phones\") > -1,\n // Downloads: enter file extensions you want to collect\n downloadsExtensions: setting(\"extensions\", \"array\", [\n \"pdf\",\n \"csv\",\n \"docx\",\n \"xlsx\",\n \"zip\",\n \"doc\",\n \"xls\",\n ]),\n\n // All: use title attribute if set for event name (for all events)\n // THIS TAKES PRECEDENCE OVER OTHER SETTINGS BELOW\n title: setting(\"useTitle\", \"bool\", true),\n // Outbound: use full URL of the links? false for just the hostname\n outboundFullUrl: fullUrls,\n // Downloads: if taking event name from URL, use full URL or just filename (default)\n downloadsFullUrl: fullUrls,\n };\n\n var saGlobal = setting(\"saGlobal\", \"string\", \"sa_event\");\n\n // For compiling the script\n var optionsLink = options;\n\n if (typeof optionsLink === \"undefined\")\n log(\"options object not found, please specify\", \"warn\");\n\n var saAutomatedLink = function saAutomatedLink(element, type) {\n try {\n if (!element) return log(\"no element found\");\n var sent = false;\n\n var callback = function () {\n if (\n !sent &&\n (!element.hasAttribute(\"target\") ||\n element.getAttribute(\"target\") === \"_self\")\n )\n document.location = element.getAttribute(\"href\");\n sent = true;\n };\n\n if (window[saGlobal] && window[saGlobal + \"_loaded\"]) {\n var hostname = element.hostname;\n var pathname = element.pathname;\n\n var event;\n var metadata = {\n title: element.getAttribute(\"title\") || undefined,\n };\n var url = element.href || undefined;\n\n var useTitle = false;\n if (optionsLink.title && element.hasAttribute(\"title\")) {\n var theTitle = element.getAttribute(\"title\").trim();\n if (theTitle != \"\") useTitle = true;\n }\n\n if (useTitle) {\n event = theTitle;\n } else {\n switch (type) {\n case \"outbound\": {\n event = hostname + (optionsLink.outboundFullUrl ? pathname : \"\");\n metadata.url = url;\n break;\n }\n case \"download\": {\n event = optionsLink.downloadsFullUrl\n ? hostname + pathname\n : pathname.split(\"/\").pop();\n metadata.url = url;\n break;\n }\n case \"email\": {\n var href = element.getAttribute(\"href\");\n event = (href.split(\":\")[1] || \"\").split(\"?\")[0];\n metadata.email = event;\n break;\n }\n case \"phone\": {\n var hrefPhone = element.getAttribute(\"href\");\n event = (hrefPhone.split(\":\")[1] || \"\").split(\"?\")[0];\n metadata.phone = event;\n break;\n }\n }\n }\n\n var clean =\n type +\n \"_\" +\n event.replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_+|_+$)/g, \"\");\n\n window[saGlobal](clean, metadata, callback);\n\n log(\"collected \" + clean);\n\n return type === \"email\" || type === \"phone\"\n ? callback()\n : window.setTimeout(callback, 5000);\n } else {\n log(saGlobal + \" is not defined\", \"warn\");\n return callback();\n }\n } catch (error) {\n log(error.message, \"warn\");\n }\n };\n\n window.saAutomatedLink = saAutomatedLink;\n\n function collectLink(link, onclick) {\n if (link.hasAttribute(\"data-simple-event\")) return;\n var collect = false;\n\n // Collect download clicks\n if (\n optionsLink.downloads &&\n /^https?:\\/\\//i.test(link.href) &&\n new RegExp(\n \"\\\\.(\" + (optionsLink.downloadsExtensions || []).join(\"|\") + \")$\",\n \"i\"\n ).test(link.pathname)\n ) {\n collect = \"download\";\n\n // Collect outbound links clicks\n } else if (\n optionsLink.outbound &&\n /^https?:\\/\\//i.test(link.href) &&\n link.hostname !== window.location.hostname\n ) {\n collect = \"outbound\";\n\n // Collect email clicks\n } else if (optionsLink.emails && /^mailto:/i.test(link.href)) {\n collect = \"email\";\n\n // Collect telephone clicks\n } else if (optionsLink.phones && /^tel:/i.test(link.href)) {\n collect = \"phone\";\n }\n\n if (!collect) return;\n\n if (onclick) {\n var onClickAttribute = \"saAutomatedLink(this, '\" + collect + \"');\";\n\n if (\n !link.hasAttribute(\"target\") ||\n link.getAttribute(\"target\") === \"_self\"\n )\n onClickAttribute += \" return false;\";\n\n link.setAttribute(\"onclick\", onClickAttribute);\n } else {\n link.addEventListener(\"click\", function () {\n saAutomatedLink(this, collect);\n });\n }\n }\n\n function onDOMContentLoaded() {\n try {\n var a = document.getElementsByTagName(\"a\");\n\n // Loop over all links on the page\n for (var i = 0; i < a.length; i++) {\n var link = a[i];\n var href = link.getAttribute(\"href\");\n\n // Skip links that don't have an href\n if (!href) continue;\n\n // We don't want to overwrite website behaviour so we check for the onclick attribute\n if (\n !link.getAttribute(\"onclick\") &&\n !/^mailto:/.test(href) &&\n !/^tel:/.test(href)\n ) {\n collectLink(link, true);\n } else {\n collectLink(link, false);\n }\n }\n } catch (error) {\n log(error.message, \"warn\");\n }\n }\n\n if (doc.readyState === \"ready\" || doc.readyState === \"complete\") {\n onDOMContentLoaded();\n } else {\n document.addEventListener(\"readystatechange\", function (event) {\n if (event.target.readyState === \"complete\") onDOMContentLoaded();\n });\n }\n})(window);\n"],"names":["collectLink","link","onclick","collect","onClickAttribute","hasAttribute","optionsLink","downloads","test","href","RegExp","downloadsExtensions","join","pathname","outbound","hostname","window","location","emails","phones","getAttribute","setAttribute","addEventListener","saAutomatedLink","this","onDOMContentLoaded","a","document","getElementsByTagName","i","length","error","log","message","doc","scriptElement","setting","collectTypes","fullUrls","options","saGlobal","type","logger","console","warn","info","currentScript","querySelector","attribute","defaultValue","value","dataset","split","map","item","trim","filter","Boolean","indexOf","title","outboundFullUrl","downloadsFullUrl","element","sent","callback","theTitle","metadata","undefined","url","useTitle","event","pop","email","phone","clean","replace","setTimeout","readyState","target"],"mappings":"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"} \ No newline at end of file diff --git a/dist/latest/custom/e.js b/dist/latest/custom/e.js index f9faf4e8..a1fbd2a4 100644 --- a/dist/latest/custom/e.js +++ b/dist/latest/custom/e.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2025-06-24; eb12; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-08-12; 0f37; v12) */ -!function(d,t,e,n,m){try{var v=undefined,g=!0,y=!1,r="true",a="https:",_="pageview",u="event",i="error",o=d.console,c="doNotTrack",w=d.navigator,s=d.location,b=s.host,l=d.document,p=w.userAgent,f="Not sending request ",h=f+"when ",O=y,E=encodeURIComponent,x=decodeURIComponent,S=JSON.stringify,M=d.addEventListener,k="https://"+e,A=l.documentElement||{},q="language",$="Height",j="scroll",D=w.userAgentData,C=j+$,H="offset"+$,R="client"+$,P="pagehide",T="platform",U="platformVersion",I="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),N=d.screen,z=l.currentScript||l.querySelector('script[src*="'+e+'"]');m=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){m("Error in your "+t+" function:",e)},W=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},G=function(t){return"string"==typeof t},J=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},L=function(t,e){return t&&t.getAttribute("data-"+e)},Y=function(t){return Array.isArray(t)?t:G(t)&&t.length?t.split(/, ?/):[]},Z=function(t){return t&&t.constructor===Object},K=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},at=function(t){return"function"==typeof t},it="namespace",ot=t[it]||L(z,it)||"sa",ct=function(t,e){var n=d[ot+"_metadata"];Z(n)&&(t=K(t,n));var r=d[Mt];if(!at(r))return Mt&&m(Mt+" not found, set window."+Mt),t;try{return K(t,r.call(d,K(t,e)))}catch(a){F("metadata",a)}},st=t.strictUtm||L(z,"strict-utm")==r,ut=function(a,t){return(t||s.search).slice(1).split("&").filter(function(t){var e=a||!et("ut"),n=Et.map(J).join("|"),r=e?"^("+n+")=":"^((utm_)"+(st?"":"?")+"(source|medium|content|term|campaign)"+(st?"":"|ref")+"|"+n+")=";return e&&!Et.length?y:new RegExp(r).test(t)}).join("&")||v},lt=ot+"_loaded";if(d[lt]==g)return m(f+"twice");d.sa_event_loaded=g,d[lt]=g;var pt=function(e,t,n){e=n?e:K($t,Ct,e),w.brave&&!n&&(e.brave=g),w._duckduckgoloader_&&!n&&(e.duck=g);var r=new Image;t&&(r.onerror=t,r.onload=t),r.src=k+"/simple.gif?"+Object.keys(e).filter(function(t){return e[t]!=v}).map(function(t){return E(t)+"="+E(e[t])}).join("&")+"&time="+Date.now()},ft=t.hostname||L(z,"hostname"),ht=ft||b,dt={version:"custom_events_12",hostname:ht};n=function(t){t=t.stack?t+" "+t.stack:t,m(t),pt(K(dt,{type:i,error:t,path:s.pathname}),v,g)},M(i,function(t){t.filename&&-1"); +!function(d,t,e,n,m){try{var v=undefined,g=!0,y=!1,r="true",a="https:",_="pageview",u="event",i="error",o=d.console,c="doNotTrack",w=d.navigator,s=d.location,b=s.host,l=d.document,p=w.userAgent,f="Not sending request ",h=f+"when ",O=y,x=encodeURIComponent,E=decodeURIComponent,S=JSON.stringify,M=d.addEventListener,k="https://"+e,A=l.documentElement||{},q="language",$="Height",j="scroll",D=w.userAgentData,C=j+$,H="offset"+$,R="client"+$,P="pagehide",T="platform",U="platformVersion",I="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),N=d.screen,z=l.currentScript||l.querySelector('script[src*="'+e+'"]');m=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){m("Error in your "+t+" function:",e)},W=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},G=function(t){return"string"==typeof t},J=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},L=function(t,e){return t&&t.getAttribute("data-"+e)},Y=function(t){return Array.isArray(t)?t:G(t)&&t.length?t.split(/, ?/):[]},Z=function(t){return t&&t.constructor===Object},K=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},it=function(t){return"function"==typeof t},ot="namespace",ct=t[ot]||L(z,ot)||"sa",st=function(t,e){var n=d[ct+"_metadata"];Z(n)&&(t=K(t,n));var r=d[kt];if(!it(r))return kt&&m(kt+" not found, set window."+kt),t;try{return K(t,r.call(d,K(t,e)))}catch(a){F("metadata",a)}},ut=t.strictUtm||L(z,"strict-utm")==r,lt=function(i,t){tt=!i&&nt("p")?"":y;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");tt!==y&&0"); //# sourceMappingURL=e.js.map \ No newline at end of file diff --git a/dist/latest/custom/e.js.map b/dist/latest/custom/e.js.map index 87606e34..94559a83 100644 --- a/dist/latest/custom/e.js.map +++ b/dist/latest/custom/e.js.map @@ -1 +1 @@ -{"version":3,"file":"e.source.js","sources":["e.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n return (\n (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex).test(keyValue);\n })\n .join(\"&\") || undefinedVar\n );\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n query,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query || getQueryParams(deleteSourceInfo),\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch ? getQueryParams(delSrc, querySearch) : undefinedVar,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_events_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","search","keyValue","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","indexOf","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","protocol","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","i","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","query","currentPage","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue","q"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"e.source.js","sources":["e.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var p;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n p = !ignoreSource && collectMetricByString(\"p\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (p !== falseVar && i > 0 && keyValue.slice(i + 1))\n p += (p ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n p = p || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n p: p,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_events_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","p","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","protocol","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue"],"mappings":"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"} \ No newline at end of file diff --git a/dist/latest/custom/latest.dev.js b/dist/latest/custom/latest.dev.js index d6777e9d..79fbc860 100644 --- a/dist/latest/custom/latest.dev.js +++ b/dist/latest/custom/latest.dev.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2025-06-24; 67c4; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-08-12; 6031; v12) */ /* eslint-env browser */ (function ( @@ -222,32 +222,40 @@ overwriteOptions.strictUtm || attr(scriptElement, "strict-utm") == trueText; + var p; + var getQueryParams = function (ignoreSource, overwriteSearch) { - return ( - (overwriteSearch || loc.search) - .slice(1) - .split("&") - .filter(function (keyValue) { - var ignore = ignoreSource || !collectMetricByString("ut"); - - var paramsRegexList = allowParams.map(filterRegex).join("|"); - var regex = ignore - ? "^(" + paramsRegexList + ")=" - : "^((utm_)" + - (strictUtm ? "" : "?") + - "(source|medium|content|term|campaign)" + - (strictUtm ? "" : "|ref") + - "|" + - paramsRegexList + - ")="; - if (ignore && !allowParams.length) return falseVar; - - // The prefix "utm_" is optional with "strictUtm" disabled - // "ref" is only collected when "strictUtm" is disabled - return new RegExp(regex).test(keyValue); - }) - .join("&") || undefinedVar - ); + p = !ignoreSource && collectMetricByString("p") ? "" : falseVar; + var q = (overwriteSearch || loc.search) + .slice(1) + .split("&") + .filter(function (keyValue) { + var i = keyValue.indexOf("="); + if (p !== falseVar && i > 0 && keyValue.slice(i + 1)) + p += (p ? "," : "") + keyValue.slice(0, i); + + var ignore = ignoreSource || !collectMetricByString("ut"); + + var paramsRegexList = allowParams.map(filterRegex).join("|"); + var regex = ignore + ? "^(" + paramsRegexList + ")=" + : "^((utm_)" + + (strictUtm ? "" : "?") + + "(source|medium|content|term|campaign)" + + (strictUtm ? "" : "|ref") + + "|" + + paramsRegexList + + ")="; + if (ignore && !allowParams.length) return falseVar; + + // The prefix "utm_" is optional with "strictUtm" disabled + // "ref" is only collected when "strictUtm" is disabled + return new RegExp(regex, "i").test(keyValue); + }) + .join("&"); + + p = p || undefinedVar; + return q || undefinedVar; }; // Ignore pages specified in data-ignore-pages @@ -667,7 +675,7 @@ isPushState, deleteSourceInfo, sameSite, - query, + search, metadata, callback ) { @@ -675,13 +683,15 @@ if (collectDataOnLeave) payload.page_id = uuid(); var currentPage = definedHostname + getPath(); + var query = getQueryParams(deleteSourceInfo, search); sendData( { id: payload.page_id, type: pageviewText, referrer: !deleteSourceInfo || sameSite ? referrer : null, - query: query || getQueryParams(deleteSourceInfo), + query: query, + p: p, metadata: stringify(metadata), }, @@ -791,7 +801,7 @@ isPushState, delSrc, // r = referrers sameSite, - querySearch ? getQueryParams(delSrc, querySearch) : undefinedVar, + querySearch, metadata, callback ); diff --git a/dist/latest/custom/latest.js b/dist/latest/custom/latest.js index ab7344a2..9157be95 100644 --- a/dist/latest/custom/latest.js +++ b/dist/latest/custom/latest.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2025-06-24; 019f; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-08-12; d920; v12) */ -!function(d,t,e,n,m){try{var g=undefined,v=!0,y=!1,r="true",a="https:",_="pageview",u="event",i="error",o=d.console,c="doNotTrack",w=d.navigator,s=d.location,b=s.host,l=d.document,p=w.userAgent,f="Not sending request ",h=f+"when ",O=y,E=encodeURIComponent,x=decodeURIComponent,S=JSON.stringify,M=d.addEventListener,k="https://"+e,A=l.documentElement||{},q="language",$="Height",j="scroll",D=w.userAgentData,C=j+$,H="offset"+$,R="client"+$,P="pagehide",T="platform",U="platformVersion",I="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),N=d.screen,z=l.currentScript||l.querySelector('script[src*="'+e+'"]');m=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){m("Error in your "+t+" function:",e)},W=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},G=function(t){return"string"==typeof t},J=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},L=function(t,e){return t&&t.getAttribute("data-"+e)},Y=function(t){return Array.isArray(t)?t:G(t)&&t.length?t.split(/, ?/):[]},Z=function(t){return t&&t.constructor===Object},K=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},at=function(t){return"function"==typeof t},it="namespace",ot=t[it]||L(z,it)||"sa",ct=function(t,e){var n=d[ot+"_metadata"];Z(n)&&(t=K(t,n));var r=d[Mt];if(!at(r))return Mt&&m(Mt+" not found, set window."+Mt),t;try{return K(t,r.call(d,K(t,e)))}catch(a){F("metadata",a)}},st=t.strictUtm||L(z,"strict-utm")==r,ut=function(a,t){return(t||s.search).slice(1).split("&").filter(function(t){var e=a||!et("ut"),n=Et.map(J).join("|"),r=e?"^("+n+")=":"^((utm_)"+(st?"":"?")+"(source|medium|content|term|campaign)"+(st?"":"|ref")+"|"+n+")=";return e&&!Et.length?y:new RegExp(r).test(t)}).join("&")||g},lt=ot+"_loaded";if(d[lt]==v)return m(f+"twice");d.sa_event_loaded=v,d[lt]=v;var pt=function(e,t,n){e=n?e:K($t,Ct,e),w.brave&&!n&&(e.brave=v),w._duckduckgoloader_&&!n&&(e.duck=v);var r=new Image;t&&(r.onerror=t,r.onload=t),r.src=k+"/simple.gif?"+Object.keys(e).filter(function(t){return e[t]!=g}).map(function(t){return E(t)+"="+E(e[t])}).join("&")+"&time="+Date.now()},ft=t.hostname||L(z,"hostname"),ht=ft||b,dt={version:"custom_latest_12",hostname:ht};n=function(t){t=t.stack?t+" "+t.stack:t,m(t),pt(K(dt,{type:i,error:t,path:s.pathname}),g,v)},M(i,function(t){t.filename&&-1"); +!function(d,t,e,n,m){try{var v=undefined,g=!0,y=!1,r="true",a="https:",_="pageview",u="event",i="error",o=d.console,c="doNotTrack",w=d.navigator,s=d.location,b=s.host,l=d.document,p=w.userAgent,f="Not sending request ",h=f+"when ",O=y,x=encodeURIComponent,E=decodeURIComponent,S=JSON.stringify,M=d.addEventListener,k="https://"+e,A=l.documentElement||{},q="language",$="Height",j="scroll",D=w.userAgentData,C=j+$,H="offset"+$,R="client"+$,P="pagehide",T="platform",U="platformVersion",I="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),N=d.screen,z=l.currentScript||l.querySelector('script[src*="'+e+'"]');m=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){m("Error in your "+t+" function:",e)},W=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},G=function(t){return"string"==typeof t},J=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},L=function(t,e){return t&&t.getAttribute("data-"+e)},Y=function(t){return Array.isArray(t)?t:G(t)&&t.length?t.split(/, ?/):[]},Z=function(t){return t&&t.constructor===Object},K=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},it=function(t){return"function"==typeof t},ot="namespace",ct=t[ot]||L(z,ot)||"sa",st=function(t,e){var n=d[ct+"_metadata"];Z(n)&&(t=K(t,n));var r=d[kt];if(!it(r))return kt&&m(kt+" not found, set window."+kt),t;try{return K(t,r.call(d,K(t,e)))}catch(a){F("metadata",a)}},ut=t.strictUtm||L(z,"strict-utm")==r,lt=function(i,t){tt=!i&&nt("p")?"":y;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");tt!==y&&0"); //# sourceMappingURL=latest.js.map \ No newline at end of file diff --git a/dist/latest/custom/latest.js.map b/dist/latest/custom/latest.js.map index 5113f1bc..22d0b988 100644 --- a/dist/latest/custom/latest.js.map +++ b/dist/latest/custom/latest.js.map @@ -1 +1 @@ -{"version":3,"file":"latest.source.js","sources":["latest.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n return (\n (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex).test(keyValue);\n })\n .join(\"&\") || undefinedVar\n );\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n query,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query || getQueryParams(deleteSourceInfo),\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch ? getQueryParams(delSrc, querySearch) : undefinedVar,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_latest_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","search","keyValue","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","indexOf","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","protocol","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","i","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","query","currentPage","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue","q"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"latest.source.js","sources":["latest.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var p;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n p = !ignoreSource && collectMetricByString(\"p\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (p !== falseVar && i > 0 && keyValue.slice(i + 1))\n p += (p ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n p = p || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n p: p,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_latest_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","p","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","protocol","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue"],"mappings":"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"} \ No newline at end of file diff --git a/dist/latest/custom/light.js b/dist/latest/custom/light.js index 80b6f837..dc2204b7 100644 --- a/dist/latest/custom/light.js +++ b/dist/latest/custom/light.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2025-06-24; 971c; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-08-12; 1b6a; v12) */ -!function(l,e,t,f){try{var m=undefined,n="https:",r=l.console,a="doNotTrack",g=l.navigator,i=l.location,h=i.host,o=l.document,c=g.userAgent,s="Not sending request ",v=!1,u=encodeURIComponent,p=decodeURIComponent,d=JSON.stringify,y=l.addEventListener,_="https://"+t,b=(o.documentElement,"language"),w=g.userAgentData,O="platform",S="platformVersion",j="https://docs.simpleanalytics.com",k=/(bot|spider|crawl)/i.test(c)&&!/(cubot)/i.test(c),x=o.currentScript||o.querySelector('script[src*="'+t+'"]');f=function(){var e=[].slice.call(arguments);return e.unshift("Simple Analytics:"),Function.prototype.apply.call(r.warn,r,e)};var E=function(e){return"string"==typeof e},A=function(e,t){return e&&e.getAttribute("data-"+t)},$=function(){for(var e,t,n,r={},a=arguments,i=0;i>e/4).toString(16)})}catch(r){return e.replace(n,function(e){var t=16*Math.random()|0;return(e<2?t:3&t|8).toString(16)})}},N=function(e){return"function"==typeof e},R="namespace",U=e[R]||A(x,R)||"sa",V=e.strictUtm||"true"==A(x,"strict-utm"),B=function(t,e){return(e||i.search).slice(1).split("&").filter(function(e){return!t&&new RegExp("^((utm_)"+(V?"":"?")+"(source|medium|content|term|campaign)"+(V?"":"|ref")+")=").test(e)}).join("&")||m},C=U+"_loaded";if(1==l[C])return f(s+"twice");l.sa_event_loaded=!0,l[C]=!0;var H,T=function(t,e,n){t=n?t:$(L,P,t),g.brave&&!n&&(t.brave=!0),g._duckduckgoloader_&&!n&&(t.duck=!0),(new Image).src=_+"/simple.gif?"+Object.keys(t).filter(function(e){return t[e]!=m}).map(function(e){return u(e)+"="+u(t[e])}).join("&")+"&time="+Date.now()},F=e.hostname||A(x,"hostname"),z=F||h,J={version:"custom_light_12",hostname:z};e.mode||A(x,"mode");try{H=Intl.DateTimeFormat().resolvedOptions().timeZone}catch(X){f(X)}k&&(J.bot=!0);var L=$(J,{ua:c,https:i.protocol==n,timezone:H,page_id:I(),session_id:I()});if(L.sri=!1,w&&(L.mobile=w.mobile,L.brands=d(w.brands)),z!==h&&(L.hostname_original=h),a in g&&"1"==g[a])return f("Not sending request when "+a+" is enabled. See "+j+"/dnt");-1!=h.indexOf(".")&&!/^[0-9.:]+$/.test(h)||F||f("Set hostname on "+h+". See "+j+"/overwrite-domain-name");var M,P={},Z=(e.referrer||A(x,"referrer")||o.referrer||"").replace(h,z).replace(/^https?:\/\/((m|l|w{2,3}([0-9]+)?)\.)?([^?#]+)(.*)$/,"$4").replace(/^([^/]+)$/,"$1")||m,G=function(e,t){var n=$(J,{type:"append",original_id:t?e:L.page_id});if(t||!g.sendBeacon)T(n,0,!0);else try{g.sendBeacon.bind(g)(_+"/append",d(n))}catch(r){T(n,0,!0)}};y("pagehide",G,!1);var K,Q,W=function(e){var t="";try{t=e||p(i.pathname)}catch(X){f(X)}return t};!function(t,e,n,r){!r&&N(n)&&(r=n);var a,i;N(r);E(e)&&-1"); +!function(l,e,t,f){try{var u=undefined,n="https:",r=l.console,i="doNotTrack",m=l.navigator,p=l.location,g=p.host,a=l.document,o=m.userAgent,c="Not sending request ",h=!1,s=encodeURIComponent,d=decodeURIComponent,v=JSON.stringify,y=l.addEventListener,_="https://"+t,b=(a.documentElement,"language"),w=m.userAgentData,O="platform",S="platformVersion",j="https://docs.simpleanalytics.com",k=/(bot|spider|crawl)/i.test(o)&&!/(cubot)/i.test(o),x=a.currentScript||a.querySelector('script[src*="'+t+'"]');f=function(){var e=[].slice.call(arguments);return e.unshift("Simple Analytics:"),Function.prototype.apply.call(r.warn,r,e)};var E=function(e){return"string"==typeof e},A=function(e,t){return e&&e.getAttribute("data-"+t)},$=function(){for(var e,t,n,r={},i=arguments,a=0;a>e/4).toString(16)})}catch(r){return e.replace(n,function(e){var t=16*Math.random()|0;return(e<2?t:3&t|8).toString(16)})}},N=function(e){return"function"==typeof e},R="namespace",U=e[R]||A(x,R)||"sa",V=e.strictUtm||"true"==A(x,"strict-utm"),B=U+"_loaded";if(1==l[B])return f(c+"twice");l.sa_event_loaded=!0,l[B]=!0;var C,H=function(t,e,n){t=n?t:$(J,M,t),m.brave&&!n&&(t.brave=!0),m._duckduckgoloader_&&!n&&(t.duck=!0),(new Image).src=_+"/simple.gif?"+Object.keys(t).filter(function(e){return t[e]!=u}).map(function(e){return s(e)+"="+s(t[e])}).join("&")+"&time="+Date.now()},T=e.hostname||A(x,"hostname"),F=T||g,z={version:"custom_light_12",hostname:F};e.mode||A(x,"mode");try{C=Intl.DateTimeFormat().resolvedOptions().timeZone}catch(X){f(X)}k&&(z.bot=!0);var J=$(z,{ua:o,https:p.protocol==n,timezone:C,page_id:I(),session_id:I()});if(J.sri=!1,w&&(J.mobile=w.mobile,J.brands=v(w.brands)),F!==g&&(J.hostname_original=g),i in m&&"1"==m[i])return f("Not sending request when "+i+" is enabled. See "+j+"/dnt");-1!=g.indexOf(".")&&!/^[0-9.:]+$/.test(g)||T||f("Set hostname on "+g+". See "+j+"/overwrite-domain-name");var L,M={},P=(e.referrer||A(x,"referrer")||a.referrer||"").replace(g,F).replace(/^https?:\/\/((m|l|w{2,3}([0-9]+)?)\.)?([^?#]+)(.*)$/,"$4").replace(/^([^/]+)$/,"$1")||u,Z=function(e,t){var n=$(z,{type:"append",original_id:t?e:J.page_id});if(t||!m.sendBeacon)H(n,0,!0);else try{m.sendBeacon.bind(m)(_+"/append",v(n))}catch(r){H(n,0,!0)}};y("pagehide",Z,!1);var G,K,Q=function(e){var t="";try{t=e||d(p.pathname)}catch(X){f(X)}return t},W=function(e,t,n,r,i,a){e&&Z(""+J.page_id,!0),J.page_id=I();var o,c=F+Q(),s=(o=t,(r||p.search).slice(1).split("&").filter(function(e){return!o&&new RegExp("^((utm_)"+(V?"":"?")+"(source|medium|content|term|campaign)"+(V?"":"|ref")+")=","i").test(e)}).join("&")||u);H({id:J.page_id,type:"pageview",referrer:!t||n?P:null,query:s}),P=c,0};!function(e,t,n,r){!r&&N(n)&&(r=n);var i,a;N(r);E(t)&&-1"); //# sourceMappingURL=light.js.map \ No newline at end of file diff --git a/dist/latest/custom/light.js.map b/dist/latest/custom/light.js.map index 825c7d38..a65fce3e 100644 --- a/dist/latest/custom/light.js.map +++ b/dist/latest/custom/light.js.map @@ -1 +1 @@ -{"version":3,"file":"light.source.js","sources":["light.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n\n var collectMetricByString = function (metricAbbreviation) {\n // eslint-disable-next-line no-unreachable\n return true;\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n return (\n (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n if (ignore) return falseVar;\n // eslint-disable-next-line no-redeclare\n var regex =\n \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \")=\";\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex).test(keyValue);\n })\n .join(\"&\") || undefinedVar\n );\n };\n\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n\n\n\n\n\n\n\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n // eslint-disable-next-line no-redeclare\n var bot = isBotAgent;\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n\n\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n query,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query || getQueryParams(deleteSourceInfo),\n\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n sameSite = referrer\n ? referrer.split(slash)[0] == locationHostname\n : falseVar;\n\n\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch ? getQueryParams(delSrc, querySearch) : undefinedVar,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n\n\n pageview();\n\n } catch (e) {\n warn(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_light_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","warn","undefinedVar","undefined","https","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","language","documentElement","uaData","userAgentData","platformText","platformVersionText","docsUrl","isBotAgent","test","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","isString","string","attr","attribute","getAttribute","assign","obj","prop","object","to","arg","index","length","nextSource","constructor","Object","nextKey","hasOwnProperty","settings","sa_settings","logSettings","keys","Date","now","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","replace","c","getRandomValues","Uint8Array","toString","error","r","Math","random","isFunction","func","namespaceText","namespace","strictUtm","getQueryParams","ignoreSource","overwriteSearch","search","split","filter","keyValue","RegExp","join","loadedVariable","sa_event_loaded","timezone","sendData","data","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","Image","src","key","map","overwrittenHostname","hostname","definedHostname","basePayload","version","mode","Intl","DateTimeFormat","resolvedOptions","timeZone","bot","ua","protocol","page_id","session_id","sri","mobile","brands","hostname_original","indexOf","lastSendPath","referrer","sendOnLeave","id","push","append","type","original_id","sendBeacon","bind","e","sameSite","userNavigated","getPath","overwrite","path","pathname","isPushState","pathOverwrite","metadata","callbackRaw","querySearch","parts","shift","performaceEntryType","perf","performance","navigationText","getEntriesByType","triggerSendPageView","delSrc","deleteSourceInfo","query","currentPage","pages","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","pageview"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"light.source.js","sources":["light.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n\n var collectMetricByString = function (metricAbbreviation) {\n // eslint-disable-next-line no-unreachable\n return true;\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n if (ignore) return falseVar;\n // eslint-disable-next-line no-redeclare\n var regex =\n \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \")=\";\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n return q || undefinedVar;\n };\n\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n\n\n\n\n\n\n\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n // eslint-disable-next-line no-redeclare\n var bot = isBotAgent;\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n\n\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n sameSite = referrer\n ? referrer.split(slash)[0] == locationHostname\n : falseVar;\n\n\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n\n\n pageview();\n\n } catch (e) {\n warn(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_light_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","warn","undefinedVar","undefined","https","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","language","documentElement","uaData","userAgentData","platformText","platformVersionText","docsUrl","isBotAgent","test","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","isString","string","attr","attribute","getAttribute","assign","obj","prop","object","to","arg","index","length","nextSource","constructor","Object","nextKey","hasOwnProperty","settings","sa_settings","logSettings","keys","Date","now","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","replace","c","getRandomValues","Uint8Array","toString","error","r","Math","random","isFunction","func","namespaceText","namespace","strictUtm","loadedVariable","sa_event_loaded","timezone","sendData","data","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","Image","src","filter","key","map","join","overwrittenHostname","hostname","definedHostname","basePayload","version","mode","Intl","DateTimeFormat","resolvedOptions","timeZone","bot","ua","protocol","page_id","session_id","sri","mobile","brands","hostname_original","indexOf","lastSendPath","referrer","sendOnLeave","id","push","append","type","original_id","sendBeacon","bind","e","sameSite","userNavigated","getPath","overwrite","path","pathname","sendPageView","isPushState","deleteSourceInfo","search","metadata","ignoreSource","currentPage","query","split","keyValue","RegExp","pages","pathOverwrite","callbackRaw","querySearch","parts","shift","performaceEntryType","perf","performance","navigationText","getEntriesByType","triggerSendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","pageview"],"mappings":"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"} \ No newline at end of file diff --git a/dist/latest/custom/proxy.js b/dist/latest/custom/proxy.js index 2f733240..9666e407 100644 --- a/dist/latest/custom/proxy.js +++ b/dist/latest/custom/proxy.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2025-06-24; 1d2a; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-08-12; 899d; v12) */ -!function(d,t,e,n,m){try{var g=undefined,v=!0,y=!1,r="true",a="https:",_="pageview",u="event",i="error",o=d.console,c="doNotTrack",w=d.navigator,s=d.location,b=s.host,l=d.document,p=w.userAgent,f="Not sending request ",h=f+"when ",x=y,O=encodeURIComponent,E=decodeURIComponent,S=JSON.stringify,M=d.addEventListener,k="https://"+e,A=l.documentElement||{},q="language",$="Height",j="scroll",D=w.userAgentData,C=j+$,H="offset"+$,P="client"+$,R="pagehide",T="platform",U="platformVersion",I="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),N=d.screen,z=l.currentScript||l.querySelector('script[src*="'+e+'"]');m=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){m("Error in your "+t+" function:",e)},W=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},G=function(t){return"string"==typeof t},J=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},L=function(t,e){return t&&t.getAttribute("data-"+e)},Y=function(t){return Array.isArray(t)?t:G(t)&&t.length?t.split(/, ?/):[]},Z=function(t){return t&&t.constructor===Object},K=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},at=function(t){return"function"==typeof t},it="namespace",ot=t[it]||L(z,it)||"sa",ct=function(t,e){var n=d[ot+"_metadata"];Z(n)&&(t=K(t,n));var r=d[Mt];if(!at(r))return Mt&&m(Mt+" not found, set window."+Mt),t;try{return K(t,r.call(d,K(t,e)))}catch(a){F("metadata",a)}},st=t.strictUtm||L(z,"strict-utm")==r,ut=function(a,t){return(t||s.search).slice(1).split("&").filter(function(t){var e=a||!et("ut"),n=Ot.map(J).join("|"),r=e?"^("+n+")=":"^((utm_)"+(st?"":"?")+"(source|medium|content|term|campaign)"+(st?"":"|ref")+"|"+n+")=";return e&&!Ot.length?y:new RegExp(r).test(t)}).join("&")||g},lt=ot+"_loaded";if(d[lt]==v)return m(f+"twice");d.sa_event_loaded=v,d[lt]=v;var pt=function(e,t,n){e=n?e:K($t,Ct,e),w.brave&&!n&&(e.brave=v),w._duckduckgoloader_&&!n&&(e.duck=v);var r=new Image;t&&(r.onerror=t,r.onload=t),r.src=k+"/simple.gif?"+Object.keys(e).filter(function(t){return e[t]!=g}).map(function(t){return O(t)+"="+O(e[t])}).join("&")+"&time="+Date.now()},ft=t.hostname||L(z,"hostname"),ht=ft||b,dt={version:"custom_proxy_12",hostname:ht};n=function(t){t=t.stack?t+" "+t.stack:t,m(t),pt(K(dt,{type:i,error:t,path:s.pathname}),g,v)},M(i,function(t){t.filename&&-1"); +!function(d,t,e,n,m){try{var v=undefined,g=!0,y=!1,r="true",a="https:",_="pageview",u="event",i="error",o=d.console,c="doNotTrack",w=d.navigator,s=d.location,b=s.host,l=d.document,p=w.userAgent,f="Not sending request ",h=f+"when ",x=y,O=encodeURIComponent,E=decodeURIComponent,S=JSON.stringify,M=d.addEventListener,k="https://"+e,A=l.documentElement||{},q="language",$="Height",j="scroll",D=w.userAgentData,C=j+$,H="offset"+$,P="client"+$,R="pagehide",T="platform",U="platformVersion",I="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),N=d.screen,z=l.currentScript||l.querySelector('script[src*="'+e+'"]');m=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){m("Error in your "+t+" function:",e)},W=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},G=function(t){return"string"==typeof t},J=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},L=function(t,e){return t&&t.getAttribute("data-"+e)},Y=function(t){return Array.isArray(t)?t:G(t)&&t.length?t.split(/, ?/):[]},Z=function(t){return t&&t.constructor===Object},K=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},it=function(t){return"function"==typeof t},ot="namespace",ct=t[ot]||L(z,ot)||"sa",st=function(t,e){var n=d[ct+"_metadata"];Z(n)&&(t=K(t,n));var r=d[kt];if(!it(r))return kt&&m(kt+" not found, set window."+kt),t;try{return K(t,r.call(d,K(t,e)))}catch(a){F("metadata",a)}},ut=t.strictUtm||L(z,"strict-utm")==r,lt=function(i,t){tt=!i&&nt("p")?"":y;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");tt!==y&&0"); //# sourceMappingURL=proxy.js.map \ No newline at end of file diff --git a/dist/latest/custom/proxy.js.map b/dist/latest/custom/proxy.js.map index 7554d2cd..a6e8ec6a 100644 --- a/dist/latest/custom/proxy.js.map +++ b/dist/latest/custom/proxy.js.map @@ -1 +1 @@ -{"version":3,"file":"proxy.source.js","sources":["proxy.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n return (\n (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex).test(keyValue);\n })\n .join(\"&\") || undefinedVar\n );\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n query,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query || getQueryParams(deleteSourceInfo),\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch ? getQueryParams(delSrc, querySearch) : undefinedVar,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_proxy_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","search","keyValue","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","indexOf","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","protocol","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","i","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","query","currentPage","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue","q"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"proxy.source.js","sources":["proxy.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var p;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n p = !ignoreSource && collectMetricByString(\"p\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (p !== falseVar && i > 0 && keyValue.slice(i + 1))\n p += (p ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n p = p || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n p: p,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_proxy_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","p","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","protocol","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue"],"mappings":"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"} \ No newline at end of file diff --git a/dist/latest/hello.js b/dist/latest/hello.js index 8bfecfe4..3eca7358 100644 --- a/dist/latest/hello.js +++ b/dist/latest/hello.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2025-06-24; 69f5) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-08-12; 986f) */ -!function(d,t,e,n,m){try{var v=undefined,g=!0,y=!1,r="true",a="https:",_="pageview",u="event",i="error",o=d.console,c="doNotTrack",w=d.navigator,s=d.location,b=s.host,l=d.document,p=w.userAgent,f="Not sending request ",h=f+"when ",O=y,E=encodeURIComponent,x=decodeURIComponent,S=JSON.stringify,M=d.addEventListener,k="https://queue."+e,q=l.documentElement||{},A="language",$="Height",j="scroll",D=w.userAgentData,C=j+$,R="offset"+$,H="client"+$,P="pagehide",T="platform",U="platformVersion",I="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),N=d.screen,z=l.currentScript||l.querySelector('script[src*="'+e+'"]');m=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){m("Error in your "+t+" function:",e)},W=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},G=function(t){return"string"==typeof t},J=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},L=function(t,e){return t&&t.getAttribute("data-"+e)},Y=function(t){return Array.isArray(t)?t:G(t)&&t.length?t.split(/, ?/):[]},Z=function(t){return t&&t.constructor===Object},K=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},at=function(t){return"function"==typeof t},it="namespace",ot=t[it]||L(z,it)||"sa",ct=function(t,e){var n=d[ot+"_metadata"];Z(n)&&(t=K(t,n));var r=d[Mt];if(!at(r))return Mt&&m(Mt+" not found, set window."+Mt),t;try{return K(t,r.call(d,K(t,e)))}catch(a){F("metadata",a)}},st=t.strictUtm||L(z,"strict-utm")==r,ut=function(a,t){return(t||s.search).slice(1).split("&").filter(function(t){var e=a||!et("ut"),n=Et.map(J).join("|"),r=e?"^("+n+")=":"^((utm_)"+(st?"":"?")+"(source|medium|content|term|campaign)"+(st?"":"|ref")+"|"+n+")=";return e&&!Et.length?y:new RegExp(r).test(t)}).join("&")||v},lt=ot+"_loaded";if(d[lt]==g)return m(f+"twice");d.sa_event_loaded=g,d[lt]=g;var pt=function(e,t,n){e=n?e:K($t,Ct,e),w.brave&&!n&&(e.brave=g),w._duckduckgoloader_&&!n&&(e.duck=g);var r=new Image;t&&(r.onerror=t,r.onload=t),r.src=k+"/simple.gif?"+Object.keys(e).filter(function(t){return e[t]!=v}).map(function(t){return E(t)+"="+E(e[t])}).join("&")+"&time="+Date.now()},ft=t.hostname||L(z,"hostname"),ht=ft||b,dt={version:"cdn_hello_12",hostname:ht};n=function(t){t=t.stack?t+" "+t.stack:t,m(t),pt(K(dt,{type:i,error:t,path:s.pathname}),v,g)},M(i,function(t){t.filename&&-1>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},it=function(t){return"function"==typeof t},ot="namespace",ct=t[ot]||L(z,ot)||"sa",st=function(t,e){var n=d[ct+"_metadata"];Z(n)&&(t=K(t,n));var r=d[kt];if(!it(r))return kt&&m(kt+" not found, set window."+kt),t;try{return K(t,r.call(d,K(t,e)))}catch(a){F("metadata",a)}},ut=t.strictUtm||L(z,"strict-utm")==r,lt=function(i,t){tt=!i&&nt("p")?"":y;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");tt!==y&&0> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n return (\n (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex).test(keyValue);\n })\n .join(\"&\") || undefinedVar\n );\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n query,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query || getQueryParams(deleteSourceInfo),\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch ? getQueryParams(delSrc, querySearch) : undefinedVar,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"simpleanalyticscdn.com\",\n \"queue.\",\n \"cdn_hello_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","protocol","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","search","keyValue","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","indexOf","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","i","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","query","currentPage","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue","q"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"hello.source.js","sources":["hello.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var p;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n p = !ignoreSource && collectMetricByString(\"p\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (p !== falseVar && i > 0 && keyValue.slice(i + 1))\n p += (p ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n p = p || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n p: p,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"simpleanalyticscdn.com\",\n \"queue.\",\n \"cdn_hello_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","protocol","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","p","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue"],"mappings":";;CAEA,SACEA,EACAC,EACAC,EAIAC,EACAC,GAEA,IAQE,IAAIC,EAAeC,UACfC,GAAU,EACVC,GAAW,EACXC,EAAW,OACXC,EAAQ,SACRC,EAAe,WACfC,EAAY,QACZC,EAAY,QAGZC,EAAMd,EAAOe,QACbC,EAAa,aACbC,EAAMjB,EAAOkB,UACbC,EAAMnB,EAAOoB,SACbC,EAAmBF,EAAIG,KACvBC,EAAMvB,EAAOwB,SACbC,EAAYR,EAAIQ,UAChBC,EAAa,uBACbC,EAAiBD,EAAa,QAC9BE,EAA2BpB,EAC3BqB,EAAyBC,mBACzBC,EAAyBC,mBACzBC,EAAYC,KAAKD,UAEjBE,EAAuBnC,EAAOoC,iBAC9BC,EAAaC,iBAA0BpC,EACvCqC,EAAkBhB,EAAIgB,iBAAmB,GACzCC,EAAW,WACXC,EAAS,SAETC,EAAS,SACTC,EAAS1B,EAAI2B,cACbC,EAAeH,EAASD,EACxBK,EAAe,SAAWL,EAC1BM,EAAe,SAAWN,EAE1BO,EAAW,WACXC,EAAe,WACfC,EAAsB,kBACtBC,EAAU,mCACVC,EAAQ,EACRC,EACF,sBAAsBC,KAAK7B,KAAe,WAAW6B,KAAK7B,GACxD8B,EAASvD,EAAOuD,OAIhBC,EACFjC,EAAIkC,eAAiBlC,EAAImC,cAAc,gBAAkBxD,EAAU,MAOrEE,EAAO,WAEL,IAAIuD,EAAO,GAAGC,MAAMC,KAAKC,WAOzB,OAJAH,EAAKI,QAAQ,qBAINC,SAASC,UAAUC,MAAML,KAAK/C,EAAIV,KAAMU,EAAK6C,IAGtD,IAAIQ,EAAiB,SAAUC,EAAMC,GACnCjE,EAAK,iBAAmBgE,EAAO,aAAcC,IAG3CC,EAAU,SAAUC,EAAKC,GAC3B,OAAOC,OAAOR,UAAUS,eAAeb,KAAKU,EAAKC,IAG/CG,EAAW,SAAUC,GACvB,MAAwB,iBAAVA,GAGZC,EAAc,SAAUC,GAC1B,OAAOA,EAAKC,QAAQ,sBAAuB,SAGzCC,EAAO,SAAUxB,EAAeyB,GAClC,OAAOzB,GAAiBA,EAAc0B,aAAa,QAAUD,IAG3DE,EAA+B,SAAUC,GAC3C,OAAOC,MAAMC,QAAQF,GACjBA,EACAT,EAASS,IAAQA,EAAIG,OACnBH,EAAII,MAAM,OACV,IAGJC,EAAW,SAAUC,GACvB,OAAOA,GAAUA,EAAOC,cAAgBlB,QAGtCmB,EAAS,WAGX,IAFA,IAAIC,EAAK,GACLC,EAAMhC,UACDiC,EAAQ,EAAGA,EAAQD,EAAIP,OAAQQ,IAAS,CAC/C,IAAIC,EAAaF,EAAIC,GACrB,GAAIN,EAASO,GACX,IAAK,IAAIC,KAAWD,EACd1B,EAAQ0B,EAAYC,KACtBJ,EAAGI,GAAWD,EAAWC,IAKjC,OAAOJ,GAGLK,EAAWlG,EAAOmG,YAClBC,EAAcF,GAAYzB,OAAO4B,KAAKpG,GAAkBsF,OAG5DtF,EAAmB2F,EAAO3F,EAAkBiG,GAExCE,GAAahG,EAAK,WAAYH,GAGlC,IA+EIqG,GA/EAC,GAAgBpB,EAClBlF,EAAiBsG,eAAiBvB,EAAKxB,EAAe,mBAGpDgD,GAAwB,SAAUC,GAEpC,OAGgB,IAFdF,GAAcG,OAAO,SAAU5B,GAC7B,OAAO,IAAI6B,OAAO,IAAMF,GAAoBnD,KAAKwB,KAChDS,QAIHqB,GAAMC,KAAKD,IAEXE,GAAO,WACT,IAAIC,EAAe/G,EAAOgH,QAAUhH,EAAOiH,SACvCC,EAAY,CAAC,MAAQ,KAAO,KAAO,KAAO,KAC1CC,EAAY,SAEhB,IACE,OAAOD,EAAUnC,QAAQoC,EAAW,SAAUC,GAC5C,OACEA,EACCL,EAAaM,gBAAgB,IAAIC,WAAW,IAAI,GAC9C,IAAOF,EAAI,GACdG,SAAS,MAEb,MAAOlD,GACP,OAAO6C,EAAUnC,QAAQoC,EAAW,SAAUC,GAC5C,IAAII,EAAqB,GAAhBC,KAAKC,SAAiB,EAE/B,OADMN,EAAI,EAAII,EAAS,EAAJA,EAAW,GACrBD,SAAS,QAKpBI,GAAa,SAAUC,GACzB,MAAsB,mBAARA,GAIZC,GAAgB,YAChBC,GACF7H,EAAiB4H,KACjB7C,EAAKxB,EAAeqE,KAiyBxB,KA9xBME,GAAiB,SAAUC,EAAUC,GACvC,IAAIC,EAAiBlI,EAAO8H,GAAY,aACpCrC,EAASyC,KAAiBF,EAAWpC,EAAOoC,EAAUE,IAC1D,IAAIC,EAA4BnI,EAAOoI,IACvC,IAAKT,GAAWQ,GAKd,OAJIC,IACFhI,EACEgI,GAAoB,0BAA4BA,IAE7CJ,EAET,IACE,OAAOpC,EACLoC,EACAG,EAA0BtE,KAAK7D,EAAQ4F,EAAOoC,EAAUC,KAE1D,MAAO5D,GACPF,EAAe,WAAYE,KAU3BgE,GACFpI,EAAiBoI,WACjBrD,EAAKxB,EAAe,eAAiB/C,EAInC6H,GAAiB,SAAUC,EAAcC,GAC3ClC,IAAKiC,GAAgB/B,GAAsB,KAAO,GAAKhG,EACvD,IAAIiI,GAAKD,GAAmBrH,EAAIuH,QAC7B9E,MAAM,GACN4B,MAAM,KACNkB,OAAO,SAAUiC,GAChB,IAAIC,EAAID,EAASE,QAAQ,KACrBvC,KAAM9F,GAAgB,EAAJoI,GAASD,EAAS/E,MAAMgF,EAAI,KAChDtC,KAAMA,GAAI,IAAM,IAAMqC,EAAS/E,MAAM,EAAGgF,IAE1C,IAAIE,EAASP,IAAiB/B,GAAsB,MAEhDuC,EAAkBC,GAAYC,IAAIpE,GAAaqE,KAAK,KACpDC,EAAQL,EACR,KAAOC,EAAkB,KACzB,YACCV,GAAY,GAAK,KAClB,yCACCA,GAAY,GAAK,QAClB,IACAU,EACA,KACJ,OAAID,IAAWE,GAAYzD,OAAe/E,EAInC,IAAImG,OAAOwC,EAAO,KAAK7F,KAAKqF,KAEpCO,KAAK,KAGR,OADA5C,GAAIA,IAAKjG,EACFoI,GAAKpI,GA+BV+I,GAAiBtB,GAAY,UACjC,GAAI9H,EAAOoJ,KAAmB7I,EAAS,OAAOH,EAAKsB,EAAa,SAChE1B,EAAOqJ,gBAAkB9I,EACzBP,EAAOoJ,IAAkB7I,EAOzB,IAAI+I,GAAW,SAAUrB,EAAMsB,EAAUC,GACvCvB,EAAOuB,EAAevB,EAAOrC,EAAO6D,GAASC,GAAMzB,GAE/ChH,EAAI0I,QAAUH,IAAcvB,EAAK0B,MAAQpJ,GACzCU,EAAI2I,qBAAuBJ,IAAcvB,EAAK4B,KAAOtJ,GAGzD,IAAIuJ,EAAQ,IAAIC,MACZR,IACFO,EAAME,QAAUT,EAChBO,EAAMG,OAASV,GAEjBO,EAAMI,IACJ7H,EACA,eACAoC,OAAO4B,KAAK4B,GACTvB,OAAO,SAAUyD,GAChB,OAAOlC,EAAKkC,IAAQ9J,IAErB4I,IAAI,SAAUkB,GACb,OACEtI,EAAuBsI,GACvB,IACAtI,EAAuBoG,EAAKkC,MAG/BjB,KAAK,KACR,SACArC,KAAKD,OAILwD,GACFnK,EAAiBoK,UAAYrF,EAAKxB,EAAe,YAC/C8G,GAAkBF,IAAuB/I,EAEzCkJ,GAAc,CAChBC,QA+oBJ,eA9oBIH,SAAUC,IASZnK,EAAY,SAAUsK,GACpBA,EAAiBA,EAAeC,MAC5BD,EAAiB,IAAMA,EAAeC,MACtCD,EACJrK,EAAKqK,GACLnB,GACE1D,EAAO2E,GAAa,CAClBI,KAAM9J,EACNwD,MAAOoG,EACPG,KAAMzJ,EAAI0J,WAEZxK,EACAE,IAMJ4B,EACEtB,EACA,SAAUiK,GACJA,EAAMC,WAA+C,EAAnCD,EAAMC,SAASlC,QAAQ3I,IAC3CC,EAAU2K,EAAME,UAGpBxK,GAOF,IAwDIyK,GAxDAC,GAAQtE,KAERuE,GAAW,EAOXC,GAAOnL,EAAiBmL,MAAQpG,EAAKxB,EAAe,QAGpD6H,MA/KsBC,GA+KCrL,EAAiBoL,cA9KvBC,GA+KjBrL,EAAiBoL,WACjBrG,EAAKxB,EAAe,eAAiB/C,GACrCuE,EAAKxB,EAAe,aAAe/C,GACnCuE,EAAKxB,EAAe,gBAAkB/C,EAGtC8K,KACqC,SAAvCvG,EAAKxB,EAAe,iBACpBvD,EAAiBsL,cAAgB/K,GAI/BgL,GACFvL,EAAiBwL,UACjBzG,EAAKxB,EAAe,cACpBsE,GAAY,IAAMlH,EAGhB8K,GAAcvG,EAChBlF,EAAiByL,aAAe1G,EAAKxB,EAAe,iBAIlDwF,GAAc7D,EAChBlF,EAAiB+I,aAAehE,EAAKxB,EAAe,iBAIlDmI,GAAqBxG,EACvBlF,EAAiB0L,oBACf3G,EAAKxB,EAAe,yBAIpBoI,GACF3L,EAAiB2L,gBAAkB5G,EAAKxB,EAAe,mBAGrD4E,GACFnI,EAAiBmI,mBACjBpD,EAAKxB,EAAe,sBAItB,IAEEyH,GAAWzE,GAAsB,KAC7BqF,KAAKC,iBAAiBC,kBAAkBC,SACxC3L,EACJ,MAAOgE,IACPjE,EAAKiE,IAOP,IAAI4H,GAAUjM,EAAOiM,QACjBC,GACFjL,EAAIkL,WACJnM,EAAOoM,aACPpM,EAAOqM,aACPrM,EAAOsM,UACNL,KAAYA,GAAQM,QACrBvM,EAAOwM,YACPxM,EAAOyM,MACPpJ,GACAoE,KAAKC,UAAYD,KAAKC,SAGpBgF,GACFlG,GAAsB,MAAQA,GAAsB,QAElD0F,KAAK3B,GAAY2B,IAAM3L,GAE3B,IAAIkJ,GAAU7D,EAAO2E,GAAa,CAEhCoC,GAAInG,GAAsB,MAAQ/E,EAAYpB,EAE9CK,MAAOS,EAAImB,UAAY5B,EACvBuK,SAAUA,GACV2B,QAASF,GAAqB5F,KAASzG,EAGvCwM,WAAYrG,GAAsB,MAAQM,KAASzG,IA0BrD,GAvBAoJ,GAAQqD,IAAMtM,EAIVmC,IACF8G,GAAQsD,OAASpK,EAAOoK,OACxBtD,GAAQuD,OAAS/K,EAAUU,EAAOqK,SAS/BzL,EAAI0L,SAAS7M,EAAK,4CAInBkK,KAAoBjJ,IACtBoI,GAAQyD,kBAAoB7L,IAGzBgK,IAAcrK,KAAcC,GAA0B,KAAnBA,EAAID,GAC1C,OAAOZ,EACLuB,EAAiBX,EAAa,oBAAsBmC,EAAU,SAK7B,GAAlC9B,EAAiBwH,QAAQ,OACxB,aAAavF,KAAKjC,IACnB+I,IAEDhK,EACE,mBACEiB,EACA,SACA8B,EACA,0BAON,IACIgK,GA0DAC,GA3DA1D,GAAO,GAGP2D,GAAc,WAKhB,OAFEpN,EAAiBqN,UAAYtI,EAAKxB,EAAe,aAGzBjC,EAAI+L,UAAY,IACrCvI,QAAQ1D,EAAkBiJ,IAC1BvF,QAAQ,sDAAuD,MAC/DA,QAAQ,YAAa,OAAS1E,GAKjCiN,GAAWD,KAOXE,GAAW,EAEXC,GAAc,SAAUC,EAAIC,GAC9B,GAAKhB,GAAL,CAEA,IAAIiB,EAAS/H,EAAO2E,GAAa,CAC/BI,KAAM,SACNiD,YAAaF,EAAOD,EAAKhE,GAAQmD,UAenC,GAXIpG,GAAsB,OACxBmH,EAAOE,SAAWpG,KAAKqG,OAAOlH,KAAQsE,GAAQqC,IAngBnC,MAqgBbA,GAAW,EACXrC,GAAQtE,KAGJJ,GAAsB,UACxBmH,EAAOxC,SAAW1D,KAAKsG,IAAI,EAAG5C,GAAU6C,OAGtCN,IAASzM,EAAIgN,WAEf3E,GAASqE,EAAQtN,EAAcE,QAE/B,IACEU,EAAIgN,WAAWC,KAAKjN,EAApBA,CAAyBoB,EAAa,UAAWJ,EAAU0L,IAC3D,MAAOQ,GAEP7E,GAASqE,EAAQtN,EAAcE,MAMrC4B,EACE,mBACA,WACMZ,EAAI6M,QACA,KAAOpL,KAAYhD,GAASwN,KAClCJ,GAAcxG,MACT2G,IAAY3G,KAAQwG,IAE7B5M,GAGF2B,EAAqBa,EAAUwK,GAAahN,GAE5C,IAAI6N,GAAO9M,EAAI8M,MAAQ,GACnBL,GAAW,WACb,IACE,IAAIM,EAAuB/L,EAAgBQ,IAAiB,EACxDwL,EAAS9G,KAAKsG,IAChBM,GAAKxL,IAAiB,EACtBwL,GAAKvL,IAAiB,EACtBP,EAAgBQ,IAAiB,EACjCR,EAAgBM,IAAiB,EACjCN,EAAgBO,IAAiB,GAEnC,OAAO2E,KAAK+G,IACV,IAKI,EAJJ/G,KAAKqG,MACF,MAAQvL,EAAgBkM,WAAa,GAAKH,GACzCC,EACA,IAGN,MAAOlK,IAEP,OADAjE,EAAKiE,IACE,IAIXlC,EAAqB,OAAQ,WAC3BgJ,GAAW6C,KACX7L,EACEO,EACA,WACMyI,GAAW6C,OAAY7C,GAAW6C,OAExCxN,KAQJ,IAgCIkO,GAoCAC,GAAUC,GApEVC,GAAU,SAAUC,GACtB,IAAIlE,EAAO,GAIX,IACEA,EAAOkE,GAAa/M,EAAuBZ,EAAI0J,UAC/C,MAAOxG,IACPjE,EAAKiE,IAGP,IAAI0K,EAAyB/O,EAAO4L,IACpC,GAAIjE,GAAWoH,GACb,IACEnE,EAAOmE,EAAuBlL,KAAK7D,EAAQ,CAAE4K,KAAMA,KAAWA,EAC9D,MAAOvG,IACPF,EAAe,OAAQE,IAK3B,IA5YiB,SAAUuG,GAC3B,IAAK,IAAIhC,KAAK8C,GAAa,CACzB,IAAIsD,EAAgBtD,GAAY9C,GAChC,GAAKoG,EAAL,CAGA,IAAIC,EA9OI,KA+OND,EAAc,GAAcA,EA/OtB,IA+O8CA,EAEtD,GACEC,IAAerE,GACf,IAAIjE,OACF,IAAM9B,EAAYoK,GAAYlK,QAAQ,SAAU,QAAU,IAC1D,KACAzB,KAAKsH,GAEP,OAAOrK,GAEX,OAAOC,EA0XH0O,CAAatE,GAQjB,MAFY,QAARQ,IAAkBjK,EAAIgO,OAAMvE,GAAQzJ,EAAIgO,KAAK3J,MAAM,KAAK,IAErDoF,EAPLxK,EAAKuB,EAAiB,YAAciJ,IAgDpCwE,GAAW,SACbC,EACAC,EACAtH,EACAuH,IAEKA,GAAe5H,GAAWK,KAAWuH,EAAcvH,GACxD,IACIwH,EAGEC,EAJFlG,EAAW5B,GAAW4H,GAAeA,EAAc,aAEnD5K,EAAS2K,KAAgD,EAA9BA,EAAczG,QAAQ,OAGnDyG,GADIG,EAAQH,EAAc9J,MAAM,MACVkK,QACtBF,EAAc,IAAMC,EAAMvG,KAAK,MAGjC,IAAI0B,EAAOiE,GAAQS,GAGnB,GAAK1E,GAAQuC,IAAgBvC,EAA7B,CAEAuC,GAAevC,EACflB,GAAKkB,KAAOA,EAGRpE,GAAsB,OACxBkD,GAAKiG,eACHlI,KAAKsG,IAAIxL,EAA2B,aAAK,EAAGvC,EAAO4P,YAAc,IACjE,KACFlG,GAAKmG,gBACHpI,KAAKsG,IACHxL,EAAgBQ,IAAiB,EACjC/C,EAAO8P,aAAe,IACnB,MAILtJ,GAAsB,MACpBvF,EAAIuB,KAAWkH,GAAKlH,GAAYvB,EAAIuB,IAItCe,GAAUiD,GAAsB,QAClCkD,GAAKqG,aAAexM,EAAOyM,MAC3BtG,GAAKuG,cAAgB1M,EAAOgL,QAI9B,IAII2B,EAJAC,EAAOnQ,EAAOoQ,YACdC,EAAiB,aAIrB,IACEH,EAAsBC,EAAKG,iBAAiBD,GAAgB,GAAG1F,KAC/D,MAAOtG,IACPjE,EAAKiE,IAGPuK,GAAgBsB,GAC+C,EAA3D,CAAC,SAAU,gBAAgBrH,QAAQqH,GAGnCC,GACAA,EAAKE,KACwC,EAA7C,CAAC,EAAG,GAAGxH,QAAQsH,EAAKE,GAAgB1F,MAGxC,IAAI4F,EAA0BjD,GAC1BA,GAAS9H,MA1uBH,KA0uBgB,GACtBnF,EACJsO,GAAWrB,IACgD,EAAvD3B,GAAmB9C,QAAQ0H,IAC3BA,GAA2BlP,EAC3Bb,EAGJkJ,GAAK8G,OACH,QAAQlN,KAAK+J,OAAkBgC,GAAeT,GAC1CpO,GACCmO,GAEP3G,EAAWD,GAAeC,EAAU,CAClC2C,KAAMhK,EACNiK,KAAMlB,GAAKkB,OAGb,IAAI6F,EAAsB,WACxB7O,EAA2BrB,EAC3B,IAAImQ,EACFrB,GAAeT,KAAkBpI,GAAsB,MA7H1C,SACjB6I,EACAsB,EACAhC,EACAjG,EACAV,EACAuB,GAEI8F,GAAa7B,GAAY,GAAK/D,GAAQmD,QAASrM,GAC/CmM,KAAoBjD,GAAQmD,QAAU9F,MAE1C,IAAI8J,EAActG,GAAkBuE,KAChCgC,EAAQvI,GAAeqI,EAAkBjI,GAE7CY,GACE,CACEmE,GAAIhE,GAAQmD,QACZjC,KAAMhK,EACN2M,UAAWqD,GAAoBhC,EAAWrB,GAAW,KACrDuD,MAAOA,EACPvK,EAAGA,GAEH0B,SAAU/F,EAAU+F,IAEtBuB,GAGFmF,GAAmBpB,GACnBA,GAAWsD,EAEXxN,IAgGE0N,CACEzB,EACAqB,EACA/B,GACAa,EACAxH,EACAuB,IAIJ,GAAK3H,EAmBH6O,SAjBA,IACM9N,GAAUgF,GAAWhF,EAAOoO,sBAC9BpO,EACGoO,qBAAqB,CAAC9N,EAAcC,IACpC8N,KAAK,SAAUC,GACdxH,GAAQyH,QAAUD,EAAkBhO,GACpCwG,GAAQ0H,WAAaF,EAAkB/N,GACvCuN,MAEDW,SAAMX,GAETA,IAEF,MAAOtC,GACPsC,OAWFY,GAAMrR,EAAOsR,QACbC,GAAeF,GAAMA,GAAIG,UAAYnR,EACrCoR,GAAMzR,EAAO0R,cACbC,GAAgB,YAIhBpG,IAAegG,IAAgBK,OAASH,KAqB1CJ,GAAIG,WAnBEK,GAAOR,GADiB1G,GAoBAgH,IAlBrB,WACL,IAEI7G,EAFAhF,EAAMhC,UACNgO,EAAKD,GAAK3N,MAAM6N,KAAMjM,GAY1B,OAVI6B,GAAWiK,OACb9G,EAAQ,IAAI8G,MAAMjH,KAIlBG,EAAQvJ,EAAIyQ,YAAY,UAClBC,UAAUtH,GAAMpK,EAASA,GAEjCuK,EAAMhH,UAAYgC,EAClB2L,GAAI3G,GACGgH,IAMX3P,EACEwP,GACA,WACEvC,GAAS,IAEX5O,GAGF2B,EACE,WACA,WACEiN,GAAS,IAEX5O,IAKA+K,IAAuB,QAARH,IAAkB,iBAAkBpL,GACrDmC,EACE,aACA,WACEiN,GAAS,IAEX5O,GAIA+K,IAAa6D,KAEjBpP,EAAOkS,YAAc,SAAUtH,EAAM5C,EAAUuB,GAC7C6F,GAAS,EAAGxE,EAAM5C,EAAUuB,IAQ9B,IAAI4I,GAAa,CAAC,SAAU,UAExBC,GAAY,SAAUtH,EAAO9C,EAAUuH,IACpCA,GAAe5H,GAAWK,KAAWuH,EAAcvH,GAExD,IAAIqK,EAAkB1K,GAAWmD,GAC7BvB,EAAW5B,GAAW4H,GAAeA,EAAc,aACnD+C,SAAmBxH,EAEvB,GAAIqH,GAAWtJ,QAAQyJ,GAAa,IAAMD,EAExC,OADAlO,EAAeqH,GAAmB5K,EAAY,aAAe0R,GACtD/I,IAGT,IACE,GAAI8I,EAAiB,CACnB,IAAIE,EAAczH,IAClB,GAAIqH,GAAWtJ,eAAe0J,GAAe,EAK3C,OAJApO,EACEqH,GACAV,EAAQ,uBAAyByH,GAE5BhJ,IAETuB,EAAQyH,GAEV,MAAOlO,IAEP,OADAF,EAAeqH,GAAmBnH,IAC3BkF,IAGTuB,GAAS,GAAKA,GAAO/F,QAAQ,eAAgB,KAAKA,QAAQ,WAAY,IAEtE,IAAIyN,EAAc,CAAE7H,KAAM/J,EAAWkK,MAAOA,GACxC2H,GAAa7D,IAAiBxL,EAAQ,EAE1C4E,EAAWD,GAAeC,EAAUwK,GAEhC1H,GACFxB,GACE1D,EAAO4M,EAAa,CAClB/E,GAAI3G,KACJ+J,MAAOvI,IAAgBmK,GACvBnF,UACGmF,GAAa9D,KAAanI,GAAsB,KAC7CkI,GACA,KAEN1G,SAAU/F,EAAU+F,KAEtBuB,IAKFmJ,GAAmB,SAAU5H,EAAO9C,EAAUuB,GAChD6I,GAAUtH,EAAO9C,EAAUuB,IAIxBvJ,EAAOwL,MACVxL,EAAOwL,IAAqBkH,IAE9B,IAAIC,GAAY3S,EAAOwL,IAGnBoH,GAAQD,IAAaA,GAAUlK,EAAIkK,GAAUlK,EAAI,GAMrD,IAAK,IAAIqC,MAHT9K,EAAOwL,IAAqBkH,GAGVE,GACZtO,EAAQsO,GAAO9H,MACjBzF,MAAMC,QAAQsN,GAAM9H,KAChBsH,GAAUlO,MAAM,KAAM0O,GAAM9H,KAC5BsH,GAAUQ,GAAM9H,MAGxB,MAAOqD,IACPhO,EAAUgO,IA7IY,IAAUxD,GACxBkH,GArnBkBvG,GAnN9B,CAu9BEtL,OACA,uBACA"} \ No newline at end of file diff --git a/dist/latest/latest.dev.js b/dist/latest/latest.dev.js index 5bfaa047..06212579 100644 --- a/dist/latest/latest.dev.js +++ b/dist/latest/latest.dev.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2025-07-29; 9107; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-08-12; eeb3; v12) */ /* eslint-env browser */ (function ( @@ -222,32 +222,40 @@ overwriteOptions.strictUtm || attr(scriptElement, "strict-utm") == trueText; + var p; + var getQueryParams = function (ignoreSource, overwriteSearch) { - return ( - (overwriteSearch || loc.search) - .slice(1) - .split("&") - .filter(function (keyValue) { - var ignore = ignoreSource || !collectMetricByString("ut"); - - var paramsRegexList = allowParams.map(filterRegex).join("|"); - var regex = ignore - ? "^(" + paramsRegexList + ")=" - : "^((utm_)" + - (strictUtm ? "" : "?") + - "(source|medium|content|term|campaign)" + - (strictUtm ? "" : "|ref") + - "|" + - paramsRegexList + - ")="; - if (ignore && !allowParams.length) return falseVar; - - // The prefix "utm_" is optional with "strictUtm" disabled - // "ref" is only collected when "strictUtm" is disabled - return new RegExp(regex, "i").test(keyValue); - }) - .join("&") || undefinedVar - ); + p = !ignoreSource && collectMetricByString("p") ? "" : falseVar; + var q = (overwriteSearch || loc.search) + .slice(1) + .split("&") + .filter(function (keyValue) { + var i = keyValue.indexOf("="); + if (p !== falseVar && i > 0 && keyValue.slice(i + 1)) + p += (p ? "," : "") + keyValue.slice(0, i); + + var ignore = ignoreSource || !collectMetricByString("ut"); + + var paramsRegexList = allowParams.map(filterRegex).join("|"); + var regex = ignore + ? "^(" + paramsRegexList + ")=" + : "^((utm_)" + + (strictUtm ? "" : "?") + + "(source|medium|content|term|campaign)" + + (strictUtm ? "" : "|ref") + + "|" + + paramsRegexList + + ")="; + if (ignore && !allowParams.length) return falseVar; + + // The prefix "utm_" is optional with "strictUtm" disabled + // "ref" is only collected when "strictUtm" is disabled + return new RegExp(regex, "i").test(keyValue); + }) + .join("&"); + + p = p || undefinedVar; + return q || undefinedVar; }; // Ignore pages specified in data-ignore-pages @@ -667,7 +675,7 @@ isPushState, deleteSourceInfo, sameSite, - query, + search, metadata, callback ) { @@ -675,13 +683,15 @@ if (collectDataOnLeave) payload.page_id = uuid(); var currentPage = definedHostname + getPath(); + var query = getQueryParams(deleteSourceInfo, search); sendData( { id: payload.page_id, type: pageviewText, referrer: !deleteSourceInfo || sameSite ? referrer : null, - query: query || getQueryParams(deleteSourceInfo), + query: query, + p: p, metadata: stringify(metadata), }, @@ -791,7 +801,7 @@ isPushState, delSrc, // r = referrers sameSite, - querySearch ? getQueryParams(delSrc, querySearch) : undefinedVar, + querySearch, metadata, callback ); diff --git a/dist/latest/latest.js b/dist/latest/latest.js index b24f2ad2..2211491b 100644 --- a/dist/latest/latest.js +++ b/dist/latest/latest.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2025-06-24; ce07; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-08-12; d2af; v12) */ -!function(d,t,e,n,m){try{var v=undefined,g=!0,y=!1,r="true",a="https:",_="pageview",u="event",i="error",o=d.console,c="doNotTrack",w=d.navigator,s=d.location,b=s.host,l=d.document,p=w.userAgent,f="Not sending request ",h=f+"when ",O=y,E=encodeURIComponent,x=decodeURIComponent,S=JSON.stringify,M=d.addEventListener,k="https://queue."+e,q=l.documentElement||{},A="language",$="Height",j="scroll",D=w.userAgentData,C=j+$,R="offset"+$,H="client"+$,P="pagehide",T="platform",U="platformVersion",I="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),N=d.screen,z=l.currentScript||l.querySelector('script[src*="'+e+'"]');m=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){m("Error in your "+t+" function:",e)},W=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},G=function(t){return"string"==typeof t},J=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},L=function(t,e){return t&&t.getAttribute("data-"+e)},Y=function(t){return Array.isArray(t)?t:G(t)&&t.length?t.split(/, ?/):[]},Z=function(t){return t&&t.constructor===Object},K=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},at=function(t){return"function"==typeof t},it="namespace",ot=t[it]||L(z,it)||"sa",ct=function(t,e){var n=d[ot+"_metadata"];Z(n)&&(t=K(t,n));var r=d[Mt];if(!at(r))return Mt&&m(Mt+" not found, set window."+Mt),t;try{return K(t,r.call(d,K(t,e)))}catch(a){F("metadata",a)}},st=t.strictUtm||L(z,"strict-utm")==r,ut=function(a,t){return(t||s.search).slice(1).split("&").filter(function(t){var e=a||!et("ut"),n=Et.map(J).join("|"),r=e?"^("+n+")=":"^((utm_)"+(st?"":"?")+"(source|medium|content|term|campaign)"+(st?"":"|ref")+"|"+n+")=";return e&&!Et.length?y:new RegExp(r).test(t)}).join("&")||v},lt=ot+"_loaded";if(d[lt]==g)return m(f+"twice");d.sa_event_loaded=g,d[lt]=g;var pt=function(e,t,n){e=n?e:K($t,Ct,e),w.brave&&!n&&(e.brave=g),w._duckduckgoloader_&&!n&&(e.duck=g);var r=new Image;t&&(r.onerror=t,r.onload=t),r.src=k+"/simple.gif?"+Object.keys(e).filter(function(t){return e[t]!=v}).map(function(t){return E(t)+"="+E(e[t])}).join("&")+"&time="+Date.now()},ft=t.hostname||L(z,"hostname"),ht=ft||b,dt={version:"cdn_latest_12",hostname:ht};n=function(t){t=t.stack?t+" "+t.stack:t,m(t),pt(K(dt,{type:i,error:t,path:s.pathname}),v,g)},M(i,function(t){t.filename&&-1>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},it=function(t){return"function"==typeof t},ot="namespace",ct=t[ot]||L(z,ot)||"sa",st=function(t,e){var n=d[ct+"_metadata"];Z(n)&&(t=K(t,n));var r=d[kt];if(!it(r))return kt&&m(kt+" not found, set window."+kt),t;try{return K(t,r.call(d,K(t,e)))}catch(a){F("metadata",a)}},ut=t.strictUtm||L(z,"strict-utm")==r,lt=function(i,t){tt=!i&&nt("p")?"":y;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");tt!==y&&0> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n return (\n (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex).test(keyValue);\n })\n .join(\"&\") || undefinedVar\n );\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n query,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query || getQueryParams(deleteSourceInfo),\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch ? getQueryParams(delSrc, querySearch) : undefinedVar,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"simpleanalyticscdn.com\",\n \"queue.\",\n \"cdn_latest_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","protocol","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","search","keyValue","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","indexOf","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","i","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","query","currentPage","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue","q"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"latest.source.js","sources":["latest.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var p;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n p = !ignoreSource && collectMetricByString(\"p\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (p !== falseVar && i > 0 && keyValue.slice(i + 1))\n p += (p ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n p = p || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n p: p,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"simpleanalyticscdn.com\",\n \"queue.\",\n \"cdn_latest_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","protocol","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","p","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue"],"mappings":"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"} \ No newline at end of file diff --git a/dist/latest/light.js b/dist/latest/light.js index dda15604..c3948d94 100644 --- a/dist/latest/light.js +++ b/dist/latest/light.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2025-06-24; bc2f; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-08-12; 5f98; v12) */ -!function(l,e,t,f){try{var m=undefined,n="https:",r=l.console,a="doNotTrack",g=l.navigator,i=l.location,h=i.host,o=l.document,c=g.userAgent,s="Not sending request ",v=!1,u=encodeURIComponent,p=decodeURIComponent,d=JSON.stringify,y=l.addEventListener,_="https://queue."+t,b=(o.documentElement,"language"),w=g.userAgentData,O="platform",S="platformVersion",j="https://docs.simpleanalytics.com",k=/(bot|spider|crawl)/i.test(c)&&!/(cubot)/i.test(c),E=o.currentScript||o.querySelector('script[src*="'+t+'"]');f=function(){var e=[].slice.call(arguments);return e.unshift("Simple Analytics:"),Function.prototype.apply.call(r.warn,r,e)};var q=function(e){return"string"==typeof e},x=function(e,t){return e&&e.getAttribute("data-"+t)},A=function(){for(var e,t,n,r={},a=arguments,i=0;i>e/4).toString(16)})}catch(r){return e.replace(n,function(e){var t=16*Math.random()|0;return(e<2?t:3&t|8).toString(16)})}},N=function(e){return"function"==typeof e},R="namespace",U=e[R]||x(E,R)||"sa",V=e.strictUtm||"true"==x(E,"strict-utm"),B=function(t,e){return(e||i.search).slice(1).split("&").filter(function(e){return!t&&new RegExp("^((utm_)"+(V?"":"?")+"(source|medium|content|term|campaign)"+(V?"":"|ref")+")=").test(e)}).join("&")||m},C=U+"_loaded";if(1==l[C])return f(s+"twice");l.sa_event_loaded=!0,l[C]=!0;var T,F=function(t,e,n){t=n?t:A(L,P,t),g.brave&&!n&&(t.brave=!0),g._duckduckgoloader_&&!n&&(t.duck=!0),(new Image).src=_+"/simple.gif?"+Object.keys(t).filter(function(e){return t[e]!=m}).map(function(e){return u(e)+"="+u(t[e])}).join("&")+"&time="+Date.now()},H=e.hostname||x(E,"hostname"),z=H||h,J={version:"cdn_light_12",hostname:z};e.mode||x(E,"mode");try{T=Intl.DateTimeFormat().resolvedOptions().timeZone}catch(X){f(X)}k&&(J.bot=!0);var L=A(J,{ua:c,https:i.protocol==n,timezone:T,page_id:I(),session_id:I()});if(L.sri=!1,w&&(L.mobile=w.mobile,L.brands=d(w.brands)),z!==h&&(L.hostname_original=h),a in g&&"1"==g[a])return f("Not sending request when "+a+" is enabled. See "+j+"/dnt");-1!=h.indexOf(".")&&!/^[0-9.:]+$/.test(h)||H||f("Set hostname on "+h+". See "+j+"/overwrite-domain-name");var M,P={},Z=(e.referrer||x(E,"referrer")||o.referrer||"").replace(h,z).replace(/^https?:\/\/((m|l|w{2,3}([0-9]+)?)\.)?([^?#]+)(.*)$/,"$4").replace(/^([^/]+)$/,"$1")||m,G=function(e,t){var n=A(J,{type:"append",original_id:t?e:L.page_id});if(t||!g.sendBeacon)F(n,0,!0);else try{g.sendBeacon.bind(g)(_+"/append",d(n))}catch(r){F(n,0,!0)}};y("pagehide",G,!1);var K,Q,W=function(e){var t="";try{t=e||p(i.pathname)}catch(X){f(X)}return t};!function(t,e,n,r){!r&&N(n)&&(r=n);var a,i;N(r);q(e)&&-1>e/4).toString(16)})}catch(r){return e.replace(n,function(e){var t=16*Math.random()|0;return(e<2?t:3&t|8).toString(16)})}},N=function(e){return"function"==typeof e},R="namespace",U=e[R]||x(E,R)||"sa",V=e.strictUtm||"true"==x(E,"strict-utm"),B=U+"_loaded";if(1==l[B])return f(c+"twice");l.sa_event_loaded=!0,l[B]=!0;var C,T=function(t,e,n){t=n?t:A(J,M,t),m.brave&&!n&&(t.brave=!0),m._duckduckgoloader_&&!n&&(t.duck=!0),(new Image).src=_+"/simple.gif?"+Object.keys(t).filter(function(e){return t[e]!=u}).map(function(e){return s(e)+"="+s(t[e])}).join("&")+"&time="+Date.now()},F=e.hostname||x(E,"hostname"),H=F||g,z={version:"cdn_light_12",hostname:H};e.mode||x(E,"mode");try{C=Intl.DateTimeFormat().resolvedOptions().timeZone}catch(X){f(X)}k&&(z.bot=!0);var J=A(z,{ua:o,https:p.protocol==n,timezone:C,page_id:I(),session_id:I()});if(J.sri=!1,w&&(J.mobile=w.mobile,J.brands=v(w.brands)),H!==g&&(J.hostname_original=g),a in m&&"1"==m[a])return f("Not sending request when "+a+" is enabled. See "+j+"/dnt");-1!=g.indexOf(".")&&!/^[0-9.:]+$/.test(g)||F||f("Set hostname on "+g+". See "+j+"/overwrite-domain-name");var L,M={},P=(e.referrer||x(E,"referrer")||i.referrer||"").replace(g,H).replace(/^https?:\/\/((m|l|w{2,3}([0-9]+)?)\.)?([^?#]+)(.*)$/,"$4").replace(/^([^/]+)$/,"$1")||u,Z=function(e,t){var n=A(z,{type:"append",original_id:t?e:J.page_id});if(t||!m.sendBeacon)T(n,0,!0);else try{m.sendBeacon.bind(m)(_+"/append",v(n))}catch(r){T(n,0,!0)}};y("pagehide",Z,!1);var G,K,Q=function(e){var t="";try{t=e||d(p.pathname)}catch(X){f(X)}return t},W=function(e,t,n,r,a,i){e&&Z(""+J.page_id,!0),J.page_id=I();var o,c=H+Q(),s=(o=t,(r||p.search).slice(1).split("&").filter(function(e){return!o&&new RegExp("^((utm_)"+(V?"":"?")+"(source|medium|content|term|campaign)"+(V?"":"|ref")+")=","i").test(e)}).join("&")||u);T({id:J.page_id,type:"pageview",referrer:!t||n?P:null,query:s}),P=c,0};!function(e,t,n,r){!r&&N(n)&&(r=n);var a,i;N(r);q(t)&&-1> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n return (\n (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n if (ignore) return falseVar;\n // eslint-disable-next-line no-redeclare\n var regex =\n \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \")=\";\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex).test(keyValue);\n })\n .join(\"&\") || undefinedVar\n );\n };\n\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n\n\n\n\n\n\n\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n // eslint-disable-next-line no-redeclare\n var bot = isBotAgent;\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n\n\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n query,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query || getQueryParams(deleteSourceInfo),\n\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n sameSite = referrer\n ? referrer.split(slash)[0] == locationHostname\n : falseVar;\n\n\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch ? getQueryParams(delSrc, querySearch) : undefinedVar,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n\n\n pageview();\n\n } catch (e) {\n warn(e);\n }\n})(\n window,\n {},\n \"simpleanalyticscdn.com\",\n \"queue.\",\n \"cdn_light_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","warn","undefinedVar","undefined","https","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","protocol","language","documentElement","uaData","userAgentData","platformText","platformVersionText","docsUrl","isBotAgent","test","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","isString","string","attr","attribute","getAttribute","assign","obj","prop","object","to","arg","index","length","nextSource","constructor","Object","nextKey","hasOwnProperty","settings","sa_settings","logSettings","keys","Date","now","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","replace","c","getRandomValues","Uint8Array","toString","error","r","Math","random","isFunction","func","namespaceText","namespace","strictUtm","getQueryParams","ignoreSource","overwriteSearch","search","split","filter","keyValue","RegExp","join","loadedVariable","sa_event_loaded","timezone","sendData","data","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","Image","src","key","map","overwrittenHostname","hostname","definedHostname","basePayload","version","mode","Intl","DateTimeFormat","resolvedOptions","timeZone","bot","ua","page_id","session_id","sri","mobile","brands","hostname_original","indexOf","lastSendPath","referrer","sendOnLeave","id","push","append","type","original_id","sendBeacon","bind","e","sameSite","userNavigated","getPath","overwrite","path","pathname","isPushState","pathOverwrite","metadata","callbackRaw","querySearch","parts","shift","performaceEntryType","perf","performance","navigationText","getEntriesByType","triggerSendPageView","delSrc","deleteSourceInfo","query","currentPage","pages","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","pageview"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"light.source.js","sources":["light.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n\n var collectMetricByString = function (metricAbbreviation) {\n // eslint-disable-next-line no-unreachable\n return true;\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n if (ignore) return falseVar;\n // eslint-disable-next-line no-redeclare\n var regex =\n \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \")=\";\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n return q || undefinedVar;\n };\n\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n\n\n\n\n\n\n\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n // eslint-disable-next-line no-redeclare\n var bot = isBotAgent;\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n\n\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n sameSite = referrer\n ? referrer.split(slash)[0] == locationHostname\n : falseVar;\n\n\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n\n\n pageview();\n\n } catch (e) {\n warn(e);\n }\n})(\n window,\n {},\n \"simpleanalyticscdn.com\",\n \"queue.\",\n \"cdn_light_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","warn","undefinedVar","undefined","https","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","protocol","language","documentElement","uaData","userAgentData","platformText","platformVersionText","docsUrl","isBotAgent","test","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","isString","string","attr","attribute","getAttribute","assign","obj","prop","object","to","arg","index","length","nextSource","constructor","Object","nextKey","hasOwnProperty","settings","sa_settings","logSettings","keys","Date","now","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","replace","c","getRandomValues","Uint8Array","toString","error","r","Math","random","isFunction","func","namespaceText","namespace","strictUtm","loadedVariable","sa_event_loaded","timezone","sendData","data","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","Image","src","filter","key","map","join","overwrittenHostname","hostname","definedHostname","basePayload","version","mode","Intl","DateTimeFormat","resolvedOptions","timeZone","bot","ua","page_id","session_id","sri","mobile","brands","hostname_original","indexOf","lastSendPath","referrer","sendOnLeave","id","push","append","type","original_id","sendBeacon","bind","e","sameSite","userNavigated","getPath","overwrite","path","pathname","sendPageView","isPushState","deleteSourceInfo","search","metadata","ignoreSource","currentPage","query","split","keyValue","RegExp","pages","pathOverwrite","callbackRaw","querySearch","parts","shift","performaceEntryType","perf","performance","navigationText","getEntriesByType","triggerSendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","pageview"],"mappings":"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"} \ No newline at end of file diff --git a/dist/v12/app.js b/dist/v12/app.js index 43e62216..7a25a549 100644 --- a/dist/v12/app.js +++ b/dist/v12/app.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2025-06-24; 5efc; SRI-version; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-08-12; 0715; SRI-version; v12) */ -!function(d,t,e,n,m){try{var v=undefined,g=!0,y=!1,r="true",a="https:",_="pageview",u="event",i="error",o=d.console,c="doNotTrack",w=d.navigator,s=d.location,b=s.host,l=d.document,p=w.userAgent,f="Not sending request ",h=f+"when ",O=y,E=encodeURIComponent,x=decodeURIComponent,S=JSON.stringify,M=d.addEventListener,k="https://queue."+e,q=l.documentElement||{},A="language",$="Height",j="scroll",D=w.userAgentData,C=j+$,R="offset"+$,H="client"+$,P="pagehide",T="platform",U="platformVersion",I="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),N=d.screen,z=l.currentScript||l.querySelector('script[src*="'+e+'"]');m=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){m("Error in your "+t+" function:",e)},W=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},G=function(t){return"string"==typeof t},J=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},L=function(t,e){return t&&t.getAttribute("data-"+e)},Y=function(t){return Array.isArray(t)?t:G(t)&&t.length?t.split(/, ?/):[]},Z=function(t){return t&&t.constructor===Object},K=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},at=function(t){return"function"==typeof t},it="namespace",ot=t[it]||L(z,it)||"sa",ct=function(t,e){var n=d[ot+"_metadata"];Z(n)&&(t=K(t,n));var r=d[Mt];if(!at(r))return Mt&&m(Mt+" not found, set window."+Mt),t;try{return K(t,r.call(d,K(t,e)))}catch(a){F("metadata",a)}},st=t.strictUtm||L(z,"strict-utm")==r,ut=function(a,t){return(t||s.search).slice(1).split("&").filter(function(t){var e=a||!et("ut"),n=Et.map(J).join("|"),r=e?"^("+n+")=":"^((utm_)"+(st?"":"?")+"(source|medium|content|term|campaign)"+(st?"":"|ref")+"|"+n+")=";return e&&!Et.length?y:new RegExp(r).test(t)}).join("&")||v},lt=ot+"_loaded";if(d[lt]==g)return m(f+"twice");d.sa_event_loaded=g,d[lt]=g;var pt=function(e,t,n){e=n?e:K($t,Ct,e),w.brave&&!n&&(e.brave=g),w._duckduckgoloader_&&!n&&(e.duck=g);var r=new Image;t&&(r.onerror=t,r.onload=t),r.src=k+"/simple.gif?"+Object.keys(e).filter(function(t){return e[t]!=v}).map(function(t){return E(t)+"="+E(e[t])}).join("&")+"&time="+Date.now()},ft=t.hostname||L(z,"hostname"),ht=ft||b,dt={version:"cdn_latest_12",hostname:ht};n=function(t){t=t.stack?t+" "+t.stack:t,m(t),pt(K(dt,{type:i,error:t,path:s.pathname}),v,g)},M(i,function(t){t.filename&&-1>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},it=function(t){return"function"==typeof t},ot="namespace",ct=t[ot]||L(z,ot)||"sa",st=function(t,e){var n=d[ct+"_metadata"];Z(n)&&(t=K(t,n));var r=d[kt];if(!it(r))return kt&&m(kt+" not found, set window."+kt),t;try{return K(t,r.call(d,K(t,e)))}catch(a){F("metadata",a)}},ut=t.strictUtm||L(z,"strict-utm")==r,lt=function(i,t){tt=!i&&nt("p")?"":y;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");tt!==y&&0> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n return (\n (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex).test(keyValue);\n })\n .join(\"&\") || undefinedVar\n );\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = trueVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n query,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query || getQueryParams(deleteSourceInfo),\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch ? getQueryParams(delSrc, querySearch) : undefinedVar,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"simpleanalyticscdn.com\",\n \"queue.\",\n \"cdn_latest_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","protocol","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","search","keyValue","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","indexOf","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","i","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","query","currentPage","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue","q"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"app.js","sources":["app.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var p;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n p = !ignoreSource && collectMetricByString(\"p\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (p !== falseVar && i > 0 && keyValue.slice(i + 1))\n p += (p ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n p = p || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = trueVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n p: p,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"simpleanalyticscdn.com\",\n \"queue.\",\n \"cdn_latest_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","protocol","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","p","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue"],"mappings":"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"} \ No newline at end of file diff --git a/dist/v12/auto-events.js b/dist/v12/auto-events.js index 410b2bc3..db284999 100644 --- a/dist/v12/auto-events.js +++ b/dist/v12/auto-events.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2025-06-24; 7048; SRI-version; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-08-12; e658; SRI-version; v12) */ -function r(t,e){var a,n;t.hasAttribute("data-simple-event")||(a=!1,h.downloads&&/^https?:\/\//i.test(t.href)&&new RegExp("\\.("+(h.downloadsExtensions||[]).join("|")+")$","i").test(t.pathname)?a="download":h.outbound&&/^https?:\/\//i.test(t.href)&&t.hostname!==m.location.hostname?a="outbound":h.emails&&/^mailto:/i.test(t.href)&&(a="email"),a&&(e?(n="saAutomatedLink(this, '"+a+"');",t.hasAttribute("target")&&"_self"!==t.getAttribute("target")||(n+=" return false;"),t.setAttribute("onclick",n)):t.addEventListener("click",function(){g(t,a)})))}function e(){try{for(var t=document.getElementsByTagName("a"),e=0;e -1,\n emails: collectTypes.indexOf(\"emails\") > -1,\n downloads: collectTypes.indexOf(\"downloads\") > -1,\n // Downloads: enter file extensions you want to collect\n downloadsExtensions: setting(\"extensions\", \"array\", [\n \"pdf\",\n \"csv\",\n \"docx\",\n \"xlsx\",\n \"zip\",\n \"doc\",\n \"xls\",\n ]),\n\n // All: use title attribute if set for event name (for all events)\n // THIS TAKES PRECEDENCE OVER OTHER SETTINGS BELOW\n title: setting(\"useTitle\", \"bool\", true),\n // Outbound: use full URL of the links? false for just the hostname\n outboundFullUrl: fullUrls,\n // Downloads: if taking event name from URL, use full URL or just filename (default)\n downloadsFullUrl: fullUrls,\n };\n\n var saGlobal = setting(\"saGlobal\", \"string\", \"sa_event\");\n\n // For compiling the script\n var optionsLink = options;\n\n if (typeof optionsLink === \"undefined\")\n log(\"options object not found, please specify\", \"warn\");\n\n var saAutomatedLink = function saAutomatedLink(element, type) {\n try {\n if (!element) return log(\"no element found\");\n var sent = false;\n\n var callback = function () {\n if (!sent && !element.hasAttribute(\"target\"))\n document.location = element.getAttribute(\"href\");\n sent = true;\n };\n\n if (window[saGlobal] && window[saGlobal + \"_loaded\"]) {\n var hostname = element.hostname;\n var pathname = element.pathname;\n\n var event;\n var metadata = {\n title: element.getAttribute(\"title\") || undefined,\n };\n var url = element.href || undefined;\n\n var useTitle = false;\n if (optionsLink.title && element.hasAttribute(\"title\")) {\n var theTitle = element.getAttribute(\"title\").trim();\n if (theTitle != \"\") useTitle = true;\n }\n\n if (useTitle) {\n event = theTitle;\n } else {\n switch (type) {\n case \"outbound\": {\n event = hostname + (optionsLink.outboundFullUrl ? pathname : \"\");\n metadata.url = url;\n break;\n }\n case \"download\": {\n event = optionsLink.downloadsFullUrl\n ? hostname + pathname\n : pathname.split(\"/\").pop();\n metadata.url = url;\n break;\n }\n case \"email\": {\n var href = element.getAttribute(\"href\");\n event = (href.split(\":\")[1] || \"\").split(\"?\")[0];\n metadata.email = event;\n break;\n }\n }\n }\n\n var clean =\n type +\n \"_\" +\n event.replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_+|_+$)/g, \"\");\n\n window[saGlobal](clean, metadata, callback);\n\n log(\"collected \" + clean);\n\n return type === \"email\"\n ? callback()\n : window.setTimeout(callback, 5000);\n } else {\n log(saGlobal + \" is not defined\", \"warn\");\n return callback();\n }\n } catch (error) {\n log(error.message, \"warn\");\n }\n };\n\n window.saAutomatedLink = saAutomatedLink;\n\n function collectLink(link, onclick) {\n if (link.hasAttribute(\"data-simple-event\")) return;\n var collect = false;\n\n // Collect download clicks\n if (\n optionsLink.downloads &&\n /^https?:\\/\\//i.test(link.href) &&\n new RegExp(\n \"\\\\.(\" + (optionsLink.downloadsExtensions || []).join(\"|\") + \")$\",\n \"i\"\n ).test(link.pathname)\n ) {\n collect = \"download\";\n\n // Collect outbound links clicks\n } else if (\n optionsLink.outbound &&\n /^https?:\\/\\//i.test(link.href) &&\n link.hostname !== window.location.hostname\n ) {\n collect = \"outbound\";\n\n // Collect email clicks\n } else if (optionsLink.emails && /^mailto:/i.test(link.href)) {\n collect = \"email\";\n }\n\n if (!collect) return;\n\n if (onclick) {\n var onClickAttribute = \"saAutomatedLink(this, '\" + collect + \"');\";\n\n if (\n !link.hasAttribute(\"target\") ||\n link.getAttribute(\"target\") === \"_self\"\n )\n onClickAttribute += \" return false;\";\n\n link.setAttribute(\"onclick\", onClickAttribute);\n } else {\n link.addEventListener(\"click\", function () {\n saAutomatedLink(link, collect);\n });\n }\n }\n\n function onDOMContentLoaded() {\n try {\n var a = document.getElementsByTagName(\"a\");\n\n // Loop over all links on the page\n for (var i = 0; i < a.length; i++) {\n var link = a[i];\n var href = link.getAttribute(\"href\");\n\n // Skip links that don't have an href\n if (!href) continue;\n\n // We don't want to overwrite website behaviour so we check for the onclick attribute\n if (!link.getAttribute(\"onclick\") && !/^mailto:/.test(href)) {\n collectLink(link, true);\n } else {\n collectLink(link, false);\n }\n }\n } catch (error) {\n log(error.message, \"warn\");\n }\n }\n\n if (doc.readyState === \"ready\" || doc.readyState === \"complete\") {\n onDOMContentLoaded();\n } else {\n document.addEventListener(\"readystatechange\", function (event) {\n if (event.target.readyState === \"complete\") onDOMContentLoaded();\n });\n }\n})(window);\n"],"names":["collectLink","link","onclick","collect","onClickAttribute","hasAttribute","optionsLink","downloads","test","href","RegExp","downloadsExtensions","join","pathname","outbound","hostname","window","location","emails","getAttribute","setAttribute","addEventListener","saAutomatedLink","onDOMContentLoaded","a","document","getElementsByTagName","i","length","error","log","message","doc","scriptElement","setting","collectTypes","fullUrls","options","saGlobal","type","logger","console","warn","info","currentScript","querySelector","attribute","defaultValue","value","dataset","split","map","item","trim","filter","Boolean","indexOf","title","outboundFullUrl","downloadsFullUrl","element","sent","callback","theTitle","metadata","undefined","url","useTitle","event","pop","email","clean","replace","setTimeout","readyState","target"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"auto-events.source.js","sources":["auto-events.source.js"],"sourcesContent":["(function saAutomatedEvents(window) {\n // Skip server side rendered pages\n if (typeof window === \"undefined\") return;\n\n var log = function (message, type) {\n var logger = type === \"warn\" ? console.warn : console.info;\n return logger && logger(\"Simple Analytics auto events:\", message);\n };\n\n var doc = window.document;\n\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"auto-events.js\"]');\n\n var setting = function (attribute, type, defaultValue) {\n var value = scriptElement && scriptElement.dataset[attribute];\n\n // Booleans\n if (type === \"bool\" && (value === \"true\" || value === \"false\"))\n return value === \"true\";\n else if (type === \"bool\") return defaultValue;\n\n // Arrays\n if (type === \"array\" && value)\n return value\n .split(\",\")\n .map(function (item) {\n return item.trim();\n })\n .filter(Boolean);\n else if (type === \"array\") return defaultValue;\n\n return value || defaultValue;\n };\n\n var collectTypes = setting(\"collect\", \"array\", [\n \"outbound\",\n \"emails\",\n \"downloads\",\n \"phones\",\n ]);\n var fullUrls = setting(\"fullUrls\", \"bool\", false);\n\n var options = {\n // What to collect\n outbound: collectTypes.indexOf(\"outbound\") > -1,\n emails: collectTypes.indexOf(\"emails\") > -1,\n downloads: collectTypes.indexOf(\"downloads\") > -1,\n phones: collectTypes.indexOf(\"phones\") > -1,\n // Downloads: enter file extensions you want to collect\n downloadsExtensions: setting(\"extensions\", \"array\", [\n \"pdf\",\n \"csv\",\n \"docx\",\n \"xlsx\",\n \"zip\",\n \"doc\",\n \"xls\",\n ]),\n\n // All: use title attribute if set for event name (for all events)\n // THIS TAKES PRECEDENCE OVER OTHER SETTINGS BELOW\n title: setting(\"useTitle\", \"bool\", true),\n // Outbound: use full URL of the links? false for just the hostname\n outboundFullUrl: fullUrls,\n // Downloads: if taking event name from URL, use full URL or just filename (default)\n downloadsFullUrl: fullUrls,\n };\n\n var saGlobal = setting(\"saGlobal\", \"string\", \"sa_event\");\n\n // For compiling the script\n var optionsLink = options;\n\n if (typeof optionsLink === \"undefined\")\n log(\"options object not found, please specify\", \"warn\");\n\n var saAutomatedLink = function saAutomatedLink(element, type) {\n try {\n if (!element) return log(\"no element found\");\n var sent = false;\n\n var callback = function () {\n if (\n !sent &&\n (!element.hasAttribute(\"target\") ||\n element.getAttribute(\"target\") === \"_self\")\n )\n document.location = element.getAttribute(\"href\");\n sent = true;\n };\n\n if (window[saGlobal] && window[saGlobal + \"_loaded\"]) {\n var hostname = element.hostname;\n var pathname = element.pathname;\n\n var event;\n var metadata = {\n title: element.getAttribute(\"title\") || undefined,\n };\n var url = element.href || undefined;\n\n var useTitle = false;\n if (optionsLink.title && element.hasAttribute(\"title\")) {\n var theTitle = element.getAttribute(\"title\").trim();\n if (theTitle != \"\") useTitle = true;\n }\n\n if (useTitle) {\n event = theTitle;\n } else {\n switch (type) {\n case \"outbound\": {\n event = hostname + (optionsLink.outboundFullUrl ? pathname : \"\");\n metadata.url = url;\n break;\n }\n case \"download\": {\n event = optionsLink.downloadsFullUrl\n ? hostname + pathname\n : pathname.split(\"/\").pop();\n metadata.url = url;\n break;\n }\n case \"email\": {\n var href = element.getAttribute(\"href\");\n event = (href.split(\":\")[1] || \"\").split(\"?\")[0];\n metadata.email = event;\n break;\n }\n case \"phone\": {\n var hrefPhone = element.getAttribute(\"href\");\n event = (hrefPhone.split(\":\")[1] || \"\").split(\"?\")[0];\n metadata.phone = event;\n break;\n }\n }\n }\n\n var clean =\n type +\n \"_\" +\n event.replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_+|_+$)/g, \"\");\n\n window[saGlobal](clean, metadata, callback);\n\n log(\"collected \" + clean);\n\n return type === \"email\" || type === \"phone\"\n ? callback()\n : window.setTimeout(callback, 5000);\n } else {\n log(saGlobal + \" is not defined\", \"warn\");\n return callback();\n }\n } catch (error) {\n log(error.message, \"warn\");\n }\n };\n\n window.saAutomatedLink = saAutomatedLink;\n\n function collectLink(link, onclick) {\n if (link.hasAttribute(\"data-simple-event\")) return;\n var collect = false;\n\n // Collect download clicks\n if (\n optionsLink.downloads &&\n /^https?:\\/\\//i.test(link.href) &&\n new RegExp(\n \"\\\\.(\" + (optionsLink.downloadsExtensions || []).join(\"|\") + \")$\",\n \"i\"\n ).test(link.pathname)\n ) {\n collect = \"download\";\n\n // Collect outbound links clicks\n } else if (\n optionsLink.outbound &&\n /^https?:\\/\\//i.test(link.href) &&\n link.hostname !== window.location.hostname\n ) {\n collect = \"outbound\";\n\n // Collect email clicks\n } else if (optionsLink.emails && /^mailto:/i.test(link.href)) {\n collect = \"email\";\n\n // Collect telephone clicks\n } else if (optionsLink.phones && /^tel:/i.test(link.href)) {\n collect = \"phone\";\n }\n\n if (!collect) return;\n\n if (onclick) {\n var onClickAttribute = \"saAutomatedLink(this, '\" + collect + \"');\";\n\n if (\n !link.hasAttribute(\"target\") ||\n link.getAttribute(\"target\") === \"_self\"\n )\n onClickAttribute += \" return false;\";\n\n link.setAttribute(\"onclick\", onClickAttribute);\n } else {\n link.addEventListener(\"click\", function () {\n saAutomatedLink(this, collect);\n });\n }\n }\n\n function onDOMContentLoaded() {\n try {\n var a = document.getElementsByTagName(\"a\");\n\n // Loop over all links on the page\n for (var i = 0; i < a.length; i++) {\n var link = a[i];\n var href = link.getAttribute(\"href\");\n\n // Skip links that don't have an href\n if (!href) continue;\n\n // We don't want to overwrite website behaviour so we check for the onclick attribute\n if (\n !link.getAttribute(\"onclick\") &&\n !/^mailto:/.test(href) &&\n !/^tel:/.test(href)\n ) {\n collectLink(link, true);\n } else {\n collectLink(link, false);\n }\n }\n } catch (error) {\n log(error.message, \"warn\");\n }\n }\n\n if (doc.readyState === \"ready\" || doc.readyState === \"complete\") {\n onDOMContentLoaded();\n } else {\n document.addEventListener(\"readystatechange\", function (event) {\n if (event.target.readyState === \"complete\") onDOMContentLoaded();\n });\n }\n})(window);\n"],"names":["collectLink","link","onclick","collect","onClickAttribute","hasAttribute","optionsLink","downloads","test","href","RegExp","downloadsExtensions","join","pathname","outbound","hostname","window","location","emails","phones","getAttribute","setAttribute","addEventListener","saAutomatedLink","this","onDOMContentLoaded","a","document","getElementsByTagName","i","length","error","log","message","doc","scriptElement","setting","collectTypes","fullUrls","options","saGlobal","type","logger","console","warn","info","currentScript","querySelector","attribute","defaultValue","value","dataset","split","map","item","trim","filter","Boolean","indexOf","title","outboundFullUrl","downloadsFullUrl","element","sent","callback","theTitle","metadata","undefined","url","useTitle","event","pop","email","phone","clean","replace","setTimeout","readyState","target"],"mappings":"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"} \ No newline at end of file diff --git a/dist/v12/custom/app.js b/dist/v12/custom/app.js index 6dbb1336..1c366ff5 100644 --- a/dist/v12/custom/app.js +++ b/dist/v12/custom/app.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2025-06-24; af71; SRI-version; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-08-12; 3afb; SRI-version; v12) */ -!function(d,t,e,n,m){try{var g=undefined,v=!0,y=!1,r="true",a="https:",_="pageview",u="event",i="error",o=d.console,c="doNotTrack",w=d.navigator,s=d.location,b=s.host,l=d.document,p=w.userAgent,f="Not sending request ",h=f+"when ",O=y,E=encodeURIComponent,x=decodeURIComponent,S=JSON.stringify,M=d.addEventListener,k="https://"+e,A=l.documentElement||{},q="language",$="Height",j="scroll",D=w.userAgentData,C=j+$,H="offset"+$,R="client"+$,P="pagehide",T="platform",U="platformVersion",I="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),N=d.screen,z=l.currentScript||l.querySelector('script[src*="'+e+'"]');m=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){m("Error in your "+t+" function:",e)},W=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},G=function(t){return"string"==typeof t},J=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},L=function(t,e){return t&&t.getAttribute("data-"+e)},Y=function(t){return Array.isArray(t)?t:G(t)&&t.length?t.split(/, ?/):[]},Z=function(t){return t&&t.constructor===Object},K=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},at=function(t){return"function"==typeof t},it="namespace",ot=t[it]||L(z,it)||"sa",ct=function(t,e){var n=d[ot+"_metadata"];Z(n)&&(t=K(t,n));var r=d[Mt];if(!at(r))return Mt&&m(Mt+" not found, set window."+Mt),t;try{return K(t,r.call(d,K(t,e)))}catch(a){F("metadata",a)}},st=t.strictUtm||L(z,"strict-utm")==r,ut=function(a,t){return(t||s.search).slice(1).split("&").filter(function(t){var e=a||!et("ut"),n=Et.map(J).join("|"),r=e?"^("+n+")=":"^((utm_)"+(st?"":"?")+"(source|medium|content|term|campaign)"+(st?"":"|ref")+"|"+n+")=";return e&&!Et.length?y:new RegExp(r).test(t)}).join("&")||g},lt=ot+"_loaded";if(d[lt]==v)return m(f+"twice");d.sa_event_loaded=v,d[lt]=v;var pt=function(e,t,n){e=n?e:K($t,Ct,e),w.brave&&!n&&(e.brave=v),w._duckduckgoloader_&&!n&&(e.duck=v);var r=new Image;t&&(r.onerror=t,r.onload=t),r.src=k+"/simple.gif?"+Object.keys(e).filter(function(t){return e[t]!=g}).map(function(t){return E(t)+"="+E(e[t])}).join("&")+"&time="+Date.now()},ft=t.hostname||L(z,"hostname"),ht=ft||b,dt={version:"custom_app_12",hostname:ht};n=function(t){t=t.stack?t+" "+t.stack:t,m(t),pt(K(dt,{type:i,error:t,path:s.pathname}),g,v)},M(i,function(t){t.filename&&-1"); +!function(d,t,e,n,m){try{var v=undefined,g=!0,y=!1,r="true",a="https:",_="pageview",u="event",i="error",o=d.console,c="doNotTrack",w=d.navigator,s=d.location,b=s.host,l=d.document,p=w.userAgent,f="Not sending request ",h=f+"when ",O=y,x=encodeURIComponent,E=decodeURIComponent,S=JSON.stringify,M=d.addEventListener,k="https://"+e,A=l.documentElement||{},q="language",$="Height",j="scroll",D=w.userAgentData,C=j+$,H="offset"+$,R="client"+$,P="pagehide",T="platform",U="platformVersion",I="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),N=d.screen,z=l.currentScript||l.querySelector('script[src*="'+e+'"]');m=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){m("Error in your "+t+" function:",e)},W=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},G=function(t){return"string"==typeof t},J=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},L=function(t,e){return t&&t.getAttribute("data-"+e)},Y=function(t){return Array.isArray(t)?t:G(t)&&t.length?t.split(/, ?/):[]},Z=function(t){return t&&t.constructor===Object},K=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},it=function(t){return"function"==typeof t},ot="namespace",ct=t[ot]||L(z,ot)||"sa",st=function(t,e){var n=d[ct+"_metadata"];Z(n)&&(t=K(t,n));var r=d[kt];if(!it(r))return kt&&m(kt+" not found, set window."+kt),t;try{return K(t,r.call(d,K(t,e)))}catch(a){F("metadata",a)}},ut=t.strictUtm||L(z,"strict-utm")==r,lt=function(i,t){tt=!i&&nt("p")?"":y;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");tt!==y&&0"); //# sourceMappingURL=app.js.map \ No newline at end of file diff --git a/dist/v12/custom/app.js.map b/dist/v12/custom/app.js.map index c66414f9..62fafdb1 100644 --- a/dist/v12/custom/app.js.map +++ b/dist/v12/custom/app.js.map @@ -1 +1 @@ -{"version":3,"file":"app.source.js","sources":["app.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n return (\n (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex).test(keyValue);\n })\n .join(\"&\") || undefinedVar\n );\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = trueVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n query,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query || getQueryParams(deleteSourceInfo),\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch ? getQueryParams(delSrc, querySearch) : undefinedVar,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_app_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","search","keyValue","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","indexOf","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","protocol","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","i","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","query","currentPage","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue","q"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"app.source.js","sources":["app.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var p;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n p = !ignoreSource && collectMetricByString(\"p\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (p !== falseVar && i > 0 && keyValue.slice(i + 1))\n p += (p ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n p = p || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = trueVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n p: p,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_app_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","p","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","protocol","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue"],"mappings":"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"} \ No newline at end of file diff --git a/dist/v12/custom/auto-events.js b/dist/v12/custom/auto-events.js index 410b2bc3..db284999 100644 --- a/dist/v12/custom/auto-events.js +++ b/dist/v12/custom/auto-events.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2025-06-24; 7048; SRI-version; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-08-12; e658; SRI-version; v12) */ -function r(t,e){var a,n;t.hasAttribute("data-simple-event")||(a=!1,h.downloads&&/^https?:\/\//i.test(t.href)&&new RegExp("\\.("+(h.downloadsExtensions||[]).join("|")+")$","i").test(t.pathname)?a="download":h.outbound&&/^https?:\/\//i.test(t.href)&&t.hostname!==m.location.hostname?a="outbound":h.emails&&/^mailto:/i.test(t.href)&&(a="email"),a&&(e?(n="saAutomatedLink(this, '"+a+"');",t.hasAttribute("target")&&"_self"!==t.getAttribute("target")||(n+=" return false;"),t.setAttribute("onclick",n)):t.addEventListener("click",function(){g(t,a)})))}function e(){try{for(var t=document.getElementsByTagName("a"),e=0;e -1,\n emails: collectTypes.indexOf(\"emails\") > -1,\n downloads: collectTypes.indexOf(\"downloads\") > -1,\n // Downloads: enter file extensions you want to collect\n downloadsExtensions: setting(\"extensions\", \"array\", [\n \"pdf\",\n \"csv\",\n \"docx\",\n \"xlsx\",\n \"zip\",\n \"doc\",\n \"xls\",\n ]),\n\n // All: use title attribute if set for event name (for all events)\n // THIS TAKES PRECEDENCE OVER OTHER SETTINGS BELOW\n title: setting(\"useTitle\", \"bool\", true),\n // Outbound: use full URL of the links? false for just the hostname\n outboundFullUrl: fullUrls,\n // Downloads: if taking event name from URL, use full URL or just filename (default)\n downloadsFullUrl: fullUrls,\n };\n\n var saGlobal = setting(\"saGlobal\", \"string\", \"sa_event\");\n\n // For compiling the script\n var optionsLink = options;\n\n if (typeof optionsLink === \"undefined\")\n log(\"options object not found, please specify\", \"warn\");\n\n var saAutomatedLink = function saAutomatedLink(element, type) {\n try {\n if (!element) return log(\"no element found\");\n var sent = false;\n\n var callback = function () {\n if (!sent && !element.hasAttribute(\"target\"))\n document.location = element.getAttribute(\"href\");\n sent = true;\n };\n\n if (window[saGlobal] && window[saGlobal + \"_loaded\"]) {\n var hostname = element.hostname;\n var pathname = element.pathname;\n\n var event;\n var metadata = {\n title: element.getAttribute(\"title\") || undefined,\n };\n var url = element.href || undefined;\n\n var useTitle = false;\n if (optionsLink.title && element.hasAttribute(\"title\")) {\n var theTitle = element.getAttribute(\"title\").trim();\n if (theTitle != \"\") useTitle = true;\n }\n\n if (useTitle) {\n event = theTitle;\n } else {\n switch (type) {\n case \"outbound\": {\n event = hostname + (optionsLink.outboundFullUrl ? pathname : \"\");\n metadata.url = url;\n break;\n }\n case \"download\": {\n event = optionsLink.downloadsFullUrl\n ? hostname + pathname\n : pathname.split(\"/\").pop();\n metadata.url = url;\n break;\n }\n case \"email\": {\n var href = element.getAttribute(\"href\");\n event = (href.split(\":\")[1] || \"\").split(\"?\")[0];\n metadata.email = event;\n break;\n }\n }\n }\n\n var clean =\n type +\n \"_\" +\n event.replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_+|_+$)/g, \"\");\n\n window[saGlobal](clean, metadata, callback);\n\n log(\"collected \" + clean);\n\n return type === \"email\"\n ? callback()\n : window.setTimeout(callback, 5000);\n } else {\n log(saGlobal + \" is not defined\", \"warn\");\n return callback();\n }\n } catch (error) {\n log(error.message, \"warn\");\n }\n };\n\n window.saAutomatedLink = saAutomatedLink;\n\n function collectLink(link, onclick) {\n if (link.hasAttribute(\"data-simple-event\")) return;\n var collect = false;\n\n // Collect download clicks\n if (\n optionsLink.downloads &&\n /^https?:\\/\\//i.test(link.href) &&\n new RegExp(\n \"\\\\.(\" + (optionsLink.downloadsExtensions || []).join(\"|\") + \")$\",\n \"i\"\n ).test(link.pathname)\n ) {\n collect = \"download\";\n\n // Collect outbound links clicks\n } else if (\n optionsLink.outbound &&\n /^https?:\\/\\//i.test(link.href) &&\n link.hostname !== window.location.hostname\n ) {\n collect = \"outbound\";\n\n // Collect email clicks\n } else if (optionsLink.emails && /^mailto:/i.test(link.href)) {\n collect = \"email\";\n }\n\n if (!collect) return;\n\n if (onclick) {\n var onClickAttribute = \"saAutomatedLink(this, '\" + collect + \"');\";\n\n if (\n !link.hasAttribute(\"target\") ||\n link.getAttribute(\"target\") === \"_self\"\n )\n onClickAttribute += \" return false;\";\n\n link.setAttribute(\"onclick\", onClickAttribute);\n } else {\n link.addEventListener(\"click\", function () {\n saAutomatedLink(link, collect);\n });\n }\n }\n\n function onDOMContentLoaded() {\n try {\n var a = document.getElementsByTagName(\"a\");\n\n // Loop over all links on the page\n for (var i = 0; i < a.length; i++) {\n var link = a[i];\n var href = link.getAttribute(\"href\");\n\n // Skip links that don't have an href\n if (!href) continue;\n\n // We don't want to overwrite website behaviour so we check for the onclick attribute\n if (!link.getAttribute(\"onclick\") && !/^mailto:/.test(href)) {\n collectLink(link, true);\n } else {\n collectLink(link, false);\n }\n }\n } catch (error) {\n log(error.message, \"warn\");\n }\n }\n\n if (doc.readyState === \"ready\" || doc.readyState === \"complete\") {\n onDOMContentLoaded();\n } else {\n document.addEventListener(\"readystatechange\", function (event) {\n if (event.target.readyState === \"complete\") onDOMContentLoaded();\n });\n }\n})(window);\n"],"names":["collectLink","link","onclick","collect","onClickAttribute","hasAttribute","optionsLink","downloads","test","href","RegExp","downloadsExtensions","join","pathname","outbound","hostname","window","location","emails","getAttribute","setAttribute","addEventListener","saAutomatedLink","onDOMContentLoaded","a","document","getElementsByTagName","i","length","error","log","message","doc","scriptElement","setting","collectTypes","fullUrls","options","saGlobal","type","logger","console","warn","info","currentScript","querySelector","attribute","defaultValue","value","dataset","split","map","item","trim","filter","Boolean","indexOf","title","outboundFullUrl","downloadsFullUrl","element","sent","callback","theTitle","metadata","undefined","url","useTitle","event","pop","email","clean","replace","setTimeout","readyState","target"],"mappings":";;AAsJE,SAASA,EAAYC,EAAMC,GACzB,IACIC,EA6BEC,EA9BFH,EAAKI,aAAa,uBAClBF,GAAU,EAIZG,EAAYC,WACZ,gBAAgBC,KAAKP,EAAKQ,OAC1B,IAAIC,OACF,QAAUJ,EAAYK,qBAAuB,IAAIC,KAAK,KAAO,KAC7D,KACAJ,KAAKP,EAAKY,UAEZV,EAAU,WAIVG,EAAYQ,UACZ,gBAAgBN,KAAKP,EAAKQ,OAC1BR,EAAKc,WAAaC,EAAOC,SAASF,SAElCZ,EAAU,WAGDG,EAAYY,QAAU,YAAYV,KAAKP,EAAKQ,QACrDN,EAAU,SAGPA,IAEDD,GACEE,EAAmB,0BAA4BD,EAAU,MAG1DF,EAAKI,aAAa,WACa,UAAhCJ,EAAKkB,aAAa,YAElBf,GAAoB,kBAEtBH,EAAKmB,aAAa,UAAWhB,IAE7BH,EAAKoB,iBAAiB,QAAS,WAC7BC,EAAgBrB,EAAME,OAK5B,SAASoB,IACP,IAIE,IAHA,IAAIC,EAAIC,SAASC,qBAAqB,KAG7BC,EAAI,EAAGA,EAAIH,EAAEI,OAAQD,IAAK,CACjC,IAAI1B,EAAOuB,EAAEG,GACTlB,EAAOR,EAAKkB,aAAa,QAGxBV,IAGAR,EAAKkB,aAAa,YAAe,WAAWX,KAAKC,GAGpDT,EAAYC,GAAM,GAFlBD,EAAYC,GAAM,KAKtB,MAAO4B,GACPC,EAAID,EAAME,QAAS,SAzNzB,IAA4Bf,EAItBc,EAKAE,EAEAC,EAGAC,EAqBAC,EAKAC,EAEAC,EAyBAC,EAGAhC,EAKAgB,OAzEkB,KAFIN,EAoOzBA,UAhOGc,EAAM,SAAUC,EAASQ,GAC3B,IAAIC,EAAkB,SAATD,EAAkBE,QAAQC,KAAOD,QAAQE,KACtD,OAAOH,GAAUA,EAAO,gCAAiCT,IAGvDC,EAAMhB,EAAOS,SAEbQ,EACFD,EAAIY,eAAiBZ,EAAIa,cAAc,iCAuBrCV,GArBAD,EAAU,SAAUY,EAAWP,EAAMQ,GACvC,IAAIC,EAAQf,GAAiBA,EAAcgB,QAAQH,GAGnD,MAAa,SAATP,GAA8B,SAAVS,GAA8B,UAAVA,EAE1B,SAATT,EAAwBQ,EAGpB,UAATR,GAAoBS,EACfA,EACJE,MAAM,KACNC,IAAI,SAAUC,GACb,OAAOA,EAAKC,SAEbC,OAAOC,SACM,UAAThB,GAEFS,GAF2BD,EAXf,SAAVC,IAgBgB,UAAW,QAAS,CAC7C,WACA,SACA,cAEEZ,EAAWF,EAAQ,WAAY,QAAQ,GAEvCG,EAAU,CAEZvB,UAA8C,EAApCqB,EAAaqB,QAAQ,YAC/BtC,QAA0C,EAAlCiB,EAAaqB,QAAQ,UAC7BjD,WAAgD,EAArC4B,EAAaqB,QAAQ,aAEhC7C,oBAAqBuB,EAAQ,aAAc,QAAS,CAClD,MACA,MACA,OACA,OACA,MACA,MACA,QAKFuB,MAAOvB,EAAQ,WAAY,QAAQ,GAEnCwB,gBAAiBtB,EAEjBuB,iBAAkBvB,GAGhBE,EAAWJ,EAAQ,WAAY,SAAU,iBAKlB,KAFvB5B,EAAc+B,IAGhBP,EAAI,2CAA4C,QAE9CR,EAAkB,SAASA,EAAgBsC,EAASrB,GACtD,IACE,IAAKqB,EAAS,OAAO9B,EAAI,oBACzB,IAAI+B,GAAO,EAEPC,EAAW,WACRD,GAASD,EAAQvD,aAAa,YACjCoB,SAASR,SAAW2C,EAAQzC,aAAa,SAC3C0C,GAAO,GAGT,GAAI7C,EAAOsB,IAAatB,EAAOsB,EAAW,WAAY,CACpD,IAWMyB,EAXFhD,EAAW6C,EAAQ7C,SACnBF,EAAW+C,EAAQ/C,SAGnBmD,EAAW,CACbP,MAAOG,EAAQzC,aAAa,UAAY8C,WAEtCC,EAAMN,EAAQnD,MAAQwD,UAEtBE,GAAW,EAMf,GALI7D,EAAYmD,OAASG,EAAQvD,aAAa,WAE5B,KADZ0D,EAAWH,EAAQzC,aAAa,SAASkC,UACzBc,GAAW,IAG7BA,EACFC,EAAQL,OAER,OAAQxB,GACN,IAAK,WACH6B,EAAQrD,GAAYT,EAAYoD,gBAAkB7C,EAAW,IAC7DmD,EAASE,IAAMA,EACf,MAEF,IAAK,WACHE,EAAQ9D,EAAYqD,iBAChB5C,EAAWF,EACXA,EAASqC,MAAM,KAAKmB,MACxBL,EAASE,IAAMA,EACf,MAEF,IAAK,QACH,IACAE,GADWR,EAAQzC,aAAa,QAClB+B,MAAM,KAAK,IAAM,IAAIA,MAAM,KAAK,GAC9Cc,EAASM,MAAQF,EAMvB,IAAIG,EACFhC,EACA,IACA6B,EAAMI,QAAQ,eAAgB,KAAKA,QAAQ,aAAc,IAM3D,OAJAxD,EAAOsB,GAAUiC,EAAOP,EAAUF,GAElChC,EAAI,aAAeyC,GAEH,UAAThC,EACHuB,IACA9C,EAAOyD,WAAWX,EAAU,KAGhC,OADAhC,EAAIQ,EAAW,kBAAmB,QAC3BwB,IAET,MAAOjC,GACPC,EAAID,EAAME,QAAS,UAIvBf,EAAOM,gBAAkBA,EAyEF,UAAnBU,EAAI0C,YAA6C,aAAnB1C,EAAI0C,WACpCnD,IAEAE,SAASJ,iBAAiB,mBAAoB,SAAU+C,GACtB,aAA5BA,EAAMO,OAAOD,YAA2BnD"} \ No newline at end of file +{"version":3,"file":"auto-events.source.js","sources":["auto-events.source.js"],"sourcesContent":["(function saAutomatedEvents(window) {\n // Skip server side rendered pages\n if (typeof window === \"undefined\") return;\n\n var log = function (message, type) {\n var logger = type === \"warn\" ? console.warn : console.info;\n return logger && logger(\"Simple Analytics auto events:\", message);\n };\n\n var doc = window.document;\n\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"auto-events.js\"]');\n\n var setting = function (attribute, type, defaultValue) {\n var value = scriptElement && scriptElement.dataset[attribute];\n\n // Booleans\n if (type === \"bool\" && (value === \"true\" || value === \"false\"))\n return value === \"true\";\n else if (type === \"bool\") return defaultValue;\n\n // Arrays\n if (type === \"array\" && value)\n return value\n .split(\",\")\n .map(function (item) {\n return item.trim();\n })\n .filter(Boolean);\n else if (type === \"array\") return defaultValue;\n\n return value || defaultValue;\n };\n\n var collectTypes = setting(\"collect\", \"array\", [\n \"outbound\",\n \"emails\",\n \"downloads\",\n \"phones\",\n ]);\n var fullUrls = setting(\"fullUrls\", \"bool\", false);\n\n var options = {\n // What to collect\n outbound: collectTypes.indexOf(\"outbound\") > -1,\n emails: collectTypes.indexOf(\"emails\") > -1,\n downloads: collectTypes.indexOf(\"downloads\") > -1,\n phones: collectTypes.indexOf(\"phones\") > -1,\n // Downloads: enter file extensions you want to collect\n downloadsExtensions: setting(\"extensions\", \"array\", [\n \"pdf\",\n \"csv\",\n \"docx\",\n \"xlsx\",\n \"zip\",\n \"doc\",\n \"xls\",\n ]),\n\n // All: use title attribute if set for event name (for all events)\n // THIS TAKES PRECEDENCE OVER OTHER SETTINGS BELOW\n title: setting(\"useTitle\", \"bool\", true),\n // Outbound: use full URL of the links? false for just the hostname\n outboundFullUrl: fullUrls,\n // Downloads: if taking event name from URL, use full URL or just filename (default)\n downloadsFullUrl: fullUrls,\n };\n\n var saGlobal = setting(\"saGlobal\", \"string\", \"sa_event\");\n\n // For compiling the script\n var optionsLink = options;\n\n if (typeof optionsLink === \"undefined\")\n log(\"options object not found, please specify\", \"warn\");\n\n var saAutomatedLink = function saAutomatedLink(element, type) {\n try {\n if (!element) return log(\"no element found\");\n var sent = false;\n\n var callback = function () {\n if (\n !sent &&\n (!element.hasAttribute(\"target\") ||\n element.getAttribute(\"target\") === \"_self\")\n )\n document.location = element.getAttribute(\"href\");\n sent = true;\n };\n\n if (window[saGlobal] && window[saGlobal + \"_loaded\"]) {\n var hostname = element.hostname;\n var pathname = element.pathname;\n\n var event;\n var metadata = {\n title: element.getAttribute(\"title\") || undefined,\n };\n var url = element.href || undefined;\n\n var useTitle = false;\n if (optionsLink.title && element.hasAttribute(\"title\")) {\n var theTitle = element.getAttribute(\"title\").trim();\n if (theTitle != \"\") useTitle = true;\n }\n\n if (useTitle) {\n event = theTitle;\n } else {\n switch (type) {\n case \"outbound\": {\n event = hostname + (optionsLink.outboundFullUrl ? pathname : \"\");\n metadata.url = url;\n break;\n }\n case \"download\": {\n event = optionsLink.downloadsFullUrl\n ? hostname + pathname\n : pathname.split(\"/\").pop();\n metadata.url = url;\n break;\n }\n case \"email\": {\n var href = element.getAttribute(\"href\");\n event = (href.split(\":\")[1] || \"\").split(\"?\")[0];\n metadata.email = event;\n break;\n }\n case \"phone\": {\n var hrefPhone = element.getAttribute(\"href\");\n event = (hrefPhone.split(\":\")[1] || \"\").split(\"?\")[0];\n metadata.phone = event;\n break;\n }\n }\n }\n\n var clean =\n type +\n \"_\" +\n event.replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_+|_+$)/g, \"\");\n\n window[saGlobal](clean, metadata, callback);\n\n log(\"collected \" + clean);\n\n return type === \"email\" || type === \"phone\"\n ? callback()\n : window.setTimeout(callback, 5000);\n } else {\n log(saGlobal + \" is not defined\", \"warn\");\n return callback();\n }\n } catch (error) {\n log(error.message, \"warn\");\n }\n };\n\n window.saAutomatedLink = saAutomatedLink;\n\n function collectLink(link, onclick) {\n if (link.hasAttribute(\"data-simple-event\")) return;\n var collect = false;\n\n // Collect download clicks\n if (\n optionsLink.downloads &&\n /^https?:\\/\\//i.test(link.href) &&\n new RegExp(\n \"\\\\.(\" + (optionsLink.downloadsExtensions || []).join(\"|\") + \")$\",\n \"i\"\n ).test(link.pathname)\n ) {\n collect = \"download\";\n\n // Collect outbound links clicks\n } else if (\n optionsLink.outbound &&\n /^https?:\\/\\//i.test(link.href) &&\n link.hostname !== window.location.hostname\n ) {\n collect = \"outbound\";\n\n // Collect email clicks\n } else if (optionsLink.emails && /^mailto:/i.test(link.href)) {\n collect = \"email\";\n\n // Collect telephone clicks\n } else if (optionsLink.phones && /^tel:/i.test(link.href)) {\n collect = \"phone\";\n }\n\n if (!collect) return;\n\n if (onclick) {\n var onClickAttribute = \"saAutomatedLink(this, '\" + collect + \"');\";\n\n if (\n !link.hasAttribute(\"target\") ||\n link.getAttribute(\"target\") === \"_self\"\n )\n onClickAttribute += \" return false;\";\n\n link.setAttribute(\"onclick\", onClickAttribute);\n } else {\n link.addEventListener(\"click\", function () {\n saAutomatedLink(this, collect);\n });\n }\n }\n\n function onDOMContentLoaded() {\n try {\n var a = document.getElementsByTagName(\"a\");\n\n // Loop over all links on the page\n for (var i = 0; i < a.length; i++) {\n var link = a[i];\n var href = link.getAttribute(\"href\");\n\n // Skip links that don't have an href\n if (!href) continue;\n\n // We don't want to overwrite website behaviour so we check for the onclick attribute\n if (\n !link.getAttribute(\"onclick\") &&\n !/^mailto:/.test(href) &&\n !/^tel:/.test(href)\n ) {\n collectLink(link, true);\n } else {\n collectLink(link, false);\n }\n }\n } catch (error) {\n log(error.message, \"warn\");\n }\n }\n\n if (doc.readyState === \"ready\" || doc.readyState === \"complete\") {\n onDOMContentLoaded();\n } else {\n document.addEventListener(\"readystatechange\", function (event) {\n if (event.target.readyState === \"complete\") onDOMContentLoaded();\n });\n }\n})(window);\n"],"names":["collectLink","link","onclick","collect","onClickAttribute","hasAttribute","optionsLink","downloads","test","href","RegExp","downloadsExtensions","join","pathname","outbound","hostname","window","location","emails","phones","getAttribute","setAttribute","addEventListener","saAutomatedLink","this","onDOMContentLoaded","a","document","getElementsByTagName","i","length","error","log","message","doc","scriptElement","setting","collectTypes","fullUrls","options","saGlobal","type","logger","console","warn","info","currentScript","querySelector","attribute","defaultValue","value","dataset","split","map","item","trim","filter","Boolean","indexOf","title","outboundFullUrl","downloadsFullUrl","element","sent","callback","theTitle","metadata","undefined","url","useTitle","event","pop","email","phone","clean","replace","setTimeout","readyState","target"],"mappings":"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"} \ No newline at end of file diff --git a/dist/v12/custom/light.js b/dist/v12/custom/light.js index 628e1ceb..b36d86ae 100644 --- a/dist/v12/custom/light.js +++ b/dist/v12/custom/light.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2025-06-24; d3bf; SRI-version; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-08-12; ede2; SRI-version; v12) */ -!function(l,e,t,f){try{var m=undefined,n="https:",r=l.console,a="doNotTrack",g=l.navigator,i=l.location,h=i.host,o=l.document,c=g.userAgent,s="Not sending request ",v=!1,u=encodeURIComponent,p=decodeURIComponent,d=JSON.stringify,y=l.addEventListener,_="https://"+t,b=(o.documentElement,"language"),w=g.userAgentData,O="platform",S="platformVersion",j="https://docs.simpleanalytics.com",k=/(bot|spider|crawl)/i.test(c)&&!/(cubot)/i.test(c),x=o.currentScript||o.querySelector('script[src*="'+t+'"]');f=function(){var e=[].slice.call(arguments);return e.unshift("Simple Analytics:"),Function.prototype.apply.call(r.warn,r,e)};var E=function(e){return"string"==typeof e},A=function(e,t){return e&&e.getAttribute("data-"+t)},$=function(){for(var e,t,n,r={},a=arguments,i=0;i>e/4).toString(16)})}catch(r){return e.replace(n,function(e){var t=16*Math.random()|0;return(e<2?t:3&t|8).toString(16)})}},N=function(e){return"function"==typeof e},R="namespace",U=e[R]||A(x,R)||"sa",V=e.strictUtm||"true"==A(x,"strict-utm"),B=function(t,e){return(e||i.search).slice(1).split("&").filter(function(e){return!t&&new RegExp("^((utm_)"+(V?"":"?")+"(source|medium|content|term|campaign)"+(V?"":"|ref")+")=").test(e)}).join("&")||m},C=U+"_loaded";if(1==l[C])return f(s+"twice");l.sa_event_loaded=!0,l[C]=!0;var H,T=function(t,e,n){t=n?t:$(L,P,t),g.brave&&!n&&(t.brave=!0),g._duckduckgoloader_&&!n&&(t.duck=!0),(new Image).src=_+"/simple.gif?"+Object.keys(t).filter(function(e){return t[e]!=m}).map(function(e){return u(e)+"="+u(t[e])}).join("&")+"&time="+Date.now()},F=e.hostname||A(x,"hostname"),z=F||h,J={version:"custom_light_12",hostname:z};e.mode||A(x,"mode");try{H=Intl.DateTimeFormat().resolvedOptions().timeZone}catch(X){f(X)}k&&(J.bot=!0);var L=$(J,{ua:c,https:i.protocol==n,timezone:H,page_id:I(),session_id:I()});if(L.sri=!0,w&&(L.mobile=w.mobile,L.brands=d(w.brands)),z!==h&&(L.hostname_original=h),a in g&&"1"==g[a])return f("Not sending request when "+a+" is enabled. See "+j+"/dnt");-1!=h.indexOf(".")&&!/^[0-9.:]+$/.test(h)||F||f("Set hostname on "+h+". See "+j+"/overwrite-domain-name");var M,P={},Z=(e.referrer||A(x,"referrer")||o.referrer||"").replace(h,z).replace(/^https?:\/\/((m|l|w{2,3}([0-9]+)?)\.)?([^?#]+)(.*)$/,"$4").replace(/^([^/]+)$/,"$1")||m,G=function(e,t){var n=$(J,{type:"append",original_id:t?e:L.page_id});if(t||!g.sendBeacon)T(n,0,!0);else try{g.sendBeacon.bind(g)(_+"/append",d(n))}catch(r){T(n,0,!0)}};y("pagehide",G,!1);var K,Q,W=function(e){var t="";try{t=e||p(i.pathname)}catch(X){f(X)}return t};!function(t,e,n,r){!r&&N(n)&&(r=n);var a,i;N(r);E(e)&&-1"); +!function(l,e,t,f){try{var u=undefined,n="https:",r=l.console,i="doNotTrack",m=l.navigator,p=l.location,g=p.host,a=l.document,o=m.userAgent,c="Not sending request ",h=!1,s=encodeURIComponent,d=decodeURIComponent,v=JSON.stringify,y=l.addEventListener,_="https://"+t,b=(a.documentElement,"language"),w=m.userAgentData,O="platform",S="platformVersion",j="https://docs.simpleanalytics.com",k=/(bot|spider|crawl)/i.test(o)&&!/(cubot)/i.test(o),x=a.currentScript||a.querySelector('script[src*="'+t+'"]');f=function(){var e=[].slice.call(arguments);return e.unshift("Simple Analytics:"),Function.prototype.apply.call(r.warn,r,e)};var E=function(e){return"string"==typeof e},A=function(e,t){return e&&e.getAttribute("data-"+t)},$=function(){for(var e,t,n,r={},i=arguments,a=0;a>e/4).toString(16)})}catch(r){return e.replace(n,function(e){var t=16*Math.random()|0;return(e<2?t:3&t|8).toString(16)})}},N=function(e){return"function"==typeof e},R="namespace",U=e[R]||A(x,R)||"sa",V=e.strictUtm||"true"==A(x,"strict-utm"),B=U+"_loaded";if(1==l[B])return f(c+"twice");l.sa_event_loaded=!0,l[B]=!0;var C,H=function(t,e,n){t=n?t:$(J,M,t),m.brave&&!n&&(t.brave=!0),m._duckduckgoloader_&&!n&&(t.duck=!0),(new Image).src=_+"/simple.gif?"+Object.keys(t).filter(function(e){return t[e]!=u}).map(function(e){return s(e)+"="+s(t[e])}).join("&")+"&time="+Date.now()},T=e.hostname||A(x,"hostname"),F=T||g,z={version:"custom_light_12",hostname:F};e.mode||A(x,"mode");try{C=Intl.DateTimeFormat().resolvedOptions().timeZone}catch(X){f(X)}k&&(z.bot=!0);var J=$(z,{ua:o,https:p.protocol==n,timezone:C,page_id:I(),session_id:I()});if(J.sri=!0,w&&(J.mobile=w.mobile,J.brands=v(w.brands)),F!==g&&(J.hostname_original=g),i in m&&"1"==m[i])return f("Not sending request when "+i+" is enabled. See "+j+"/dnt");-1!=g.indexOf(".")&&!/^[0-9.:]+$/.test(g)||T||f("Set hostname on "+g+". See "+j+"/overwrite-domain-name");var L,M={},P=(e.referrer||A(x,"referrer")||a.referrer||"").replace(g,F).replace(/^https?:\/\/((m|l|w{2,3}([0-9]+)?)\.)?([^?#]+)(.*)$/,"$4").replace(/^([^/]+)$/,"$1")||u,Z=function(e,t){var n=$(z,{type:"append",original_id:t?e:J.page_id});if(t||!m.sendBeacon)H(n,0,!0);else try{m.sendBeacon.bind(m)(_+"/append",v(n))}catch(r){H(n,0,!0)}};y("pagehide",Z,!1);var G,K,Q=function(e){var t="";try{t=e||d(p.pathname)}catch(X){f(X)}return t},W=function(e,t,n,r,i,a){e&&Z(""+J.page_id,!0),J.page_id=I();var o,c=F+Q(),s=(o=t,(r||p.search).slice(1).split("&").filter(function(e){return!o&&new RegExp("^((utm_)"+(V?"":"?")+"(source|medium|content|term|campaign)"+(V?"":"|ref")+")=","i").test(e)}).join("&")||u);H({id:J.page_id,type:"pageview",referrer:!t||n?P:null,query:s}),P=c,0};!function(e,t,n,r){!r&&N(n)&&(r=n);var i,a;N(r);E(t)&&-1"); //# sourceMappingURL=light.js.map \ No newline at end of file diff --git a/dist/v12/custom/light.js.map b/dist/v12/custom/light.js.map index f64f97aa..4563a96f 100644 --- a/dist/v12/custom/light.js.map +++ b/dist/v12/custom/light.js.map @@ -1 +1 @@ -{"version":3,"file":"light.source.js","sources":["light.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n\n var collectMetricByString = function (metricAbbreviation) {\n // eslint-disable-next-line no-unreachable\n return true;\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n return (\n (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n if (ignore) return falseVar;\n // eslint-disable-next-line no-redeclare\n var regex =\n \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \")=\";\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex).test(keyValue);\n })\n .join(\"&\") || undefinedVar\n );\n };\n\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n\n\n\n\n\n\n\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n // eslint-disable-next-line no-redeclare\n var bot = isBotAgent;\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = trueVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n\n\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n query,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query || getQueryParams(deleteSourceInfo),\n\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n sameSite = referrer\n ? referrer.split(slash)[0] == locationHostname\n : falseVar;\n\n\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch ? getQueryParams(delSrc, querySearch) : undefinedVar,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n\n\n pageview();\n\n } catch (e) {\n warn(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_light_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","warn","undefinedVar","undefined","https","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","language","documentElement","uaData","userAgentData","platformText","platformVersionText","docsUrl","isBotAgent","test","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","isString","string","attr","attribute","getAttribute","assign","obj","prop","object","to","arg","index","length","nextSource","constructor","Object","nextKey","hasOwnProperty","settings","sa_settings","logSettings","keys","Date","now","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","replace","c","getRandomValues","Uint8Array","toString","error","r","Math","random","isFunction","func","namespaceText","namespace","strictUtm","getQueryParams","ignoreSource","overwriteSearch","search","split","filter","keyValue","RegExp","join","loadedVariable","sa_event_loaded","timezone","sendData","data","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","Image","src","key","map","overwrittenHostname","hostname","definedHostname","basePayload","version","mode","Intl","DateTimeFormat","resolvedOptions","timeZone","bot","ua","protocol","page_id","session_id","sri","mobile","brands","hostname_original","indexOf","lastSendPath","referrer","sendOnLeave","id","push","append","type","original_id","sendBeacon","bind","e","sameSite","userNavigated","getPath","overwrite","path","pathname","isPushState","pathOverwrite","metadata","callbackRaw","querySearch","parts","shift","performaceEntryType","perf","performance","navigationText","getEntriesByType","triggerSendPageView","delSrc","deleteSourceInfo","query","currentPage","pages","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","pageview"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"light.source.js","sources":["light.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n\n var collectMetricByString = function (metricAbbreviation) {\n // eslint-disable-next-line no-unreachable\n return true;\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n if (ignore) return falseVar;\n // eslint-disable-next-line no-redeclare\n var regex =\n \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \")=\";\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n return q || undefinedVar;\n };\n\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n\n\n\n\n\n\n\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n // eslint-disable-next-line no-redeclare\n var bot = isBotAgent;\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = trueVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n\n\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n sameSite = referrer\n ? referrer.split(slash)[0] == locationHostname\n : falseVar;\n\n\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n\n\n pageview();\n\n } catch (e) {\n warn(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_light_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","warn","undefinedVar","undefined","https","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","language","documentElement","uaData","userAgentData","platformText","platformVersionText","docsUrl","isBotAgent","test","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","isString","string","attr","attribute","getAttribute","assign","obj","prop","object","to","arg","index","length","nextSource","constructor","Object","nextKey","hasOwnProperty","settings","sa_settings","logSettings","keys","Date","now","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","replace","c","getRandomValues","Uint8Array","toString","error","r","Math","random","isFunction","func","namespaceText","namespace","strictUtm","loadedVariable","sa_event_loaded","timezone","sendData","data","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","Image","src","filter","key","map","join","overwrittenHostname","hostname","definedHostname","basePayload","version","mode","Intl","DateTimeFormat","resolvedOptions","timeZone","bot","ua","protocol","page_id","session_id","sri","mobile","brands","hostname_original","indexOf","lastSendPath","referrer","sendOnLeave","id","push","append","type","original_id","sendBeacon","bind","e","sameSite","userNavigated","getPath","overwrite","path","pathname","sendPageView","isPushState","deleteSourceInfo","search","metadata","ignoreSource","currentPage","query","split","keyValue","RegExp","pages","pathOverwrite","callbackRaw","querySearch","parts","shift","performaceEntryType","perf","performance","navigationText","getEntriesByType","triggerSendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","pageview"],"mappings":"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"} \ No newline at end of file diff --git a/dist/v12/custom/proxy.js b/dist/v12/custom/proxy.js index fefde6a6..705a296f 100644 --- a/dist/v12/custom/proxy.js +++ b/dist/v12/custom/proxy.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2025-06-24; 7647; SRI-version; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-08-12; 4adc; SRI-version; v12) */ -!function(d,t,e,n,m){try{var g=undefined,v=!0,y=!1,r="true",a="https:",_="pageview",u="event",i="error",o=d.console,c="doNotTrack",w=d.navigator,s=d.location,b=s.host,l=d.document,p=w.userAgent,f="Not sending request ",h=f+"when ",x=y,O=encodeURIComponent,E=decodeURIComponent,S=JSON.stringify,M=d.addEventListener,k="https://"+e,A=l.documentElement||{},q="language",$="Height",j="scroll",D=w.userAgentData,C=j+$,H="offset"+$,P="client"+$,R="pagehide",T="platform",U="platformVersion",I="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),N=d.screen,z=l.currentScript||l.querySelector('script[src*="'+e+'"]');m=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){m("Error in your "+t+" function:",e)},W=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},G=function(t){return"string"==typeof t},J=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},L=function(t,e){return t&&t.getAttribute("data-"+e)},Y=function(t){return Array.isArray(t)?t:G(t)&&t.length?t.split(/, ?/):[]},Z=function(t){return t&&t.constructor===Object},K=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},at=function(t){return"function"==typeof t},it="namespace",ot=t[it]||L(z,it)||"sa",ct=function(t,e){var n=d[ot+"_metadata"];Z(n)&&(t=K(t,n));var r=d[Mt];if(!at(r))return Mt&&m(Mt+" not found, set window."+Mt),t;try{return K(t,r.call(d,K(t,e)))}catch(a){F("metadata",a)}},st=t.strictUtm||L(z,"strict-utm")==r,ut=function(a,t){return(t||s.search).slice(1).split("&").filter(function(t){var e=a||!et("ut"),n=Ot.map(J).join("|"),r=e?"^("+n+")=":"^((utm_)"+(st?"":"?")+"(source|medium|content|term|campaign)"+(st?"":"|ref")+"|"+n+")=";return e&&!Ot.length?y:new RegExp(r).test(t)}).join("&")||g},lt=ot+"_loaded";if(d[lt]==v)return m(f+"twice");d.sa_event_loaded=v,d[lt]=v;var pt=function(e,t,n){e=n?e:K($t,Ct,e),w.brave&&!n&&(e.brave=v),w._duckduckgoloader_&&!n&&(e.duck=v);var r=new Image;t&&(r.onerror=t,r.onload=t),r.src=k+"/simple.gif?"+Object.keys(e).filter(function(t){return e[t]!=g}).map(function(t){return O(t)+"="+O(e[t])}).join("&")+"&time="+Date.now()},ft=t.hostname||L(z,"hostname"),ht=ft||b,dt={version:"custom_proxy_12",hostname:ht};n=function(t){t=t.stack?t+" "+t.stack:t,m(t),pt(K(dt,{type:i,error:t,path:s.pathname}),g,v)},M(i,function(t){t.filename&&-1"); +!function(d,t,e,n,m){try{var v=undefined,g=!0,y=!1,r="true",a="https:",_="pageview",u="event",i="error",o=d.console,c="doNotTrack",w=d.navigator,s=d.location,b=s.host,l=d.document,p=w.userAgent,f="Not sending request ",h=f+"when ",x=y,O=encodeURIComponent,E=decodeURIComponent,S=JSON.stringify,M=d.addEventListener,k="https://"+e,A=l.documentElement||{},q="language",$="Height",j="scroll",D=w.userAgentData,C=j+$,H="offset"+$,P="client"+$,R="pagehide",T="platform",U="platformVersion",I="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),N=d.screen,z=l.currentScript||l.querySelector('script[src*="'+e+'"]');m=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){m("Error in your "+t+" function:",e)},W=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},G=function(t){return"string"==typeof t},J=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},L=function(t,e){return t&&t.getAttribute("data-"+e)},Y=function(t){return Array.isArray(t)?t:G(t)&&t.length?t.split(/, ?/):[]},Z=function(t){return t&&t.constructor===Object},K=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},it=function(t){return"function"==typeof t},ot="namespace",ct=t[ot]||L(z,ot)||"sa",st=function(t,e){var n=d[ct+"_metadata"];Z(n)&&(t=K(t,n));var r=d[kt];if(!it(r))return kt&&m(kt+" not found, set window."+kt),t;try{return K(t,r.call(d,K(t,e)))}catch(a){F("metadata",a)}},ut=t.strictUtm||L(z,"strict-utm")==r,lt=function(i,t){tt=!i&&nt("p")?"":y;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");tt!==y&&0"); //# sourceMappingURL=proxy.js.map \ No newline at end of file diff --git a/dist/v12/custom/proxy.js.map b/dist/v12/custom/proxy.js.map index e7e6496d..255b099d 100644 --- a/dist/v12/custom/proxy.js.map +++ b/dist/v12/custom/proxy.js.map @@ -1 +1 @@ -{"version":3,"file":"proxy.source.js","sources":["proxy.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n return (\n (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex).test(keyValue);\n })\n .join(\"&\") || undefinedVar\n );\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = trueVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n query,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query || getQueryParams(deleteSourceInfo),\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch ? getQueryParams(delSrc, querySearch) : undefinedVar,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_proxy_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","search","keyValue","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","indexOf","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","protocol","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","i","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","query","currentPage","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue","q"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"proxy.source.js","sources":["proxy.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var p;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n p = !ignoreSource && collectMetricByString(\"p\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (p !== falseVar && i > 0 && keyValue.slice(i + 1))\n p += (p ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n p = p || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = trueVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n p: p,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_proxy_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","p","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","protocol","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue"],"mappings":"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"} \ No newline at end of file diff --git a/dist/v12/light.js b/dist/v12/light.js index d8233766..00e082d9 100644 --- a/dist/v12/light.js +++ b/dist/v12/light.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2025-06-24; 95f8; SRI-version; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-08-12; 12b3; SRI-version; v12) */ -!function(l,e,t,f){try{var m=undefined,n="https:",r=l.console,a="doNotTrack",g=l.navigator,i=l.location,h=i.host,o=l.document,c=g.userAgent,s="Not sending request ",v=!1,u=encodeURIComponent,p=decodeURIComponent,d=JSON.stringify,y=l.addEventListener,_="https://queue."+t,b=(o.documentElement,"language"),w=g.userAgentData,O="platform",S="platformVersion",j="https://docs.simpleanalytics.com",k=/(bot|spider|crawl)/i.test(c)&&!/(cubot)/i.test(c),E=o.currentScript||o.querySelector('script[src*="'+t+'"]');f=function(){var e=[].slice.call(arguments);return e.unshift("Simple Analytics:"),Function.prototype.apply.call(r.warn,r,e)};var q=function(e){return"string"==typeof e},x=function(e,t){return e&&e.getAttribute("data-"+t)},A=function(){for(var e,t,n,r={},a=arguments,i=0;i>e/4).toString(16)})}catch(r){return e.replace(n,function(e){var t=16*Math.random()|0;return(e<2?t:3&t|8).toString(16)})}},N=function(e){return"function"==typeof e},R="namespace",U=e[R]||x(E,R)||"sa",V=e.strictUtm||"true"==x(E,"strict-utm"),B=function(t,e){return(e||i.search).slice(1).split("&").filter(function(e){return!t&&new RegExp("^((utm_)"+(V?"":"?")+"(source|medium|content|term|campaign)"+(V?"":"|ref")+")=").test(e)}).join("&")||m},C=U+"_loaded";if(1==l[C])return f(s+"twice");l.sa_event_loaded=!0,l[C]=!0;var T,F=function(t,e,n){t=n?t:A(L,P,t),g.brave&&!n&&(t.brave=!0),g._duckduckgoloader_&&!n&&(t.duck=!0),(new Image).src=_+"/simple.gif?"+Object.keys(t).filter(function(e){return t[e]!=m}).map(function(e){return u(e)+"="+u(t[e])}).join("&")+"&time="+Date.now()},H=e.hostname||x(E,"hostname"),z=H||h,J={version:"cdn_light_12",hostname:z};e.mode||x(E,"mode");try{T=Intl.DateTimeFormat().resolvedOptions().timeZone}catch(X){f(X)}k&&(J.bot=!0);var L=A(J,{ua:c,https:i.protocol==n,timezone:T,page_id:I(),session_id:I()});if(L.sri=!0,w&&(L.mobile=w.mobile,L.brands=d(w.brands)),z!==h&&(L.hostname_original=h),a in g&&"1"==g[a])return f("Not sending request when "+a+" is enabled. See "+j+"/dnt");-1!=h.indexOf(".")&&!/^[0-9.:]+$/.test(h)||H||f("Set hostname on "+h+". See "+j+"/overwrite-domain-name");var M,P={},Z=(e.referrer||x(E,"referrer")||o.referrer||"").replace(h,z).replace(/^https?:\/\/((m|l|w{2,3}([0-9]+)?)\.)?([^?#]+)(.*)$/,"$4").replace(/^([^/]+)$/,"$1")||m,G=function(e,t){var n=A(J,{type:"append",original_id:t?e:L.page_id});if(t||!g.sendBeacon)F(n,0,!0);else try{g.sendBeacon.bind(g)(_+"/append",d(n))}catch(r){F(n,0,!0)}};y("pagehide",G,!1);var K,Q,W=function(e){var t="";try{t=e||p(i.pathname)}catch(X){f(X)}return t};!function(t,e,n,r){!r&&N(n)&&(r=n);var a,i;N(r);q(e)&&-1>e/4).toString(16)})}catch(r){return e.replace(n,function(e){var t=16*Math.random()|0;return(e<2?t:3&t|8).toString(16)})}},N=function(e){return"function"==typeof e},R="namespace",U=e[R]||x(E,R)||"sa",V=e.strictUtm||"true"==x(E,"strict-utm"),B=U+"_loaded";if(1==l[B])return f(c+"twice");l.sa_event_loaded=!0,l[B]=!0;var C,T=function(t,e,n){t=n?t:A(J,M,t),m.brave&&!n&&(t.brave=!0),m._duckduckgoloader_&&!n&&(t.duck=!0),(new Image).src=_+"/simple.gif?"+Object.keys(t).filter(function(e){return t[e]!=u}).map(function(e){return s(e)+"="+s(t[e])}).join("&")+"&time="+Date.now()},F=e.hostname||x(E,"hostname"),H=F||g,z={version:"cdn_light_12",hostname:H};e.mode||x(E,"mode");try{C=Intl.DateTimeFormat().resolvedOptions().timeZone}catch(X){f(X)}k&&(z.bot=!0);var J=A(z,{ua:o,https:p.protocol==n,timezone:C,page_id:I(),session_id:I()});if(J.sri=!0,w&&(J.mobile=w.mobile,J.brands=v(w.brands)),H!==g&&(J.hostname_original=g),a in m&&"1"==m[a])return f("Not sending request when "+a+" is enabled. See "+j+"/dnt");-1!=g.indexOf(".")&&!/^[0-9.:]+$/.test(g)||F||f("Set hostname on "+g+". See "+j+"/overwrite-domain-name");var L,M={},P=(e.referrer||x(E,"referrer")||i.referrer||"").replace(g,H).replace(/^https?:\/\/((m|l|w{2,3}([0-9]+)?)\.)?([^?#]+)(.*)$/,"$4").replace(/^([^/]+)$/,"$1")||u,Z=function(e,t){var n=A(z,{type:"append",original_id:t?e:J.page_id});if(t||!m.sendBeacon)T(n,0,!0);else try{m.sendBeacon.bind(m)(_+"/append",v(n))}catch(r){T(n,0,!0)}};y("pagehide",Z,!1);var G,K,Q=function(e){var t="";try{t=e||d(p.pathname)}catch(X){f(X)}return t},W=function(e,t,n,r,a,i){e&&Z(""+J.page_id,!0),J.page_id=I();var o,c=H+Q(),s=(o=t,(r||p.search).slice(1).split("&").filter(function(e){return!o&&new RegExp("^((utm_)"+(V?"":"?")+"(source|medium|content|term|campaign)"+(V?"":"|ref")+")=","i").test(e)}).join("&")||u);T({id:J.page_id,type:"pageview",referrer:!t||n?P:null,query:s}),P=c,0};!function(e,t,n,r){!r&&N(n)&&(r=n);var a,i;N(r);q(t)&&-1> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n return (\n (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n if (ignore) return falseVar;\n // eslint-disable-next-line no-redeclare\n var regex =\n \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \")=\";\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex).test(keyValue);\n })\n .join(\"&\") || undefinedVar\n );\n };\n\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n\n\n\n\n\n\n\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n // eslint-disable-next-line no-redeclare\n var bot = isBotAgent;\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = trueVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n\n\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n query,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query || getQueryParams(deleteSourceInfo),\n\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n sameSite = referrer\n ? referrer.split(slash)[0] == locationHostname\n : falseVar;\n\n\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch ? getQueryParams(delSrc, querySearch) : undefinedVar,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n\n\n pageview();\n\n } catch (e) {\n warn(e);\n }\n})(\n window,\n {},\n \"simpleanalyticscdn.com\",\n \"queue.\",\n \"cdn_light_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","warn","undefinedVar","undefined","https","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","protocol","language","documentElement","uaData","userAgentData","platformText","platformVersionText","docsUrl","isBotAgent","test","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","isString","string","attr","attribute","getAttribute","assign","obj","prop","object","to","arg","index","length","nextSource","constructor","Object","nextKey","hasOwnProperty","settings","sa_settings","logSettings","keys","Date","now","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","replace","c","getRandomValues","Uint8Array","toString","error","r","Math","random","isFunction","func","namespaceText","namespace","strictUtm","getQueryParams","ignoreSource","overwriteSearch","search","split","filter","keyValue","RegExp","join","loadedVariable","sa_event_loaded","timezone","sendData","data","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","Image","src","key","map","overwrittenHostname","hostname","definedHostname","basePayload","version","mode","Intl","DateTimeFormat","resolvedOptions","timeZone","bot","ua","page_id","session_id","sri","mobile","brands","hostname_original","indexOf","lastSendPath","referrer","sendOnLeave","id","push","append","type","original_id","sendBeacon","bind","e","sameSite","userNavigated","getPath","overwrite","path","pathname","isPushState","pathOverwrite","metadata","callbackRaw","querySearch","parts","shift","performaceEntryType","perf","performance","navigationText","getEntriesByType","triggerSendPageView","delSrc","deleteSourceInfo","query","currentPage","pages","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","pageview"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"light.source.js","sources":["light.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n\n var collectMetricByString = function (metricAbbreviation) {\n // eslint-disable-next-line no-unreachable\n return true;\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n if (ignore) return falseVar;\n // eslint-disable-next-line no-redeclare\n var regex =\n \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \")=\";\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n return q || undefinedVar;\n };\n\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n\n\n\n\n\n\n\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n // eslint-disable-next-line no-redeclare\n var bot = isBotAgent;\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = trueVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n\n\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n sameSite = referrer\n ? referrer.split(slash)[0] == locationHostname\n : falseVar;\n\n\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n\n\n pageview();\n\n } catch (e) {\n warn(e);\n }\n})(\n window,\n {},\n \"simpleanalyticscdn.com\",\n \"queue.\",\n \"cdn_light_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","warn","undefinedVar","undefined","https","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","protocol","language","documentElement","uaData","userAgentData","platformText","platformVersionText","docsUrl","isBotAgent","test","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","isString","string","attr","attribute","getAttribute","assign","obj","prop","object","to","arg","index","length","nextSource","constructor","Object","nextKey","hasOwnProperty","settings","sa_settings","logSettings","keys","Date","now","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","replace","c","getRandomValues","Uint8Array","toString","error","r","Math","random","isFunction","func","namespaceText","namespace","strictUtm","loadedVariable","sa_event_loaded","timezone","sendData","data","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","Image","src","filter","key","map","join","overwrittenHostname","hostname","definedHostname","basePayload","version","mode","Intl","DateTimeFormat","resolvedOptions","timeZone","bot","ua","page_id","session_id","sri","mobile","brands","hostname_original","indexOf","lastSendPath","referrer","sendOnLeave","id","push","append","type","original_id","sendBeacon","bind","e","sameSite","userNavigated","getPath","overwrite","path","pathname","sendPageView","isPushState","deleteSourceInfo","search","metadata","ignoreSource","currentPage","query","split","keyValue","RegExp","pages","pathOverwrite","callbackRaw","querySearch","parts","shift","performaceEntryType","perf","performance","navigationText","getEntriesByType","triggerSendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","pageview"],"mappings":"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"} \ No newline at end of file diff --git a/src/default.js b/src/default.js index 4837fba8..651d26a2 100644 --- a/src/default.js +++ b/src/default.js @@ -238,43 +238,59 @@ overwriteOptions.strictUtm || attr(scriptElement, "strict-utm") == trueText; + /** if ignoremetrics **/ + var p; + /** endif **/ + var getQueryParams = function (ignoreSource, overwriteSearch) { - return ( - (overwriteSearch || loc.search) - .slice(1) - .split("&") - .filter(function (keyValue) { - var ignore = ignoreSource || !collectMetricByString("ut"); - - /** if allowparams **/ - var paramsRegexList = allowParams.map(filterRegex).join("|"); - var regex = ignore - ? "^(" + paramsRegexList + ")=" - : "^((utm_)" + - (strictUtm ? "" : "?") + - "(source|medium|content|term|campaign)" + - (strictUtm ? "" : "|ref") + - "|" + - paramsRegexList + - ")="; - if (ignore && !allowParams.length) return falseVar; - /** else **/ - if (ignore) return falseVar; - // eslint-disable-next-line no-redeclare - var regex = - "^((utm_)" + + /** if ignoremetrics **/ + p = !ignoreSource && collectMetricByString("p") ? "" : falseVar; + /** endif **/ + var q = (overwriteSearch || loc.search) + .slice(1) + .split("&") + .filter(function (keyValue) { + /** if ignoremetrics **/ + var i = keyValue.indexOf("="); + if (p !== falseVar && i > 0 && keyValue.slice(i + 1)) + p += (p ? "," : "") + keyValue.slice(0, i); + /** endif **/ + + var ignore = ignoreSource || !collectMetricByString("ut"); + + /** if allowparams **/ + var paramsRegexList = allowParams.map(filterRegex).join("|"); + var regex = ignore + ? "^(" + paramsRegexList + ")=" + : "^((utm_)" + (strictUtm ? "" : "?") + "(source|medium|content|term|campaign)" + (strictUtm ? "" : "|ref") + + "|" + + paramsRegexList + ")="; - /** endif **/ + if (ignore && !allowParams.length) return falseVar; + /** else **/ + if (ignore) return falseVar; + // eslint-disable-next-line no-redeclare + var regex = + "^((utm_)" + + (strictUtm ? "" : "?") + + "(source|medium|content|term|campaign)" + + (strictUtm ? "" : "|ref") + + ")="; + /** endif **/ - // The prefix "utm_" is optional with "strictUtm" disabled - // "ref" is only collected when "strictUtm" is disabled - return new RegExp(regex, "i").test(keyValue); - }) - .join("&") || undefinedVar - ); + // The prefix "utm_" is optional with "strictUtm" disabled + // "ref" is only collected when "strictUtm" is disabled + return new RegExp(regex, "i").test(keyValue); + }) + .join("&"); + + /** if ignoremetrics **/ + p = p || undefinedVar; + /** endif **/ + return q || undefinedVar; }; /** if ignorepages **/ @@ -756,7 +772,7 @@ isPushState, deleteSourceInfo, sameSite, - query, + search, metadata, callback ) { @@ -764,13 +780,17 @@ if (collectDataOnLeave) payload.page_id = uuid(); var currentPage = definedHostname + getPath(); + var query = getQueryParams(deleteSourceInfo, search); sendData( { id: payload.page_id, type: pageviewText, referrer: !deleteSourceInfo || sameSite ? referrer : null, - query: query || getQueryParams(deleteSourceInfo), + query: query, + /** if ignoremetrics **/ + p: p, + /** endif **/ /** if metadata **/ metadata: stringify(metadata), @@ -896,7 +916,7 @@ isPushState, delSrc, // r = referrers sameSite, - querySearch ? getQueryParams(delSrc, querySearch) : undefinedVar, + querySearch, metadata, callback ); diff --git a/test/unit/pageview-query.test.js b/test/unit/pageview-query.test.js index 363641de..25a11f57 100644 --- a/test/unit/pageview-query.test.js +++ b/test/unit/pageview-query.test.js @@ -37,4 +37,42 @@ describe("pageview query", function () { done(); }, 10); }); + + it("sends non-empty parameter names without their values", function (done) { + const dom = createDOM({ + settings: { autoCollect: false }, + }); + + dom.window.sa_pageview("/manual?gclid=secret&foo=another&empty=&flag"); + + setTimeout(() => { + const req = dom.sent.find( + (r) => r.type === "image" && /path=%2Fmanual/.test(r.url) + ); + expect(req, "pageview request").to.exist; + const url = new URL(req.url); + expect(url.searchParams.get("p")).to.equal("gclid,foo"); + expect(req.url).not.to.include("secret"); + expect(req.url).not.to.include("another"); + done(); + }, 10); + }); + + it("allows parameter name collection to be ignored", function (done) { + const dom = createDOM({ + settings: { autoCollect: false, ignoreMetrics: "params" }, + }); + + dom.window.sa_pageview("/manual?gclid=secret"); + + setTimeout(() => { + const req = dom.sent.find( + (r) => r.type === "image" && /path=%2Fmanual/.test(r.url) + ); + expect(req, "pageview request").to.exist; + const url = new URL(req.url); + expect(url.searchParams.has("p")).to.equal(false); + done(); + }, 10); + }); }); From c70cae60998e2581c4ab5f13784e1716204e466d Mon Sep 17 00:00:00 2001 From: Simple Analytics Codex Date: Wed, 12 Aug 2026 17:44:22 +0200 Subject: [PATCH 47/62] Run BrowserStack tests on Node.js 22.16 --- .github/workflows/browserstack.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/browserstack.yml b/.github/workflows/browserstack.yml index f9513155..c1083c18 100644 --- a/.github/workflows/browserstack.yml +++ b/.github/workflows/browserstack.yml @@ -11,7 +11,7 @@ jobs: strategy: matrix: - node-version: [16.16] + node-version: [22.16] steps: - name: Check BrowserStack skip label From 84ef41bd231d0ecfd058d21f0d4bde939f1b6d19 Mon Sep 17 00:00:00 2001 From: Simple Analytics Codex Date: Wed, 12 Aug 2026 21:28:14 +0200 Subject: [PATCH 48/62] Use numeric BrowserStack test exit codes --- test/helpers/get-exit-code.js | 2 ++ test/index.js | 3 ++- test/unit/get-exit-code.test.js | 13 +++++++++++++ 3 files changed, 17 insertions(+), 1 deletion(-) create mode 100644 test/helpers/get-exit-code.js create mode 100644 test/unit/get-exit-code.test.js diff --git a/test/helpers/get-exit-code.js b/test/helpers/get-exit-code.js new file mode 100644 index 00000000..3303d9a1 --- /dev/null +++ b/test/helpers/get-exit-code.js @@ -0,0 +1,2 @@ +module.exports = ({ stopOnFail, amountFailures }) => + stopOnFail && amountFailures > 0 ? 1 : 0; diff --git a/test/index.js b/test/index.js index 2ffd88dd..df4e410e 100644 --- a/test/index.js +++ b/test/index.js @@ -6,6 +6,7 @@ const { Builder } = require("selenium-webdriver"); const { promisify } = require("util"); const { DEBUG, CI } = require("./constants"); const { version, navigate } = require("./helpers"); +const getExitCode = require("./helpers/get-exit-code"); const getBrowsers = require("./helpers/get-browsers"); const { MINIMUM_SESSIONS, @@ -438,6 +439,6 @@ const getDeviceName = ({ } // Exit with exit code when having failures - process.exit(STOP_ON_FAIL ? amountFailures > 0 : false); + process.exit(getExitCode({ stopOnFail: STOP_ON_FAIL, amountFailures })); }); })(); diff --git a/test/unit/get-exit-code.test.js b/test/unit/get-exit-code.test.js new file mode 100644 index 00000000..2f850abb --- /dev/null +++ b/test/unit/get-exit-code.test.js @@ -0,0 +1,13 @@ +const { expect } = require("chai"); +const getExitCode = require("../helpers/get-exit-code"); + +describe("get exit code", function () { + it("returns a numeric exit code for passing and failing runs", function () { + expect(getExitCode({ stopOnFail: true, amountFailures: 0 })).to.equal(0); + expect(getExitCode({ stopOnFail: true, amountFailures: 1 })).to.equal(1); + }); + + it("returns zero when stopping on failures is disabled", function () { + expect(getExitCode({ stopOnFail: false, amountFailures: 1 })).to.equal(0); + }); +}); From 6a74a129eed16b6517cf1872a4604fccd0232b43 Mon Sep 17 00:00:00 2001 From: Simple Analytics Codex Date: Wed, 16 Sep 2026 12:11:38 +0200 Subject: [PATCH 49/62] Sync v12 conflict files with current main --- .github/workflows/browserstack.yml | 25 +- .nvmrc | 2 +- README.md | 17 +- deploy.mts | 987 +++ deploy.sh | 150 - dist/latest/.DS_Store | Bin 6148 -> 0 bytes dist/latest/auto-events.js | 4 +- dist/latest/auto-events.js.map | 2 +- dist/latest/cloudflare.js | 154 +- dist/latest/custom/app.js | 4 +- dist/latest/custom/app.js.map | 2 +- dist/latest/custom/auto-events.js | 4 +- dist/latest/custom/auto-events.js.map | 2 +- dist/latest/custom/e.js | 4 +- dist/latest/custom/e.js.map | 2 +- dist/latest/custom/latest.dev.js | 154 +- dist/latest/custom/latest.js | 4 +- dist/latest/custom/latest.js.map | 2 +- dist/latest/custom/light.js | 4 +- dist/latest/custom/light.js.map | 2 +- dist/latest/custom/proxy.js | 4 +- dist/latest/custom/proxy.js.map | 2 +- dist/latest/hello.js | 4 +- dist/latest/hello.js.map | 2 +- dist/latest/latest.dev.js | 154 +- dist/latest/latest.js | 4 +- dist/latest/latest.js.map | 2 +- dist/latest/light.js | 4 +- dist/latest/light.js.map | 2 +- dist/v11/app.js | 2 +- dist/v11/app.js.map | 2 +- dist/v11/auto-events.js | 4 +- dist/v11/auto-events.js.map | 2 +- dist/v11/custom/app.js | 2 +- dist/v11/custom/app.js.map | 2 +- dist/v11/custom/auto-events.js | 4 +- dist/v11/custom/auto-events.js.map | 2 +- dist/v11/custom/light.js | 2 +- dist/v11/custom/light.js.map | 2 +- dist/v11/custom/proxy.js | 2 +- dist/v11/custom/proxy.js.map | 2 +- dist/v11/light.js | 2 +- dist/v11/light.js.map | 2 +- package-lock.json | 10246 ------------------------ package.json | 28 +- pnpm-lock.yaml | 3655 +++++++++ pnpm-workspace.yaml | 12 + test/deploy.test.mts | 208 + test/index.js | 16 +- tsconfig.json | 15 + 50 files changed, 5132 insertions(+), 10783 deletions(-) create mode 100644 deploy.mts delete mode 100755 deploy.sh delete mode 100644 dist/latest/.DS_Store delete mode 100644 package-lock.json create mode 100644 pnpm-lock.yaml create mode 100644 pnpm-workspace.yaml create mode 100644 test/deploy.test.mts create mode 100644 tsconfig.json diff --git a/.github/workflows/browserstack.yml b/.github/workflows/browserstack.yml index c1083c18..659668cd 100644 --- a/.github/workflows/browserstack.yml +++ b/.github/workflows/browserstack.yml @@ -9,10 +9,6 @@ jobs: runs-on: ubuntu-latest if: "${{ github.event.action != 'unlabeled' || github.event.label.name == 'skip: browserstack' }}" - strategy: - matrix: - node-version: [22.16] - steps: - name: Check BrowserStack skip label id: browserstack @@ -40,16 +36,23 @@ jobs: ref: ${{ github.head_ref }} set-safe-directory: "/github/workspace" - - name: Use Node.js ${{ matrix.node-version }} + - name: Set up pnpm + uses: pnpm/action-setup@v4 + with: + version: 11.17.0 + + - name: Use Node.js from .nvmrc uses: actions/setup-node@v6 with: - node-version: ${{ matrix.node-version }} + node-version-file: .nvmrc + cache: pnpm + cache-dependency-path: pnpm-lock.yaml - - name: Run npm ci - run: sudo npm ci + - name: Install dependencies + run: pnpm install --frozen-lockfile - name: Test BrowserStack matrix selection - run: npm run test:matrix + run: pnpm run test:matrix - name: Prettier check (report only, no writes or commits) if: always() @@ -64,9 +67,9 @@ jobs: echo '```' } >> "$GITHUB_STEP_SUMMARY" - - name: Run npm test with BrowserStack Local + - name: Run tests with BrowserStack Local if: steps.browserstack.outputs.skip != 'true' - run: npm run build && node ./test/index.js + run: pnpm run build && node ./test/index.js env: CI: true NODE_ENV: test diff --git a/.nvmrc b/.nvmrc index f2a2bc61..ca5c3500 100644 --- a/.nvmrc +++ b/.nvmrc @@ -1 +1 @@ -22.16 +24.18.0 diff --git a/README.md b/README.md index d41968e6..1ca708c7 100644 --- a/README.md +++ b/README.md @@ -20,21 +20,30 @@ If you want to contribute, you probabaly want to contribute to our [`/src/defaul In `default.js` you see some weird syntax in the comments. For example, `/** if ignorepages **/` _\[some code\]_ `/** endif **/`. These comments are converted to handlebars like this: `{{#if ignorepages }}` _\[some code\]_ `{{/if}}`. In this case, [`ignorepages` is a variable](https://github.com/simpleanalytics/scripts/blob/3874b44ce5f1b0b8a7d50fb512fdcf5285a0138f/minify.js#L66) used in `minify.js` that takes care of what functionality to show in what script. Our main script is the `latest.js` script which includes all features. We also have a `light.js` script that obviously doesn't. -If you contribute, make sure to use `npm run build`, copy the script to a website, and check if it works correctly. +If you contribute, make sure to use `pnpm run build`, copy the script to a website, and check if it works correctly. ## Run this locally -Just run `npm run watch` and every file will be validated and compiled on save. We minify our scripts with [UglifyJS](http://lisperator.net/uglifyjs/), a well-known JavaScript minifier. +Install the pinned Node and pnpm versions, run `pnpm install --frozen-lockfile`, and then use `pnpm run watch`. Every file will be validated and compiled on save. We minify our scripts with [UglifyJS](http://lisperator.net/uglifyjs/), a well-known JavaScript minifier. The most important file of the repository is [`/src/default.js`](src/default.js) -## Unit tests +## Deploy -Run `npm run test:unit` to execute a small set of tests without BrowserStack. +Build and commit the distribution files before deploying. The deployment command itself never builds or changes local distribution files. + +```sh +pnpm run deploy +``` + +The interactive CLI starts in dry-run mode by default. It lets you select scripts and destinations, reads the deployed files, and shows every affected path plus the first-line script-header diff. Choosing a real deployment requires a clean repository and a second confirmation. + +CDN writes use `BUNNY_SCRIPTS_ACCESS_KEY` and `BUNNY_SCRIPTS_ACCOUNT_KEY` from `.env`. Custom-domain reads and writes require SSH access to `app@external.simpleanalytics.com`. ## Device testing is sponsored by BrowserStack We run our public script on a live, representative matrix of [browsers and real devices](https://github.com/simpleanalytics/scripts/blob/main/test/helpers/get-browsers.js). Simple Analytics supports vendor-maintained browser, OS, and device versions and continues compatibility testing for two years after published end of life. Older browser versions with more than 0.1% global usage remain covered. We get amazing sponsorship from [BrowserStack](https://www.browserstack.com/). Thanks, BrowserStack! + BrowserStack Logo ## Contact diff --git a/deploy.mts b/deploy.mts new file mode 100644 index 00000000..b5953272 --- /dev/null +++ b/deploy.mts @@ -0,0 +1,987 @@ +import { + cancel, + confirm, + intro, + isCancel, + log, + multiselect, + note, + outro, + spinner, +} from "@clack/prompts"; +import { spawn } from "node:child_process"; +import { readdir, readFile } from "node:fs/promises"; +import { dirname, resolve } from "node:path"; +import { fileURLToPath } from "node:url"; + +export type ScriptChoice = "default" | "auto-events"; +export type Destination = "cdn" | "custom"; +export type EmbedVariant = "latest" | "sri" | "light" | "proxy"; +export type FileStatus = "create" | "replace" | "unchanged" | "blocked"; +type FileKind = "javascript" | "source-map"; +type ContentTransform = "none" | "cdn-sri-javascript" | "cdn-sri-map"; + +export interface DeploySelections { + scripts: ScriptChoice[]; + destinations: Destination[]; + variants: EmbedVariant[]; +} + +export interface DeployFile { + destination: Destination; + immutable: boolean; + kind: FileKind; + localPath: string; + remotePath: string; + transform: ContentTransform; + version?: number; +} + +export interface PreparedFile extends DeployFile { + localContent: Buffer; + localHeader: string | null; +} + +export interface PreviewFile extends PreparedFile { + remoteContent: Buffer | null; + remoteHeader: string | null; + status: FileStatus; +} + +interface CommandResult { + stdout: Buffer; + stderr: Buffer; +} + +interface CdnCredentials { + accessKey: string; + accountKey: string; +} + +interface DeploymentResult { + completed: string[]; + skipped: string[]; + failed: string[]; +} + +const ROOT = dirname(fileURLToPath(import.meta.url)); +const CUSTOM_HOST = "app@external.simpleanalytics.com"; +const CUSTOM_ROOT = "/var/www/default"; +const CDN_PUBLIC_ROOT = "https://scripts.simpleanalyticscdn.com"; +const CDN_STORAGE_ROOT = "https://storage.bunnycdn.com/sa-cdn"; +const CDN_PURGE_URL = + "https://api.bunny.net/purge?url=https://simpleanalyticscdn.b-cdn.net/*"; +const HEADER_PATTERN = + /^\/\* Simple Analytics - Privacy friendly analytics \(docs\.simpleanalytics\.com\/[^;]+; \d{4}-\d{2}-\d{2}; [0-9a-f]{4}(?:; SRI-version)?(?:; v\d+)?\) \*\/$/; + +const ansi = { + bold: (value: string) => color("1", value), + cyan: (value: string) => color("36", value), + dim: (value: string) => color("2", value), + green: (value: string) => color("32", value), + red: (value: string) => color("31", value), + yellow: (value: string) => color("33", value), +}; + +function color(code: string, value: string): string { + return process.stdout.isTTY ? `\u001B[${code}m${value}\u001B[0m` : value; +} + +function addScriptPair( + files: DeployFile[], + input: { + destination: Destination; + immutable?: boolean; + localPath: string; + remotePath: string; + sourceMap?: boolean; + transform?: ContentTransform; + version?: number; + }, +): void { + const { + destination, + immutable = false, + localPath, + remotePath, + sourceMap = true, + transform = "none", + version, + } = input; + + files.push({ + destination, + immutable, + kind: "javascript", + localPath, + remotePath, + transform, + version, + }); + + if (!sourceMap) return; + + files.push({ + destination, + immutable, + kind: "source-map", + localPath: `${localPath}.map`, + remotePath: `${remotePath}.map`, + transform: + transform === "cdn-sri-javascript" ? "cdn-sri-map" : "none", + version, + }); +} + +export function createManifest( + selections: DeploySelections, + version?: number, +): DeployFile[] { + const files: DeployFile[] = []; + const hasScript = (choice: ScriptChoice) => selections.scripts.includes(choice); + const hasDestination = (destination: Destination) => + selections.destinations.includes(destination); + const hasVariant = (variant: EmbedVariant) => + selections.variants.includes(variant); + const needsSri = hasScript("default") && hasVariant("sri"); + + if (needsSri && version === undefined) { + throw new Error("An SRI version is required when SRI is selected."); + } + + if (hasScript("default") && hasVariant("latest")) { + if (hasDestination("cdn")) { + addScriptPair(files, { + destination: "cdn", + localPath: "dist/latest/latest.js", + remotePath: "latest.js", + }); + addScriptPair(files, { + destination: "cdn", + localPath: "dist/latest/hello.js", + remotePath: "hello.js", + }); + addScriptPair(files, { + destination: "cdn", + localPath: "dist/latest/latest.dev.js", + remotePath: "latest.dev.js", + sourceMap: false, + }); + } + + if (hasDestination("custom")) { + addScriptPair(files, { + destination: "custom", + localPath: "dist/latest/custom/latest.js", + remotePath: "latest.js", + }); + addScriptPair(files, { + destination: "custom", + localPath: "dist/latest/custom/e.js", + remotePath: "events.js", + }); + addScriptPair(files, { + destination: "custom", + localPath: "dist/latest/custom/latest.dev.js", + remotePath: "latest.dev.js", + sourceMap: false, + }); + } + } + + if (needsSri) { + if (hasDestination("cdn")) { + addScriptPair(files, { + destination: "cdn", + immutable: true, + localPath: `dist/v${version}/app.js`, + remotePath: `sri/v${version}.js`, + transform: "cdn-sri-javascript", + version, + }); + } + + if (hasDestination("custom")) { + addScriptPair(files, { + destination: "custom", + immutable: true, + localPath: `dist/v${version}/custom/app.js`, + remotePath: `v${version}/app.js`, + version, + }); + } + } + + if (hasScript("default") && hasVariant("light")) { + if (hasDestination("cdn")) { + addScriptPair(files, { + destination: "cdn", + localPath: "dist/latest/light.js", + remotePath: "light.js", + }); + } + + if (hasDestination("custom")) { + addScriptPair(files, { + destination: "custom", + localPath: "dist/latest/custom/light.js", + remotePath: "light.js", + }); + + if (needsSri) { + addScriptPair(files, { + destination: "custom", + immutable: true, + localPath: `dist/v${version}/custom/light.js`, + remotePath: `v${version}/light.js`, + version, + }); + } + } + } + + if ( + hasScript("default") && + hasVariant("proxy") && + hasDestination("custom") + ) { + addScriptPair(files, { + destination: "custom", + localPath: "dist/latest/custom/proxy.js", + remotePath: "proxy.js", + }); + + if (needsSri) { + addScriptPair(files, { + destination: "custom", + immutable: true, + localPath: `dist/v${version}/custom/proxy.js`, + remotePath: `v${version}/proxy.js`, + version, + }); + } + } + + if (hasScript("auto-events")) { + if (hasDestination("cdn")) { + addScriptPair(files, { + destination: "cdn", + localPath: "dist/latest/auto-events.js", + remotePath: "auto-events.js", + }); + } + + if (hasDestination("custom")) { + addScriptPair(files, { + destination: "custom", + localPath: "dist/latest/custom/auto-events.js", + remotePath: "auto-events.js", + }); + + if (needsSri) { + addScriptPair(files, { + destination: "custom", + immutable: true, + localPath: `dist/v${version}/custom/auto-events.js`, + remotePath: `v${version}/auto-events.js`, + version, + }); + } + } + } + + return files; +} + +export function latestVersionFromNames(names: string[]): number | undefined { + const versions = names + .map((name) => /^v(\d+)$/.exec(name)?.[1]) + .filter((value): value is string => value !== undefined) + .map(Number) + .filter(Number.isSafeInteger) + .sort((left, right) => right - left); + + return versions[0]; +} + +async function discoverSriVersion(): Promise { + const version = latestVersionFromNames(await readdir(resolve(ROOT, "dist"))); + if (version === undefined) { + throw new Error("No versioned SRI directory exists in dist."); + } + return version; +} + +export function transformContent(file: DeployFile, content: Buffer): Buffer { + if (file.transform === "none") return content; + if (file.version === undefined) { + throw new Error(`Missing version for ${file.localPath}.`); + } + + const replacement = `v${file.version}.js`; + const source = content.toString("utf8"); + + if (file.transform === "cdn-sri-javascript") { + return Buffer.from( + source.replaceAll("sourceMappingURL=app.js.map", `sourceMappingURL=${replacement}.map`), + ); + } + + return Buffer.from(source.replaceAll("app.js", replacement)); +} + +export function firstLine(content: Buffer): string { + return content.toString("utf8").split(/\r?\n/, 1)[0] ?? ""; +} + +export function classifyContent( + localContent: Buffer, + remoteContent: Buffer | null, + immutable: boolean, +): FileStatus { + if (remoteContent === null) return "create"; + if (localContent.equals(remoteContent)) return "unchanged"; + return immutable ? "blocked" : "replace"; +} + +export function repositoryPolicy( + dryRun: boolean, + dirty: boolean, +): "clean" | "warn" { + if (!dirty) return "clean"; + if (dryRun) return "warn"; + throw new Error( + "The scripts repository has uncommitted changes. Commit and test them before deploying.", + ); +} + +async function prepareFiles(files: DeployFile[]): Promise { + return Promise.all( + files.map(async (file) => { + let source: Buffer; + try { + source = await readFile(resolve(ROOT, file.localPath)); + } catch (error) { + throw new Error(`Missing deployment artifact: ${file.localPath}`, { + cause: error, + }); + } + + const localContent = transformContent(file, source); + const localHeader = file.kind === "javascript" ? firstLine(localContent) : null; + + if (localHeader !== null && !HEADER_PATTERN.test(localHeader)) { + throw new Error(`Invalid script header in ${file.localPath}: ${localHeader}`); + } + + if ( + file.immutable && + file.kind === "javascript" && + (!localHeader?.includes("; SRI-version;") || + !localHeader.includes(`; v${file.version})`)) + ) { + throw new Error( + `Immutable artifact ${file.localPath} is not marked as SRI v${file.version}.`, + ); + } + + return { ...file, localContent, localHeader }; + }), + ); +} + +async function runCommand( + command: string, + args: string[], + options: { cwd?: string; timeout?: number } = {}, +): Promise { + return new Promise((resolvePromise, reject) => { + const child = spawn(command, args, { + cwd: options.cwd ?? ROOT, + stdio: ["ignore", "pipe", "pipe"], + timeout: options.timeout ?? 60_000, + }); + const stdout: Buffer[] = []; + const stderr: Buffer[] = []; + + child.stdout.on("data", (chunk: Buffer) => stdout.push(chunk)); + child.stderr.on("data", (chunk: Buffer) => stderr.push(chunk)); + child.on("error", reject); + child.on("close", (code, signal) => { + const result = { + stdout: Buffer.concat(stdout), + stderr: Buffer.concat(stderr), + }; + if (code === 0) { + resolvePromise(result); + return; + } + const detail = result.stderr.toString("utf8").trim(); + reject( + new Error( + `${command} failed${signal ? ` (${signal})` : ` with exit code ${code}`}${ + detail ? `: ${detail}` : "" + }`, + ), + ); + }); + }); +} + +async function isRepositoryDirty(): Promise { + const { stdout } = await runCommand("git", ["status", "--porcelain"]); + return stdout.length > 0; +} + +function encodedRemotePath(remotePath: string): string { + return remotePath.split("/").map(encodeURIComponent).join("/"); +} + +async function readCdnFile( + remotePath: string, + accessKey?: string, +): Promise { + const root = accessKey ? CDN_STORAGE_ROOT : CDN_PUBLIC_ROOT; + const response = await fetch(`${root}/${encodedRemotePath(remotePath)}`, { + cache: "no-store", + headers: accessKey + ? { AccessKey: accessKey } + : { "Cache-Control": "no-cache" }, + redirect: "follow", + signal: AbortSignal.timeout(30_000), + }); + + if (response.status === 404) return null; + if (!response.ok) { + throw new Error( + `Unable to inspect CDN file ${remotePath}: HTTP ${response.status}`, + ); + } + + return Buffer.from(await response.arrayBuffer()); +} + +function assertSafeRemotePath(remotePath: string): void { + if (!/^[a-zA-Z0-9._/-]+$/.test(remotePath) || remotePath.startsWith("/")) { + throw new Error(`Unsafe remote path: ${remotePath}`); + } +} + +function shellQuote(value: string): string { + return `'${value.replaceAll("'", `'"'"'`)}'`; +} + +async function readCustomFiles( + remotePaths: string[], +): Promise> { + const uniquePaths = [...new Set(remotePaths)]; + if (uniquePaths.length === 0) return new Map(); + uniquePaths.forEach(assertSafeRemotePath); + + const pathArguments = uniquePaths.map(shellQuote).join(" "); + const command = [ + `for relative_path in ${pathArguments}; do`, + `printf '__SA_FILE__:%s\\n' "$relative_path";`, + `full_path=${shellQuote(CUSTOM_ROOT)}/$relative_path;`, + 'if test -f "$full_path"; then', + `printf '__SA_DATA__:'; base64 "$full_path" | tr -d '\\n'; printf '\\n';`, + "else printf '__SA_MISSING__\\n'; fi;", + "done", + ].join(" "); + const { stdout } = await runCommand( + "ssh", + ["-o", "BatchMode=yes", "-o", "ConnectTimeout=10", CUSTOM_HOST, command], + { timeout: 45_000 }, + ); + + const result = new Map(); + let currentPath: string | undefined; + for (const line of stdout.toString("utf8").split("\n")) { + if (line.startsWith("__SA_FILE__:")) { + currentPath = line.slice("__SA_FILE__:".length); + continue; + } + if (line === "__SA_MISSING__" && currentPath !== undefined) { + result.set(currentPath, null); + currentPath = undefined; + continue; + } + if (line.startsWith("__SA_DATA__:") && currentPath !== undefined) { + result.set( + currentPath, + Buffer.from(line.slice("__SA_DATA__:".length), "base64"), + ); + currentPath = undefined; + } + } + + for (const remotePath of uniquePaths) { + if (!result.has(remotePath)) { + throw new Error(`Custom server did not return a result for ${remotePath}.`); + } + } + return result; +} + +async function inspectFiles(files: PreparedFile[]): Promise { + const cdnPaths = files + .filter((file) => file.destination === "cdn") + .map((file) => file.remotePath); + const customPaths = files + .filter((file) => file.destination === "custom") + .map((file) => file.remotePath); + + const [cdnEntries, customFiles] = await Promise.all([ + Promise.all( + cdnPaths.map(async (remotePath) => [remotePath, await readCdnFile(remotePath)] as const), + ), + readCustomFiles(customPaths), + ]); + const cdnFiles = new Map(cdnEntries); + + return files.map((file) => { + const remoteContent = + (file.destination === "cdn" ? cdnFiles : customFiles).get(file.remotePath) ?? + null; + return { + ...file, + remoteContent, + remoteHeader: + file.kind === "javascript" && remoteContent !== null + ? firstLine(remoteContent) + : null, + status: classifyContent(file.localContent, remoteContent, file.immutable), + }; + }); +} + +function remoteLabel(file: DeployFile): string { + return file.destination === "cdn" + ? `${CDN_PUBLIC_ROOT}/${file.remotePath}` + : `${CUSTOM_HOST}:${CUSTOM_ROOT}/${file.remotePath}`; +} + +function statusLabel(status: FileStatus): string { + if (status === "create") return ansi.green("CREATE"); + if (status === "replace") return ansi.yellow("CHANGE"); + if (status === "blocked") return ansi.red("BLOCKED"); + return ansi.dim("SKIP"); +} + +export function summarize(files: PreviewFile[]): Record { + return files.reduce>( + (counts, file) => { + counts[file.status] += 1; + return counts; + }, + { blocked: 0, create: 0, replace: 0, unchanged: 0 }, + ); +} + +function renderPreview( + files: PreviewFile[], + selections: DeploySelections, + dryRun: boolean, + version?: number, +): void { + note( + [ + `Mode: ${dryRun ? "Dry run" : "Deploy"}`, + `Scripts: ${selections.scripts.join(", ")}`, + `Destinations: ${selections.destinations.join(", ")}`, + selections.variants.length > 0 + ? `Default variants: ${selections.variants.join(", ")}` + : null, + version === undefined ? null : `SRI version: v${version}`, + ] + .filter((line): line is string => line !== null) + .join("\n"), + "Deployment preview", + ); + + for (const destination of ["cdn", "custom"] as const) { + const destinationFiles = files.filter( + (file) => file.destination === destination, + ); + if (destinationFiles.length === 0) continue; + + console.log(`\n ${ansi.bold(destination === "cdn" ? "CDN" : "Custom domain")}`); + for (const file of destinationFiles) { + console.log( + ` ${statusLabel(file.status).padEnd(process.stdout.isTTY ? 19 : 8)} ${ansi.cyan( + file.localPath, + )}`, + ); + console.log(` ${ansi.dim(`→ ${remoteLabel(file)}`)}`); + + if (file.kind !== "javascript") continue; + if (file.status === "unchanged") { + console.log(` ${ansi.dim(`= ${file.localHeader}`)}`); + continue; + } + const previous = file.remoteHeader ?? ""; + console.log(` ${ansi.red(`- ${previous}`)}`); + console.log(` ${ansi.green(`+ ${file.localHeader}`)}`); + } + } + + const counts = summarize(files); + note( + [ + `Create: ${counts.create}`, + `Change: ${counts.replace}`, + `Skip: ${counts.unchanged}`, + `Blocked: ${counts.blocked}`, + ].join(" · "), + "Files", + ); +} + +function cdnCredentials(): CdnCredentials { + const accessKey = process.env.BUNNY_SCRIPTS_ACCESS_KEY; + const accountKey = process.env.BUNNY_SCRIPTS_ACCOUNT_KEY; + if (!accessKey || !accountKey) { + throw new Error( + "BUNNY_SCRIPTS_ACCESS_KEY and BUNNY_SCRIPTS_ACCOUNT_KEY must be set in .env for a CDN deployment.", + ); + } + return { accessKey, accountKey }; +} + +async function readCurrentFile( + file: PreparedFile, + credentials?: CdnCredentials, +): Promise { + if (file.destination === "cdn") { + return readCdnFile(file.remotePath, credentials?.accessKey); + } + return (await readCustomFiles([file.remotePath])).get(file.remotePath) ?? null; +} + +async function uploadCdnFile( + file: PreparedFile, + credentials: CdnCredentials, +): Promise { + const response = await fetch( + `${CDN_STORAGE_ROOT}/${encodedRemotePath(file.remotePath)}`, + { + body: new Uint8Array(file.localContent), + headers: { AccessKey: credentials.accessKey }, + method: "PUT", + signal: AbortSignal.timeout(60_000), + }, + ); + if (response.status !== 201) { + throw new Error( + `Unable to upload CDN file ${file.remotePath}: HTTP ${response.status} ${await response.text()}`, + ); + } +} + +async function uploadCustomFile(file: PreparedFile): Promise { + assertSafeRemotePath(file.remotePath); + if (file.transform !== "none") { + throw new Error(`Custom uploads cannot transform ${file.localPath}.`); + } + + if (file.immutable) { + const remoteDirectory = dirname(`${CUSTOM_ROOT}/${file.remotePath}`); + await runCommand("ssh", [ + "-o", + "BatchMode=yes", + "-o", + "ConnectTimeout=10", + CUSTOM_HOST, + `sudo mkdir -p -- ${shellQuote(remoteDirectory)}`, + ]); + } + + const args = ["--quiet", "--rsync-path=sudo rsync"]; + if (file.immutable) args.push("--ignore-existing"); + args.push( + resolve(ROOT, file.localPath), + `${CUSTOM_HOST}:${CUSTOM_ROOT}/${file.remotePath}`, + ); + await runCommand("rsync", args, { timeout: 120_000 }); +} + +async function purgeCdn(credentials: CdnCredentials): Promise { + const response = await fetch(CDN_PURGE_URL, { + headers: { AccessKey: credentials.accountKey }, + method: "POST", + signal: AbortSignal.timeout(30_000), + }); + if (!response.ok) { + throw new Error(`Unable to purge Bunny CDN: HTTP ${response.status}`); + } +} + +async function verifyUploadedFiles( + files: PreparedFile[], + credentials?: CdnCredentials, +): Promise { + const cdnFiles = files.filter((file) => file.destination === "cdn"); + const customFiles = files.filter((file) => file.destination === "custom"); + const [cdnContents, customContents] = await Promise.all([ + Promise.all( + cdnFiles.map((file) => readCdnFile(file.remotePath, credentials?.accessKey)), + ), + readCustomFiles(customFiles.map((file) => file.remotePath)), + ]); + + for (const [index, file] of cdnFiles.entries()) { + if (!cdnContents[index]?.equals(file.localContent)) { + throw new Error(`CDN verification failed for ${file.remotePath}.`); + } + } + for (const file of customFiles) { + if (!customContents.get(file.remotePath)?.equals(file.localContent)) { + throw new Error(`Custom-domain verification failed for ${file.remotePath}.`); + } + } +} + +class DeploymentFailure extends Error { + result: DeploymentResult; + + constructor(message: string, result: DeploymentResult, options?: ErrorOptions) { + super(message, options); + this.name = "DeploymentFailure"; + this.result = result; + } +} + +async function deployFiles( + previews: PreviewFile[], + credentials?: CdnCredentials, +): Promise { + const result: DeploymentResult = { completed: [], failed: [], skipped: [] }; + const filesToWrite: PreparedFile[] = []; + + try { + for (const file of previews) { + if (file.status === "unchanged") { + result.skipped.push(remoteLabel(file)); + continue; + } + if (file.status === "blocked") { + throw new Error(`Immutable SRI file already differs: ${remoteLabel(file)}`); + } + + if (file.immutable) { + const current = await readCurrentFile(file, credentials); + const currentStatus = classifyContent(file.localContent, current, true); + if (currentStatus === "unchanged") { + result.skipped.push(remoteLabel(file)); + continue; + } + if (currentStatus === "blocked") { + result.failed.push(remoteLabel(file)); + throw new Error( + `Immutable SRI file changed after preview: ${remoteLabel(file)}`, + ); + } + } + + const progress = spinner(); + progress.start(`Uploading ${file.remotePath} to ${file.destination}`); + try { + if (file.destination === "cdn") { + if (!credentials) throw new Error("Missing CDN credentials."); + await uploadCdnFile(file, credentials); + } else { + await uploadCustomFile(file); + } + progress.stop(`Uploaded ${file.remotePath} to ${file.destination}`); + } catch (error) { + progress.error(`Failed ${file.remotePath} on ${file.destination}`); + result.failed.push(remoteLabel(file)); + throw error; + } + + result.completed.push(remoteLabel(file)); + filesToWrite.push(file); + } + + if (filesToWrite.length > 0) { + const progress = spinner(); + progress.start("Verifying uploaded files"); + try { + await verifyUploadedFiles(filesToWrite, credentials); + progress.stop("Verified uploaded files"); + } catch (error) { + progress.error("Uploaded-file verification failed"); + result.failed.push("Uploaded-file verification"); + throw error; + } + } + + if (filesToWrite.some((file) => file.destination === "cdn")) { + if (!credentials) throw new Error("Missing CDN credentials."); + const progress = spinner(); + progress.start("Purging Bunny CDN"); + try { + await purgeCdn(credentials); + progress.stop("Purged Bunny CDN"); + } catch (error) { + progress.error("Bunny CDN purge failed"); + result.failed.push("Bunny CDN purge"); + throw error; + } + } + + return result; + } catch (error) { + throw new DeploymentFailure("Deployment stopped after a failed operation.", result, { + cause: error, + }); + } +} + +function renderDeploymentResult(result: DeploymentResult): void { + note( + [ + `Completed: ${result.completed.length}`, + `Skipped: ${result.skipped.length}`, + `Failed: ${result.failed.length}`, + ].join(" · "), + "Deployment result", + ); +} + +function selectedValue(value: T | symbol): T { + if (isCancel(value)) { + cancel("Deployment cancelled."); + process.exit(0); + } + return value; +} + +async function main(): Promise { + intro("Simple Analytics script deployment"); + + const dryRun = selectedValue( + await confirm({ + initialValue: true, + message: "Do you want to dry run this?", + }), + ); + const dirty = await isRepositoryDirty(); + if (repositoryPolicy(dryRun, dirty) === "warn") { + log.warn( + "The repository has uncommitted changes. This dry run previews the current dist files only.", + ); + } + + const scripts = selectedValue( + await multiselect({ + message: "Scripts to deploy", + options: [ + { label: "Default embed", value: "default" }, + { label: "Auto-events", value: "auto-events" }, + ], + required: true, + }), + ); + const destinations = selectedValue( + await multiselect({ + initialValues: ["cdn", "custom"], + message: "Where do you want to deploy these scripts?", + options: [ + { label: "CDN", value: "cdn" }, + { label: "Custom domain", value: "custom" }, + ], + required: true, + }), + ); + + let variants: EmbedVariant[] = []; + if (scripts.includes("default")) { + const options: Array<{ label: string; value: EmbedVariant }> = [ + { label: "Latest", value: "latest" }, + { label: "SRI", value: "sri" }, + { label: "Light", value: "light" }, + ]; + if (destinations.includes("custom")) { + options.push({ label: "Proxy", value: "proxy" }); + } + variants = selectedValue( + await multiselect({ + initialValues: options.map((option) => option.value), + message: "What default embed scripts do you want to deploy?", + options, + required: true, + }), + ); + } + + const selections = { destinations, scripts, variants }; + const version = variants.includes("sri") ? await discoverSriVersion() : undefined; + const preparedFiles = await prepareFiles(createManifest(selections, version)); + const inspection = spinner(); + inspection.start("Inspecting deployed files"); + let previews: PreviewFile[]; + try { + previews = await inspectFiles(preparedFiles); + inspection.stop("Inspected deployed files"); + } catch (error) { + inspection.error("Unable to inspect deployed files"); + throw error; + } + renderPreview(previews, selections, dryRun, version); + + const counts = summarize(previews); + if (counts.blocked > 0) { + cancel( + `Deployment blocked: ${counts.blocked} immutable SRI file${ + counts.blocked === 1 ? "" : "s" + } already exist with different content.`, + ); + process.exitCode = 1; + return; + } + + if (dryRun) { + outro("Dry run complete—nothing changed."); + return; + } + + const credentials = destinations.includes("cdn") ? cdnCredentials() : undefined; + const shouldDeploy = selectedValue( + await confirm({ + initialValue: false, + message: `Deploy ${counts.create + counts.replace} changed files now?`, + }), + ); + if (!shouldDeploy) { + cancel("Deployment cancelled—nothing changed."); + return; + } + + const result = await deployFiles(previews, credentials); + renderDeploymentResult(result); + if (variants.includes("sri")) { + log.warn( + "Add the SRI version to /etc/nginx/sa-client-site-with-ssl.conf and update https://docs.simpleanalytics.com/sri.", + ); + } + outro("Scripts deployed successfully."); +} + +const isMain = + process.argv[1] !== undefined && resolve(process.argv[1]) === fileURLToPath(import.meta.url); + +if (isMain) { + main().catch((error: unknown) => { + if (error instanceof DeploymentFailure) { + renderDeploymentResult(error.result); + log.error( + error.cause instanceof Error ? error.cause.message : error.message, + ); + } else { + log.error(error instanceof Error ? error.message : String(error)); + } + cancel("Deployment stopped—review the error above."); + process.exitCode = 1; + }); +} diff --git a/deploy.sh b/deploy.sh deleted file mode 100755 index 00c9ec54..00000000 --- a/deploy.sh +++ /dev/null @@ -1,150 +0,0 @@ -#!/bin/bash -set -u -set -e - -RED=`tput setaf 1` -GREEN=`tput setaf 2` -RESET=`tput sgr0` - -SERVER_NAME="external.simpleanalytics.com" -SCRIPTS_LATEST_PATH='./dist/latest/custom' -REMOTE_PATH='app@external.simpleanalytics.com:/var/www/default' - -if ! [[ $PWD = */scripts ]] || ! [[ -f "./dist/latest/custom/latest.js" ]]; then - echo -e "==> ${RED}Not in scripts directory, killing script${RESET}" - exit 1 -fi - -if [[ `git status --porcelain` ]]; then - echo -e "==> ${RED}There are changes in your repo, commit and test them first${RESET}" - exit 1 -fi - -if [ -f .env ]; then - export $(grep -v '^#' .env | sed 's/\r$//' | awk '/=/ {print $1}' ) -else - echo "==> Can not find .env variables" - exit 1 -fi - -if [[ -z ${BUNNY_SCRIPTS_ACCESS_KEY+x} || -z ${BUNNY_SCRIPTS_ACCOUNT_KEY+x} ]]; then - echo "==> Make sure BUNNY_SCRIPTS_ACCESS_KEY and BUNNY_SCRIPTS_ACCOUNT_KEY are defined in .env" - exit 1 -fi - -upload_to_bunny() { - local_file=$1 - remote_file=$2 - find=${3:-} - replace=${4:-} - - if [ ! -z "$find" ] && [ ! -z "$replace" ]; then - sed "s/$find/$replace/g" $local_file > /tmp/tmp_file - put_response=$(curl \ - --request PUT \ - --url "https://storage.bunnycdn.com/sa-cdn/$remote_file" \ - --header "AccessKey: $BUNNY_SCRIPTS_ACCESS_KEY" \ - --upload-file "/tmp/tmp_file" \ - --output - \ - --silent \ - -w "%{stdout} %{http_code}" - ) - rm /tmp/tmp_file - else - put_response=$(curl \ - --request PUT \ - --url "https://storage.bunnycdn.com/sa-cdn/$remote_file" \ - --header "AccessKey: $BUNNY_SCRIPTS_ACCESS_KEY" \ - --upload-file "$local_file" \ - --output - \ - --silent \ - -w "%{stdout} %{http_code}" - ) - fi - - if ! [[ $put_response = *201* ]]; then - echo "==> Failed to update $remote_file, got http code: $put_response" - exit 1 - fi -} - -read -p "==> Specify the latest SRI version: " VERSION - -LATEST_FILE="./dist/v$VERSION/app.js" -SRI_FILE="./dist/v$VERSION/custom/app.js" - -if [ ! -f "$LATEST_FILE" ] || [ ! -f "$SRI_FILE" ]; then - echo "==> Files with version v$VERSION do not exist." - exit 1 -fi - -echo "==> You are about to deploy to $SERVER_NAME" -read -p "==> Are you sure (y/N)? " -r -echo -if [[ $REPLY =~ ^[Yy]$ ]]; then - echo '==> Compiling one more time' - - npm run build - - if [[ `git status --porcelain` ]]; then - echo -e "==> ${RED}There are changes in your repo, commit and test them first${RESET}" - exit 1 - fi - - echo "==> Deploying non SRI v$VERSION files to $SERVER_NAME" - rsync --rsync-path="sudo rsync" "$SCRIPTS_LATEST_PATH/auto-events.js" "$REMOTE_PATH/auto-events.js" - rsync --rsync-path="sudo rsync" "$SCRIPTS_LATEST_PATH/auto-events.js.map" "$REMOTE_PATH/auto-events.js.map" - rsync --rsync-path="sudo rsync" "$SCRIPTS_LATEST_PATH/e.js" "$REMOTE_PATH/events.js" - rsync --rsync-path="sudo rsync" "$SCRIPTS_LATEST_PATH/e.js.map" "$REMOTE_PATH/events.js.map" - rsync --rsync-path="sudo rsync" "$SCRIPTS_LATEST_PATH/latest.dev.js" "$REMOTE_PATH/latest.dev.js" - rsync --rsync-path="sudo rsync" "$SCRIPTS_LATEST_PATH/latest.js" "$REMOTE_PATH/latest.js" - rsync --rsync-path="sudo rsync" "$SCRIPTS_LATEST_PATH/latest.js.map" "$REMOTE_PATH/latest.js.map" - rsync --rsync-path="sudo rsync" "$SCRIPTS_LATEST_PATH/light.js" "$REMOTE_PATH/light.js" - rsync --rsync-path="sudo rsync" "$SCRIPTS_LATEST_PATH/light.js.map" "$REMOTE_PATH/light.js.map" - rsync --rsync-path="sudo rsync" "$SCRIPTS_LATEST_PATH/proxy.js" "$REMOTE_PATH/proxy.js" - rsync --rsync-path="sudo rsync" "$SCRIPTS_LATEST_PATH/proxy.js.map" "$REMOTE_PATH/proxy.js.map" - - echo "==> Copying SRI v$VERSION file to $SERVER_NAME" - rsync --quiet --rsync-path="sudo mkdir -p $REMOTE_PATH/v$VERSION && sudo rsync" "./dist/v$VERSION/custom/app.js" "$REMOTE_PATH/v$VERSION/app.js" - rsync --quiet --rsync-path="sudo rsync" "./dist/v$VERSION/custom/app.js.map" "$REMOTE_PATH/v$VERSION/app.js.map" - rsync --quiet --rsync-path="sudo rsync" "./dist/v$VERSION/custom/light.js" "$REMOTE_PATH/v$VERSION/light.js" - rsync --quiet --rsync-path="sudo rsync" "./dist/v$VERSION/custom/light.js.map" "$REMOTE_PATH/v$VERSION/light.js.map" - rsync --quiet --rsync-path="sudo rsync" "./dist/v$VERSION/custom/auto-events.js" "$REMOTE_PATH/v$VERSION/auto-events.js" - rsync --quiet --rsync-path="sudo rsync" "./dist/v$VERSION/custom/auto-events.js.map" "$REMOTE_PATH/v$VERSION/auto-events.js.map" - rsync --quiet --rsync-path="sudo rsync" "./dist/v$VERSION/custom/proxy.js" "$REMOTE_PATH/v$VERSION/proxy.js" - rsync --quiet --rsync-path="sudo rsync" "./dist/v$VERSION/custom/proxy.js.map" "$REMOTE_PATH/v$VERSION/proxy.js.map" - - echo "==> Upload files to Bunny" - upload_to_bunny "dist/v${VERSION}/app.js" "sri/v${VERSION}.js" "app.js.map" "v${VERSION}.js.map" - upload_to_bunny "dist/v${VERSION}/app.js.map" "sri/v${VERSION}.js.map" "app.js" "v${VERSION}.js" - upload_to_bunny "dist/latest/auto-events.js" "auto-events.js" - upload_to_bunny "dist/latest/auto-events.js.map" "auto-events.js.map" - upload_to_bunny "dist/latest/hello.js" "hello.js" - upload_to_bunny "dist/latest/hello.js.map" "hello.js.map" - upload_to_bunny "dist/latest/latest.dev.js" "latest.dev.js" - upload_to_bunny "dist/latest/latest.js" "latest.js" - upload_to_bunny "dist/latest/latest.js.map" "latest.js.map" - upload_to_bunny "dist/latest/light.js" "light.js" - upload_to_bunny "dist/latest/light.js.map" "light.js.map" - - echo "==> Flushing files on Bunny" - flush_response=$(curl \ - --request POST \ - --header "AccessKey: $BUNNY_SCRIPTS_ACCOUNT_KEY" \ - --url "https://api.bunny.net/purge?url=https://simpleanalyticscdn.b-cdn.net/*" \ - --output - \ - --silent \ - -w "%{stdout} %{http_code}" - ) - - if ! [[ $flush_response = *200 ]]; then - echo "==> Failed to flush $cdnfilename, got http code: $flush_response" - exit 1 - fi - - echo -e "==> ${RED}Add SRI version to '/etc/nginx/sa-client-site-with-ssl.conf' on external server and update docs page at 'https://docs.simpleanalytics.com/sri'${RESET}" - - echo -e "==> ${GREEN}Woop woop! Deployed to $SERVER_NAME!${RESET}" -else - echo '==> Cancelled by you' -fi diff --git a/dist/latest/.DS_Store b/dist/latest/.DS_Store deleted file mode 100644 index 13611aee59a0f5c943b8ce2ce89e28771e82b025..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6148 zcmeHKI|>3p3{6x-u-VdbuHX#@(Gz$9QL$3CQ2VVsmq+vEgCMJoU?VS(yqQeiEc=Sh zMnrUR-OoiD5t+aZ`A~!P_y=+c7rQj%QvJb;Z^= WuZdlt(~);NkUs;a3yli=T7d`prWK -1,\n emails: collectTypes.indexOf(\"emails\") > -1,\n downloads: collectTypes.indexOf(\"downloads\") > -1,\n phones: collectTypes.indexOf(\"phones\") > -1,\n // Downloads: enter file extensions you want to collect\n downloadsExtensions: setting(\"extensions\", \"array\", [\n \"pdf\",\n \"csv\",\n \"docx\",\n \"xlsx\",\n \"zip\",\n \"doc\",\n \"xls\",\n ]),\n\n // All: use title attribute if set for event name (for all events)\n // THIS TAKES PRECEDENCE OVER OTHER SETTINGS BELOW\n title: setting(\"useTitle\", \"bool\", true),\n // Outbound: use full URL of the links? false for just the hostname\n outboundFullUrl: fullUrls,\n // Downloads: if taking event name from URL, use full URL or just filename (default)\n downloadsFullUrl: fullUrls,\n };\n\n var saGlobal = setting(\"saGlobal\", \"string\", \"sa_event\");\n\n // For compiling the script\n var optionsLink = options;\n\n if (typeof optionsLink === \"undefined\")\n log(\"options object not found, please specify\", \"warn\");\n\n var saAutomatedLink = function saAutomatedLink(element, type) {\n try {\n if (!element) return log(\"no element found\");\n var sent = false;\n\n var callback = function () {\n if (\n !sent &&\n (!element.hasAttribute(\"target\") ||\n element.getAttribute(\"target\") === \"_self\")\n )\n document.location = element.getAttribute(\"href\");\n sent = true;\n };\n\n if (window[saGlobal] && window[saGlobal + \"_loaded\"]) {\n var hostname = element.hostname;\n var pathname = element.pathname;\n\n var event;\n var metadata = {\n title: element.getAttribute(\"title\") || undefined,\n };\n var url = element.href || undefined;\n\n var useTitle = false;\n if (optionsLink.title && element.hasAttribute(\"title\")) {\n var theTitle = element.getAttribute(\"title\").trim();\n if (theTitle != \"\") useTitle = true;\n }\n\n if (useTitle) {\n event = theTitle;\n } else {\n switch (type) {\n case \"outbound\": {\n event = hostname + (optionsLink.outboundFullUrl ? pathname : \"\");\n metadata.url = url;\n break;\n }\n case \"download\": {\n event = optionsLink.downloadsFullUrl\n ? hostname + pathname\n : pathname.split(\"/\").pop();\n metadata.url = url;\n break;\n }\n case \"email\": {\n var href = element.getAttribute(\"href\");\n event = (href.split(\":\")[1] || \"\").split(\"?\")[0];\n metadata.email = event;\n break;\n }\n case \"phone\": {\n var hrefPhone = element.getAttribute(\"href\");\n event = (hrefPhone.split(\":\")[1] || \"\").split(\"?\")[0];\n metadata.phone = event;\n break;\n }\n }\n }\n\n var clean =\n type +\n \"_\" +\n event.replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_+|_+$)/g, \"\");\n\n window[saGlobal](clean, metadata, callback);\n\n log(\"collected \" + clean);\n\n return type === \"email\" || type === \"phone\"\n ? callback()\n : window.setTimeout(callback, 5000);\n } else {\n log(saGlobal + \" is not defined\", \"warn\");\n return callback();\n }\n } catch (error) {\n log(error.message, \"warn\");\n }\n };\n\n window.saAutomatedLink = saAutomatedLink;\n\n function collectLink(link, onclick) {\n if (link.hasAttribute(\"data-simple-event\")) return;\n var collect = false;\n\n // Collect download clicks\n if (\n optionsLink.downloads &&\n /^https?:\\/\\//i.test(link.href) &&\n new RegExp(\n \"\\\\.(\" + (optionsLink.downloadsExtensions || []).join(\"|\") + \")$\",\n \"i\"\n ).test(link.pathname)\n ) {\n collect = \"download\";\n\n // Collect outbound links clicks\n } else if (\n optionsLink.outbound &&\n /^https?:\\/\\//i.test(link.href) &&\n link.hostname !== window.location.hostname\n ) {\n collect = \"outbound\";\n\n // Collect email clicks\n } else if (optionsLink.emails && /^mailto:/i.test(link.href)) {\n collect = \"email\";\n\n // Collect telephone clicks\n } else if (optionsLink.phones && /^tel:/i.test(link.href)) {\n collect = \"phone\";\n }\n\n if (!collect) return;\n\n if (onclick) {\n var onClickAttribute = \"saAutomatedLink(this, '\" + collect + \"');\";\n\n if (\n !link.hasAttribute(\"target\") ||\n link.getAttribute(\"target\") === \"_self\"\n )\n onClickAttribute += \" return false;\";\n\n link.setAttribute(\"onclick\", onClickAttribute);\n } else {\n link.addEventListener(\"click\", function () {\n saAutomatedLink(this, collect);\n });\n }\n }\n\n function onDOMContentLoaded() {\n try {\n var a = document.getElementsByTagName(\"a\");\n\n // Loop over all links on the page\n for (var i = 0; i < a.length; i++) {\n var link = a[i];\n var href = link.getAttribute(\"href\");\n\n // Skip links that don't have an href\n if (!href) continue;\n\n // We don't want to overwrite website behaviour so we check for the onclick attribute\n if (\n !link.getAttribute(\"onclick\") &&\n !/^mailto:/.test(href) &&\n !/^tel:/.test(href)\n ) {\n collectLink(link, true);\n } else {\n collectLink(link, false);\n }\n }\n } catch (error) {\n log(error.message, \"warn\");\n }\n }\n\n if (doc.readyState === \"ready\" || doc.readyState === \"complete\") {\n onDOMContentLoaded();\n } else {\n document.addEventListener(\"readystatechange\", function (event) {\n if (event.target.readyState === \"complete\") onDOMContentLoaded();\n });\n }\n})(window);\n"],"names":["collectLink","link","onclick","collect","onClickAttribute","hasAttribute","optionsLink","downloads","test","href","RegExp","downloadsExtensions","join","pathname","outbound","hostname","window","location","emails","phones","getAttribute","setAttribute","addEventListener","saAutomatedLink","this","onDOMContentLoaded","a","document","getElementsByTagName","i","length","error","log","message","doc","scriptElement","setting","collectTypes","fullUrls","options","saGlobal","type","logger","console","warn","info","currentScript","querySelector","attribute","defaultValue","value","dataset","split","map","item","trim","filter","Boolean","indexOf","title","outboundFullUrl","downloadsFullUrl","element","sent","callback","theTitle","metadata","undefined","url","useTitle","event","pop","email","phone","clean","replace","setTimeout","readyState","target"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"auto-events.source.js","sources":["auto-events.source.js"],"sourcesContent":["(function saAutomatedEvents(window) {\n // Skip server side rendered pages\n if (typeof window === \"undefined\") return;\n\n var log = function (message, type) {\n var logger = type === \"warn\" ? console.warn : console.info;\n return logger && logger(\"Simple Analytics auto events:\", message);\n };\n\n var doc = window.document;\n\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"auto-events.js\"]');\n\n var setting = function (attribute, type, defaultValue) {\n var value = scriptElement && scriptElement.dataset[attribute];\n\n // Booleans\n if (type === \"bool\" && (value === \"true\" || value === \"false\"))\n return value === \"true\";\n else if (type === \"bool\") return defaultValue;\n\n // Arrays\n if (type === \"array\" && value)\n return value\n .split(\",\")\n .map(function (item) {\n return item.trim();\n })\n .filter(Boolean);\n else if (type === \"array\") return defaultValue;\n\n return value || defaultValue;\n };\n\n var collectTypes = setting(\"collect\", \"array\", [\n \"outbound\",\n \"emails\",\n \"downloads\",\n ]);\n var fullUrls = setting(\"fullUrls\", \"bool\", false);\n\n var options = {\n // What to collect\n outbound: collectTypes.indexOf(\"outbound\") > -1,\n emails: collectTypes.indexOf(\"emails\") > -1,\n downloads: collectTypes.indexOf(\"downloads\") > -1,\n // Downloads: enter file extensions you want to collect\n downloadsExtensions: setting(\"extensions\", \"array\", [\n \"pdf\",\n \"csv\",\n \"docx\",\n \"xlsx\",\n \"zip\",\n \"doc\",\n \"xls\",\n ]),\n\n // All: use title attribute if set for event name (for all events)\n // THIS TAKES PRECEDENCE OVER OTHER SETTINGS BELOW\n title: setting(\"useTitle\", \"bool\", true),\n // Outbound: use full URL of the links? false for just the hostname\n outboundFullUrl: fullUrls,\n // Downloads: if taking event name from URL, use full URL or just filename (default)\n downloadsFullUrl: fullUrls,\n };\n\n var saGlobal = setting(\"saGlobal\", \"string\", \"sa_event\");\n\n // For compiling the script\n var optionsLink = options;\n\n if (typeof optionsLink === \"undefined\")\n log(\"options object not found, please specify\", \"warn\");\n\n window.saAutomatedLink = function saAutomatedLink(element, type) {\n try {\n if (!element) return log(\"no element found\");\n var sent = false;\n\n var callback = function () {\n if (\n !sent &&\n (!element.hasAttribute(\"target\") ||\n element.getAttribute(\"target\") === \"_self\")\n )\n document.location = element.getAttribute(\"href\");\n sent = true;\n };\n\n if (window[saGlobal] && window[saGlobal + \"_loaded\"]) {\n var hostname = element.hostname;\n var pathname = element.pathname;\n\n var event;\n var metadata = {\n title: element.getAttribute(\"title\") || undefined,\n };\n var url = element.href || undefined;\n\n var useTitle = false;\n if (optionsLink.title && element.hasAttribute(\"title\")) {\n var theTitle = element.getAttribute(\"title\").trim();\n if (theTitle != \"\") useTitle = true;\n }\n\n if (useTitle) {\n event = theTitle;\n } else {\n switch (type) {\n case \"outbound\": {\n event = hostname + (optionsLink.outboundFullUrl ? pathname : \"\");\n metadata.url = url;\n break;\n }\n case \"download\": {\n event = optionsLink.downloadsFullUrl\n ? hostname + pathname\n : pathname.split(\"/\").pop();\n metadata.url = url;\n break;\n }\n case \"email\": {\n var href = element.getAttribute(\"href\");\n event = (href.split(\":\")[1] || \"\").split(\"?\")[0];\n metadata.email = event;\n break;\n }\n }\n }\n\n var clean =\n type +\n \"_\" +\n event.replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_+|_+$)/g, \"\");\n\n window[saGlobal](clean, metadata, callback);\n\n log(\"collected \" + clean);\n\n return type === \"email\"\n ? callback()\n : window.setTimeout(callback, 5000);\n } else {\n log(saGlobal + \" is not defined\", \"warn\");\n return callback();\n }\n } catch (error) {\n log(error.message, \"warn\");\n }\n };\n\n function collectLink(link, onclick) {\n var collect = false;\n\n // Collect download clicks\n if (\n optionsLink.downloads &&\n /^https?:\\/\\//i.test(link.href) &&\n new RegExp(\n \"\\\\.(\" + (optionsLink.downloadsExtensions || []).join(\"|\") + \")$\",\n \"i\"\n ).test(link.pathname)\n ) {\n collect = \"download\";\n\n // Collect outbound links clicks\n } else if (\n optionsLink.outbound &&\n /^https?:\\/\\//i.test(link.href) &&\n link.hostname !== window.location.hostname\n ) {\n collect = \"outbound\";\n\n // Collect email clicks\n } else if (optionsLink.emails && /^mailto:/i.test(link.href)) {\n collect = \"email\";\n }\n\n if (!collect) return;\n\n if (onclick) {\n var onClickAttribute = \"saAutomatedLink(this, '\" + collect + \"');\";\n\n if (\n !link.hasAttribute(\"target\") ||\n link.getAttribute(\"target\") === \"_self\"\n )\n onClickAttribute += \" return false;\";\n\n link.setAttribute(\"onclick\", onClickAttribute);\n } else {\n link.addEventListener(\"click\", function () {\n saAutomatedLink(this, collect);\n });\n }\n }\n\n function onDOMContentLoaded() {\n try {\n var a = document.getElementsByTagName(\"a\");\n\n // Loop over all links on the page\n for (var i = 0; i < a.length; i++) {\n var link = a[i];\n var href = link.getAttribute(\"href\");\n\n // Skip links that don't have an href\n if (!href) continue;\n\n // We don't want to overwrite website behaviour so we check for the onclick attribute\n if (!link.getAttribute(\"onclick\") && !/^mailto:/.test(href)) {\n collectLink(link, true);\n } else {\n collectLink(link, false);\n }\n }\n } catch (error) {\n log(error.message, \"warn\");\n }\n }\n\n if (doc.readyState === \"ready\" || doc.readyState === \"complete\") {\n onDOMContentLoaded();\n } else {\n document.addEventListener(\"readystatechange\", function (event) {\n if (event.target.readyState === \"complete\") onDOMContentLoaded();\n });\n }\n})(window);\n"],"names":["collectLink","link","onclick","onClickAttribute","collect","optionsLink","downloads","test","href","RegExp","downloadsExtensions","join","pathname","outbound","hostname","window","location","emails","hasAttribute","getAttribute","setAttribute","addEventListener","saAutomatedLink","this","onDOMContentLoaded","a","document","getElementsByTagName","i","length","error","log","message","doc","scriptElement","setting","collectTypes","fullUrls","options","saGlobal","type","logger","console","warn","info","currentScript","querySelector","attribute","defaultValue","value","dataset","split","map","item","trim","filter","Boolean","indexOf","title","outboundFullUrl","downloadsFullUrl","element","sent","callback","theTitle","metadata","undefined","url","useTitle","event","pop","email","clean","replace","setTimeout","readyState","target"],"mappings":"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"} \ No newline at end of file diff --git a/dist/latest/cloudflare.js b/dist/latest/cloudflare.js index ebf1329d..adc0447b 100644 --- a/dist/latest/cloudflare.js +++ b/dist/latest/cloudflare.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-08-12; 9ec6; v12) */ +/* Simple Analytics - Privacy friendly analytics (docs.simpleanalytics.com/script; 2026-08-17; 6b9f; v11) */ /* eslint-env browser */ (function ( @@ -193,17 +193,11 @@ attr(scriptElement, namespaceText) || defaultNamespace; + var metadataObject = window[namespace + "_metadata"]; var appendMetadata = function (metadata, data) { - var metadataObject = window[namespace + "_metadata"]; if (isObject(metadataObject)) metadata = assign(metadata, metadataObject); var metadataCollectorFunction = window[metadataCollector]; - if (!isFunction(metadataCollectorFunction)) { - if (metadataCollector) - warn( - metadataCollector + " not found, set window." + metadataCollector - ); - return metadata; - } + if (!isFunction(metadataCollectorFunction)) return metadata; try { return assign( metadata, @@ -224,40 +218,32 @@ overwriteOptions.strictUtm || attr(scriptElement, "strict-utm") == trueText; - var p; - - var getQueryParams = function (ignoreSource, overwriteSearch) { - p = !ignoreSource && collectMetricByString("p") ? "" : falseVar; - var q = (overwriteSearch || loc.search) - .slice(1) - .split("&") - .filter(function (keyValue) { - var i = keyValue.indexOf("="); - if (p !== falseVar && i > 0 && keyValue.slice(i + 1)) - p += (p ? "," : "") + keyValue.slice(0, i); - - var ignore = ignoreSource || !collectMetricByString("ut"); - - var paramsRegexList = allowParams.map(filterRegex).join("|"); - var regex = ignore - ? "^(" + paramsRegexList + ")=" - : "^((utm_)" + - (strictUtm ? "" : "?") + - "(source|medium|content|term|campaign)" + - (strictUtm ? "" : "|ref") + - "|" + - paramsRegexList + - ")="; - if (ignore && !allowParams.length) return falseVar; - - // The prefix "utm_" is optional with "strictUtm" disabled - // "ref" is only collected when "strictUtm" is disabled - return new RegExp(regex, "i").test(keyValue); - }) - .join("&"); - - p = p || undefinedVar; - return q || undefinedVar; + var getQueryParams = function (ignoreSource) { + return ( + loc.search + .slice(1) + .split("&") + .filter(function (keyValue) { + var ignore = ignoreSource || !collectMetricByString("ut"); + + var paramsRegexList = allowParams.map(filterRegex).join("|"); + var regex = ignore + ? "^(" + paramsRegexList + ")=" + : "^((utm_)" + + (strictUtm ? "" : "?") + + "(source|medium|content|term|campaign)" + + (strictUtm ? "" : "|ref") + + "|" + + paramsRegexList + + ")="; + if (ignore && !allowParams.length) return falseVar; + + // The prefix "utm_" is optional with "strictUtm" disabled + // "ref" is only collected when "strictUtm" is disabled + return new RegExp(regex).test(keyValue); + }) + .join("&") || undefinedVar + ); }; // Ignore pages specified in data-ignore-pages @@ -447,13 +433,12 @@ // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS // - var phantom = window.phantom; var bot = nav.webdriver || window.__nightmare || window.callPhantom || window._phantom || - (phantom && !phantom.solana) || + window.phantom || window.__polypane || window._bot || isBotAgent || @@ -527,12 +512,8 @@ var lastSendPath; var getReferrer = function () { - // Customers can overwrite their referrer, here we check for that - var overwrittenReferrer = - overwriteOptions.referrer || attr(scriptElement, "referrer"); - return ( - (overwrittenReferrer || doc.referrer || "") + (doc.referrer || "") .replace(locationHostname, definedHostname) .replace(/^https?:\/\/((m|l|w{2,3}([0-9]+)?)\.)?([^?#]+)(.*)$/, "$4") .replace(/^([^/]+)$/, "$1") || undefinedVar @@ -573,12 +554,7 @@ // sendData will assign payload to request sendData(append, undefinedVar, trueVar); } else { - try { - nav.sendBeacon.bind(nav)(fullApiUrl + "/append", stringify(append)); - } catch (e) { - // Fallback for browsers throwing "Illegal invocation" when the URL is invalid - sendData(append, undefinedVar, trueVar); - } + nav.sendBeacon(fullApiUrl + "/append", stringify(append)); } }; @@ -675,28 +651,21 @@ isPushState, deleteSourceInfo, sameSite, - search, - metadata, - callback + metadata ) { if (isPushState) sendOnLeave("" + payload.page_id, trueVar); if (collectDataOnLeave) payload.page_id = uuid(); var currentPage = definedHostname + getPath(); - var query = getQueryParams(deleteSourceInfo, search); - sendData( - { - id: payload.page_id, - type: pageviewText, - referrer: !deleteSourceInfo || sameSite ? referrer : null, - query: query, - p: p, - - metadata: stringify(metadata), - }, - callback - ); + sendData({ + id: payload.page_id, + type: pageviewText, + referrer: !deleteSourceInfo || sameSite ? referrer : null, + query: getQueryParams(deleteSourceInfo), + + metadata: stringify(metadata), + }); previousReferrer = referrer; referrer = currentPage; @@ -706,21 +675,7 @@ var sameSite, userNavigated; - var pageview = function ( - isPushState, - pathOverwrite, - metadata, - callbackRaw - ) { - if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata; - var callback = isFunction(callbackRaw) ? callbackRaw : function () {}; - var querySearch; - if (isString(pathOverwrite) && pathOverwrite.indexOf("?") > -1) { - // keep query from manual path - var parts = pathOverwrite.split("?"); - pathOverwrite = parts.shift(); - querySearch = "?" + parts.join("?"); - } + var pageview = function (isPushState, pathOverwrite, metadata) { // Obfuscate personal data in URL by dropping the search and hash var path = getPath(pathOverwrite); @@ -783,10 +738,7 @@ : falseVar; // We set unique variable based on pushstate or back navigation, if no match we check the referrer - page.unique = - /__cf_/.test(getReferrer()) || isPushState || userNavigated - ? falseVar - : !sameSite; + page.unique = isPushState || userNavigated ? falseVar : !sameSite; metadata = appendMetadata(metadata, { type: pageviewText, @@ -795,15 +747,11 @@ var triggerSendPageView = function () { fetchedHighEntropyValues = trueVar; - var delSrc = - isPushState || userNavigated || !collectMetricByString("r"); sendPageView( isPushState, - delSrc, // r = referrers + isPushState || userNavigated || !collectMetricByString("r"), // r = referrers sameSite, - querySearch, - metadata, - callback + metadata ); }; @@ -893,11 +841,11 @@ } if (autoCollect) pageview(); - - window.sa_pageview = function (path, metadata, callback) { - pageview(0, path, metadata, callback); - }; - + else { + window.sa_pageview = function (path, metadata) { + pageview(0, path, metadata); + }; + } ///////////////////// // EVENTS @@ -990,6 +938,6 @@ {"hostname":INSTALL_OPTIONS.hostname,"collectDnt":typeof INSTALL_OPTIONS.collect_dnt === 'boolean' ? INSTALL_OPTIONS.collect_dnt : null,"mode":INSTALL_OPTIONS.hash_mode ? 'hash' : 'normal',"strictUtm":INSTALL_OPTIONS.advanced_settings_toggle && INSTALL_OPTIONS.strict_utm,"allowParams":INSTALL_OPTIONS.advanced_settings_toggle && INSTALL_OPTIONS.allow_url_parameters,"nonUniqueHostnames":INSTALL_OPTIONS.advanced_settings_toggle && INSTALL_OPTIONS.non_unique_hostnames,"ignorePages":INSTALL_OPTIONS.advanced_settings_toggle && INSTALL_OPTIONS.ignore_pages,"namespace":INSTALL_OPTIONS.overwrite_namespace && INSTALL_OPTIONS.namespace}, INSTALL_OPTIONS.custom_domain || "queue.simpleanalyticscdn.com", "", - "cloudflare_12", + "cloudflare_11", "sa" ); diff --git a/dist/latest/custom/app.js b/dist/latest/custom/app.js index fbc94289..bd85d875 100644 --- a/dist/latest/custom/app.js +++ b/dist/latest/custom/app.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-08-12; c8bd; v12) */ +/* Simple Analytics - Privacy friendly analytics (docs.simpleanalytics.com/script; 2026-08-17; 2eca; v11) */ -!function(d,t,e,n,m){try{var v=undefined,g=!0,y=!1,r="true",a="https:",_="pageview",u="event",i="error",o=d.console,c="doNotTrack",w=d.navigator,s=d.location,b=s.host,l=d.document,p=w.userAgent,f="Not sending request ",h=f+"when ",O=y,x=encodeURIComponent,E=decodeURIComponent,S=JSON.stringify,M=d.addEventListener,k="https://"+e,A=l.documentElement||{},q="language",$="Height",j="scroll",D=w.userAgentData,C=j+$,H="offset"+$,R="client"+$,P="pagehide",T="platform",U="platformVersion",I="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),N=d.screen,z=l.currentScript||l.querySelector('script[src*="'+e+'"]');m=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){m("Error in your "+t+" function:",e)},W=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},G=function(t){return"string"==typeof t},J=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},L=function(t,e){return t&&t.getAttribute("data-"+e)},Y=function(t){return Array.isArray(t)?t:G(t)&&t.length?t.split(/, ?/):[]},Z=function(t){return t&&t.constructor===Object},K=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},it=function(t){return"function"==typeof t},ot="namespace",ct=t[ot]||L(z,ot)||"sa",st=function(t,e){var n=d[ct+"_metadata"];Z(n)&&(t=K(t,n));var r=d[kt];if(!it(r))return kt&&m(kt+" not found, set window."+kt),t;try{return K(t,r.call(d,K(t,e)))}catch(a){F("metadata",a)}},ut=t.strictUtm||L(z,"strict-utm")==r,lt=function(i,t){tt=!i&&nt("p")?"":y;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");tt!==y&&0"); +!function(l,t,e,n,p){try{var h=undefined,f=!0,d=!1,r="true",a="https:",m="pageview",u="event",i="error",o=l.console,c="doNotTrack",g=l.navigator,s=l.location,v=s.host,y=l.document,_=g.userAgent,w="Not sending request ",b=w+"when ",E=d,O=encodeURIComponent,x=decodeURIComponent,S=JSON.stringify,M=l.addEventListener,k="https://"+e,A=y.documentElement||{},q="language",$="Height",j="scroll",D=g.userAgentData,C=j+$,H="offset"+$,R="client"+$,P="pagehide",T="platform",U="platformVersion",I="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(_)&&!/(cubot)/i.test(_),N=l.screen,z=y.currentScript||y.querySelector('script[src*="'+e+'"]');p=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){p("Error in your "+t+" function:",e)},W=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},G=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},J=function(t,e){return t&&t.getAttribute("data-"+e)},L=function(t){return Array.isArray(t)?t:"string"==typeof t&&t.length?t.split(/, ?/):[]},Y=function(t){return t&&t.constructor===Object},Z=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},rt=function(t){return"function"==typeof t},at="namespace",it=t[at]||J(z,at)||"sa",ot=l[it+"_metadata"],ct=function(t,e){Y(ot)&&(t=Z(t,ot));var n=l[Mt];if(!rt(n))return t;try{return Z(t,n.call(l,Z(t,e)))}catch(r){F("metadata",r)}},st=t.strictUtm||J(z,"strict-utm")==r,ut=function(a){return s.search.slice(1).split("&").filter(function(t){var e=a||!tt("ut"),n=Ot.map(G).join("|"),r=e?"^("+n+")=":"^((utm_)"+(st?"":"?")+"(source|medium|content|term|campaign)"+(st?"":"|ref")+"|"+n+")=";return e&&!Ot.length?d:new RegExp(r).test(t)}).join("&")||h},lt=it+"_loaded";if(l[lt]==f)return p(w+"twice");l.sa_event_loaded=f,l[lt]=f;var pt=function(e,t,n){e=n?e:Z(qt,Dt,e),g.brave&&!n&&(e.brave=f),g._duckduckgoloader_&&!n&&(e.duck=f);var r=new Image;t&&(r.onerror=t,r.onload=t),r.src=k+"/simple.gif?"+Object.keys(e).filter(function(t){return e[t]!=h}).map(function(t){return O(t)+"="+O(e[t])}).join("&")+"&time="+Date.now()},ht=t.hostname||J(z,"hostname"),ft=ht||v,dt={version:"custom_app_11",hostname:ft};n=function(t){t=t.stack?t+" "+t.stack:t,p(t),pt(Z(dt,{type:i,error:t,path:s.pathname}),h,f)},M(i,function(t){t.filename&&-1"); //# sourceMappingURL=app.js.map \ No newline at end of file diff --git a/dist/latest/custom/app.js.map b/dist/latest/custom/app.js.map index 9c2f27f3..fd21da99 100644 --- a/dist/latest/custom/app.js.map +++ b/dist/latest/custom/app.js.map @@ -1 +1 @@ -{"version":3,"file":"app.source.js","sources":["app.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var p;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n p = !ignoreSource && collectMetricByString(\"p\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (p !== falseVar && i > 0 && keyValue.slice(i + 1))\n p += (p ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n p = p || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n p: p,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_app_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","p","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","protocol","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"app.source.js","sources":["app.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var metadataObject = window[namespace + \"_metadata\"];\n var appendMetadata = function (metadata, data) {\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) return metadata;\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var getQueryParams = function (ignoreSource) {\n return (\n loc.search\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex).test(keyValue);\n })\n .join(\"&\") || undefinedVar\n );\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n window.phantom ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n return (\n (doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n nav.sendBeacon(fullApiUrl + \"/append\", stringify(append));\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n metadata\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n\n sendData({\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: getQueryParams(deleteSourceInfo),\n\n metadata: stringify(metadata),\n });\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (isPushState, pathOverwrite, metadata) {\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique = isPushState || userNavigated ? falseVar : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n sendPageView(\n isPushState,\n isPushState || userNavigated || !collectMetricByString(\"r\"), // r = referrers\n sameSite,\n metadata\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n else {\n window.sa_pageview = function (path, metadata) {\n pageview(0, path, metadata);\n };\n }\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_app_11\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","metadataObject","appendMetadata","metadata","data","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","search","keyValue","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","indexOf","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","bot","webdriver","__nightmare","callPhantom","_phantom","phantom","__polypane","_bot","collectDataOnLeave","ua","protocol","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","i","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","e","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","callbackRaw","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue","q"],"mappings":"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"} \ No newline at end of file diff --git a/dist/latest/custom/auto-events.js b/dist/latest/custom/auto-events.js index 1d46cfd7..c55140ea 100644 --- a/dist/latest/custom/auto-events.js +++ b/dist/latest/custom/auto-events.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-08-12; e658; v12) */ +/* Simple Analytics - Privacy friendly analytics (docs.simpleanalytics.com/script; 2026-08-17; 5dd7; v11) */ -function r(t,e){var n,o;t.hasAttribute("data-simple-event")||(n=!1,b.downloads&&/^https?:\/\//i.test(t.href)&&new RegExp("\\.("+(b.downloadsExtensions||[]).join("|")+")$","i").test(t.pathname)?n="download":b.outbound&&/^https?:\/\//i.test(t.href)&&t.hostname!==h.location.hostname?n="outbound":b.emails&&/^mailto:/i.test(t.href)?n="email":b.phones&&/^tel:/i.test(t.href)&&(n="phone"),n&&(e?(o="saAutomatedLink(this, '"+n+"');",t.hasAttribute("target")&&"_self"!==t.getAttribute("target")||(o+=" return false;"),t.setAttribute("onclick",o)):t.addEventListener("click",function(){g(this,n)})))}function e(){try{for(var t=document.getElementsByTagName("a"),e=0;e -1,\n emails: collectTypes.indexOf(\"emails\") > -1,\n downloads: collectTypes.indexOf(\"downloads\") > -1,\n phones: collectTypes.indexOf(\"phones\") > -1,\n // Downloads: enter file extensions you want to collect\n downloadsExtensions: setting(\"extensions\", \"array\", [\n \"pdf\",\n \"csv\",\n \"docx\",\n \"xlsx\",\n \"zip\",\n \"doc\",\n \"xls\",\n ]),\n\n // All: use title attribute if set for event name (for all events)\n // THIS TAKES PRECEDENCE OVER OTHER SETTINGS BELOW\n title: setting(\"useTitle\", \"bool\", true),\n // Outbound: use full URL of the links? false for just the hostname\n outboundFullUrl: fullUrls,\n // Downloads: if taking event name from URL, use full URL or just filename (default)\n downloadsFullUrl: fullUrls,\n };\n\n var saGlobal = setting(\"saGlobal\", \"string\", \"sa_event\");\n\n // For compiling the script\n var optionsLink = options;\n\n if (typeof optionsLink === \"undefined\")\n log(\"options object not found, please specify\", \"warn\");\n\n var saAutomatedLink = function saAutomatedLink(element, type) {\n try {\n if (!element) return log(\"no element found\");\n var sent = false;\n\n var callback = function () {\n if (\n !sent &&\n (!element.hasAttribute(\"target\") ||\n element.getAttribute(\"target\") === \"_self\")\n )\n document.location = element.getAttribute(\"href\");\n sent = true;\n };\n\n if (window[saGlobal] && window[saGlobal + \"_loaded\"]) {\n var hostname = element.hostname;\n var pathname = element.pathname;\n\n var event;\n var metadata = {\n title: element.getAttribute(\"title\") || undefined,\n };\n var url = element.href || undefined;\n\n var useTitle = false;\n if (optionsLink.title && element.hasAttribute(\"title\")) {\n var theTitle = element.getAttribute(\"title\").trim();\n if (theTitle != \"\") useTitle = true;\n }\n\n if (useTitle) {\n event = theTitle;\n } else {\n switch (type) {\n case \"outbound\": {\n event = hostname + (optionsLink.outboundFullUrl ? pathname : \"\");\n metadata.url = url;\n break;\n }\n case \"download\": {\n event = optionsLink.downloadsFullUrl\n ? hostname + pathname\n : pathname.split(\"/\").pop();\n metadata.url = url;\n break;\n }\n case \"email\": {\n var href = element.getAttribute(\"href\");\n event = (href.split(\":\")[1] || \"\").split(\"?\")[0];\n metadata.email = event;\n break;\n }\n case \"phone\": {\n var hrefPhone = element.getAttribute(\"href\");\n event = (hrefPhone.split(\":\")[1] || \"\").split(\"?\")[0];\n metadata.phone = event;\n break;\n }\n }\n }\n\n var clean =\n type +\n \"_\" +\n event.replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_+|_+$)/g, \"\");\n\n window[saGlobal](clean, metadata, callback);\n\n log(\"collected \" + clean);\n\n return type === \"email\" || type === \"phone\"\n ? callback()\n : window.setTimeout(callback, 5000);\n } else {\n log(saGlobal + \" is not defined\", \"warn\");\n return callback();\n }\n } catch (error) {\n log(error.message, \"warn\");\n }\n };\n\n window.saAutomatedLink = saAutomatedLink;\n\n function collectLink(link, onclick) {\n if (link.hasAttribute(\"data-simple-event\")) return;\n var collect = false;\n\n // Collect download clicks\n if (\n optionsLink.downloads &&\n /^https?:\\/\\//i.test(link.href) &&\n new RegExp(\n \"\\\\.(\" + (optionsLink.downloadsExtensions || []).join(\"|\") + \")$\",\n \"i\"\n ).test(link.pathname)\n ) {\n collect = \"download\";\n\n // Collect outbound links clicks\n } else if (\n optionsLink.outbound &&\n /^https?:\\/\\//i.test(link.href) &&\n link.hostname !== window.location.hostname\n ) {\n collect = \"outbound\";\n\n // Collect email clicks\n } else if (optionsLink.emails && /^mailto:/i.test(link.href)) {\n collect = \"email\";\n\n // Collect telephone clicks\n } else if (optionsLink.phones && /^tel:/i.test(link.href)) {\n collect = \"phone\";\n }\n\n if (!collect) return;\n\n if (onclick) {\n var onClickAttribute = \"saAutomatedLink(this, '\" + collect + \"');\";\n\n if (\n !link.hasAttribute(\"target\") ||\n link.getAttribute(\"target\") === \"_self\"\n )\n onClickAttribute += \" return false;\";\n\n link.setAttribute(\"onclick\", onClickAttribute);\n } else {\n link.addEventListener(\"click\", function () {\n saAutomatedLink(this, collect);\n });\n }\n }\n\n function onDOMContentLoaded() {\n try {\n var a = document.getElementsByTagName(\"a\");\n\n // Loop over all links on the page\n for (var i = 0; i < a.length; i++) {\n var link = a[i];\n var href = link.getAttribute(\"href\");\n\n // Skip links that don't have an href\n if (!href) continue;\n\n // We don't want to overwrite website behaviour so we check for the onclick attribute\n if (\n !link.getAttribute(\"onclick\") &&\n !/^mailto:/.test(href) &&\n !/^tel:/.test(href)\n ) {\n collectLink(link, true);\n } else {\n collectLink(link, false);\n }\n }\n } catch (error) {\n log(error.message, \"warn\");\n }\n }\n\n if (doc.readyState === \"ready\" || doc.readyState === \"complete\") {\n onDOMContentLoaded();\n } else {\n document.addEventListener(\"readystatechange\", function (event) {\n if (event.target.readyState === \"complete\") onDOMContentLoaded();\n });\n }\n})(window);\n"],"names":["collectLink","link","onclick","collect","onClickAttribute","hasAttribute","optionsLink","downloads","test","href","RegExp","downloadsExtensions","join","pathname","outbound","hostname","window","location","emails","phones","getAttribute","setAttribute","addEventListener","saAutomatedLink","this","onDOMContentLoaded","a","document","getElementsByTagName","i","length","error","log","message","doc","scriptElement","setting","collectTypes","fullUrls","options","saGlobal","type","logger","console","warn","info","currentScript","querySelector","attribute","defaultValue","value","dataset","split","map","item","trim","filter","Boolean","indexOf","title","outboundFullUrl","downloadsFullUrl","element","sent","callback","theTitle","metadata","undefined","url","useTitle","event","pop","email","phone","clean","replace","setTimeout","readyState","target"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"auto-events.source.js","sources":["auto-events.source.js"],"sourcesContent":["(function saAutomatedEvents(window) {\n // Skip server side rendered pages\n if (typeof window === \"undefined\") return;\n\n var log = function (message, type) {\n var logger = type === \"warn\" ? console.warn : console.info;\n return logger && logger(\"Simple Analytics auto events:\", message);\n };\n\n var doc = window.document;\n\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"auto-events.js\"]');\n\n var setting = function (attribute, type, defaultValue) {\n var value = scriptElement && scriptElement.dataset[attribute];\n\n // Booleans\n if (type === \"bool\" && (value === \"true\" || value === \"false\"))\n return value === \"true\";\n else if (type === \"bool\") return defaultValue;\n\n // Arrays\n if (type === \"array\" && value)\n return value\n .split(\",\")\n .map(function (item) {\n return item.trim();\n })\n .filter(Boolean);\n else if (type === \"array\") return defaultValue;\n\n return value || defaultValue;\n };\n\n var collectTypes = setting(\"collect\", \"array\", [\n \"outbound\",\n \"emails\",\n \"downloads\",\n ]);\n var fullUrls = setting(\"fullUrls\", \"bool\", false);\n\n var options = {\n // What to collect\n outbound: collectTypes.indexOf(\"outbound\") > -1,\n emails: collectTypes.indexOf(\"emails\") > -1,\n downloads: collectTypes.indexOf(\"downloads\") > -1,\n // Downloads: enter file extensions you want to collect\n downloadsExtensions: setting(\"extensions\", \"array\", [\n \"pdf\",\n \"csv\",\n \"docx\",\n \"xlsx\",\n \"zip\",\n \"doc\",\n \"xls\",\n ]),\n\n // All: use title attribute if set for event name (for all events)\n // THIS TAKES PRECEDENCE OVER OTHER SETTINGS BELOW\n title: setting(\"useTitle\", \"bool\", true),\n // Outbound: use full URL of the links? false for just the hostname\n outboundFullUrl: fullUrls,\n // Downloads: if taking event name from URL, use full URL or just filename (default)\n downloadsFullUrl: fullUrls,\n };\n\n var saGlobal = setting(\"saGlobal\", \"string\", \"sa_event\");\n\n // For compiling the script\n var optionsLink = options;\n\n if (typeof optionsLink === \"undefined\")\n log(\"options object not found, please specify\", \"warn\");\n\n window.saAutomatedLink = function saAutomatedLink(element, type) {\n try {\n if (!element) return log(\"no element found\");\n var sent = false;\n\n var callback = function () {\n if (\n !sent &&\n (!element.hasAttribute(\"target\") ||\n element.getAttribute(\"target\") === \"_self\")\n )\n document.location = element.getAttribute(\"href\");\n sent = true;\n };\n\n if (window[saGlobal] && window[saGlobal + \"_loaded\"]) {\n var hostname = element.hostname;\n var pathname = element.pathname;\n\n var event;\n var metadata = {\n title: element.getAttribute(\"title\") || undefined,\n };\n var url = element.href || undefined;\n\n var useTitle = false;\n if (optionsLink.title && element.hasAttribute(\"title\")) {\n var theTitle = element.getAttribute(\"title\").trim();\n if (theTitle != \"\") useTitle = true;\n }\n\n if (useTitle) {\n event = theTitle;\n } else {\n switch (type) {\n case \"outbound\": {\n event = hostname + (optionsLink.outboundFullUrl ? pathname : \"\");\n metadata.url = url;\n break;\n }\n case \"download\": {\n event = optionsLink.downloadsFullUrl\n ? hostname + pathname\n : pathname.split(\"/\").pop();\n metadata.url = url;\n break;\n }\n case \"email\": {\n var href = element.getAttribute(\"href\");\n event = (href.split(\":\")[1] || \"\").split(\"?\")[0];\n metadata.email = event;\n break;\n }\n }\n }\n\n var clean =\n type +\n \"_\" +\n event.replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_+|_+$)/g, \"\");\n\n window[saGlobal](clean, metadata, callback);\n\n log(\"collected \" + clean);\n\n return type === \"email\"\n ? callback()\n : window.setTimeout(callback, 5000);\n } else {\n log(saGlobal + \" is not defined\", \"warn\");\n return callback();\n }\n } catch (error) {\n log(error.message, \"warn\");\n }\n };\n\n function collectLink(link, onclick) {\n var collect = false;\n\n // Collect download clicks\n if (\n optionsLink.downloads &&\n /^https?:\\/\\//i.test(link.href) &&\n new RegExp(\n \"\\\\.(\" + (optionsLink.downloadsExtensions || []).join(\"|\") + \")$\",\n \"i\"\n ).test(link.pathname)\n ) {\n collect = \"download\";\n\n // Collect outbound links clicks\n } else if (\n optionsLink.outbound &&\n /^https?:\\/\\//i.test(link.href) &&\n link.hostname !== window.location.hostname\n ) {\n collect = \"outbound\";\n\n // Collect email clicks\n } else if (optionsLink.emails && /^mailto:/i.test(link.href)) {\n collect = \"email\";\n }\n\n if (!collect) return;\n\n if (onclick) {\n var onClickAttribute = \"saAutomatedLink(this, '\" + collect + \"');\";\n\n if (\n !link.hasAttribute(\"target\") ||\n link.getAttribute(\"target\") === \"_self\"\n )\n onClickAttribute += \" return false;\";\n\n link.setAttribute(\"onclick\", onClickAttribute);\n } else {\n link.addEventListener(\"click\", function () {\n saAutomatedLink(this, collect);\n });\n }\n }\n\n function onDOMContentLoaded() {\n try {\n var a = document.getElementsByTagName(\"a\");\n\n // Loop over all links on the page\n for (var i = 0; i < a.length; i++) {\n var link = a[i];\n var href = link.getAttribute(\"href\");\n\n // Skip links that don't have an href\n if (!href) continue;\n\n // We don't want to overwrite website behaviour so we check for the onclick attribute\n if (!link.getAttribute(\"onclick\") && !/^mailto:/.test(href)) {\n collectLink(link, true);\n } else {\n collectLink(link, false);\n }\n }\n } catch (error) {\n log(error.message, \"warn\");\n }\n }\n\n if (doc.readyState === \"ready\" || doc.readyState === \"complete\") {\n onDOMContentLoaded();\n } else {\n document.addEventListener(\"readystatechange\", function (event) {\n if (event.target.readyState === \"complete\") onDOMContentLoaded();\n });\n }\n})(window);\n"],"names":["collectLink","link","onclick","onClickAttribute","collect","optionsLink","downloads","test","href","RegExp","downloadsExtensions","join","pathname","outbound","hostname","window","location","emails","hasAttribute","getAttribute","setAttribute","addEventListener","saAutomatedLink","this","onDOMContentLoaded","a","document","getElementsByTagName","i","length","error","log","message","doc","scriptElement","setting","collectTypes","fullUrls","options","saGlobal","type","logger","console","warn","info","currentScript","querySelector","attribute","defaultValue","value","dataset","split","map","item","trim","filter","Boolean","indexOf","title","outboundFullUrl","downloadsFullUrl","element","sent","callback","theTitle","metadata","undefined","url","useTitle","event","pop","email","clean","replace","setTimeout","readyState","target"],"mappings":"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"} \ No newline at end of file diff --git a/dist/latest/custom/e.js b/dist/latest/custom/e.js index a1fbd2a4..5d67ac66 100644 --- a/dist/latest/custom/e.js +++ b/dist/latest/custom/e.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-08-12; 0f37; v12) */ +/* Simple Analytics - Privacy friendly analytics (docs.simpleanalytics.com/script; 2026-08-17; 4949; v11) */ -!function(d,t,e,n,m){try{var v=undefined,g=!0,y=!1,r="true",a="https:",_="pageview",u="event",i="error",o=d.console,c="doNotTrack",w=d.navigator,s=d.location,b=s.host,l=d.document,p=w.userAgent,f="Not sending request ",h=f+"when ",O=y,x=encodeURIComponent,E=decodeURIComponent,S=JSON.stringify,M=d.addEventListener,k="https://"+e,A=l.documentElement||{},q="language",$="Height",j="scroll",D=w.userAgentData,C=j+$,H="offset"+$,R="client"+$,P="pagehide",T="platform",U="platformVersion",I="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),N=d.screen,z=l.currentScript||l.querySelector('script[src*="'+e+'"]');m=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){m("Error in your "+t+" function:",e)},W=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},G=function(t){return"string"==typeof t},J=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},L=function(t,e){return t&&t.getAttribute("data-"+e)},Y=function(t){return Array.isArray(t)?t:G(t)&&t.length?t.split(/, ?/):[]},Z=function(t){return t&&t.constructor===Object},K=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},it=function(t){return"function"==typeof t},ot="namespace",ct=t[ot]||L(z,ot)||"sa",st=function(t,e){var n=d[ct+"_metadata"];Z(n)&&(t=K(t,n));var r=d[kt];if(!it(r))return kt&&m(kt+" not found, set window."+kt),t;try{return K(t,r.call(d,K(t,e)))}catch(a){F("metadata",a)}},ut=t.strictUtm||L(z,"strict-utm")==r,lt=function(i,t){tt=!i&&nt("p")?"":y;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");tt!==y&&0"); +!function(l,t,e,n,p){try{var h=undefined,f=!0,d=!1,r="true",a="https:",m="pageview",u="event",i="error",o=l.console,c="doNotTrack",g=l.navigator,s=l.location,v=s.host,y=l.document,_=g.userAgent,w="Not sending request ",b=w+"when ",E=d,O=encodeURIComponent,x=decodeURIComponent,S=JSON.stringify,M=l.addEventListener,k="https://"+e,A=y.documentElement||{},q="language",$="Height",j="scroll",D=g.userAgentData,C=j+$,H="offset"+$,R="client"+$,P="pagehide",T="platform",U="platformVersion",I="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(_)&&!/(cubot)/i.test(_),N=l.screen,z=y.currentScript||y.querySelector('script[src*="'+e+'"]');p=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){p("Error in your "+t+" function:",e)},W=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},G=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},J=function(t,e){return t&&t.getAttribute("data-"+e)},L=function(t){return Array.isArray(t)?t:"string"==typeof t&&t.length?t.split(/, ?/):[]},Y=function(t){return t&&t.constructor===Object},Z=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},rt=function(t){return"function"==typeof t},at="namespace",it=t[at]||J(z,at)||"sa",ot=l[it+"_metadata"],ct=function(t,e){Y(ot)&&(t=Z(t,ot));var n=l[Mt];if(!rt(n))return t;try{return Z(t,n.call(l,Z(t,e)))}catch(r){F("metadata",r)}},st=t.strictUtm||J(z,"strict-utm")==r,ut=function(a){return s.search.slice(1).split("&").filter(function(t){var e=a||!tt("ut"),n=Ot.map(G).join("|"),r=e?"^("+n+")=":"^((utm_)"+(st?"":"?")+"(source|medium|content|term|campaign)"+(st?"":"|ref")+"|"+n+")=";return e&&!Ot.length?d:new RegExp(r).test(t)}).join("&")||h},lt=it+"_loaded";if(l[lt]==f)return p(w+"twice");l.sa_event_loaded=f,l[lt]=f;var pt=function(e,t,n){e=n?e:Z(qt,Dt,e),g.brave&&!n&&(e.brave=f),g._duckduckgoloader_&&!n&&(e.duck=f);var r=new Image;t&&(r.onerror=t,r.onload=t),r.src=k+"/simple.gif?"+Object.keys(e).filter(function(t){return e[t]!=h}).map(function(t){return O(t)+"="+O(e[t])}).join("&")+"&time="+Date.now()},ht=t.hostname||J(z,"hostname"),ft=ht||v,dt={version:"custom_events_11",hostname:ft};n=function(t){t=t.stack?t+" "+t.stack:t,p(t),pt(Z(dt,{type:i,error:t,path:s.pathname}),h,f)},M(i,function(t){t.filename&&-1"); //# sourceMappingURL=e.js.map \ No newline at end of file diff --git a/dist/latest/custom/e.js.map b/dist/latest/custom/e.js.map index 94559a83..01cf5d9b 100644 --- a/dist/latest/custom/e.js.map +++ b/dist/latest/custom/e.js.map @@ -1 +1 @@ -{"version":3,"file":"e.source.js","sources":["e.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var p;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n p = !ignoreSource && collectMetricByString(\"p\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (p !== falseVar && i > 0 && keyValue.slice(i + 1))\n p += (p ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n p = p || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n p: p,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_events_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","p","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","protocol","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"e.source.js","sources":["e.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var metadataObject = window[namespace + \"_metadata\"];\n var appendMetadata = function (metadata, data) {\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) return metadata;\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var getQueryParams = function (ignoreSource) {\n return (\n loc.search\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex).test(keyValue);\n })\n .join(\"&\") || undefinedVar\n );\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n window.phantom ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n return (\n (doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n nav.sendBeacon(fullApiUrl + \"/append\", stringify(append));\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n metadata\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n\n sendData({\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: getQueryParams(deleteSourceInfo),\n\n metadata: stringify(metadata),\n });\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (isPushState, pathOverwrite, metadata) {\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique = isPushState || userNavigated ? falseVar : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n sendPageView(\n isPushState,\n isPushState || userNavigated || !collectMetricByString(\"r\"), // r = referrers\n sameSite,\n metadata\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n else {\n window.sa_pageview = function (path, metadata) {\n pageview(0, path, metadata);\n };\n }\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_events_11\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","metadataObject","appendMetadata","metadata","data","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","search","keyValue","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","indexOf","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","bot","webdriver","__nightmare","callPhantom","_phantom","phantom","__polypane","_bot","collectDataOnLeave","ua","protocol","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","i","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","e","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","callbackRaw","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue","q"],"mappings":"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"} \ No newline at end of file diff --git a/dist/latest/custom/latest.dev.js b/dist/latest/custom/latest.dev.js index 79fbc860..883ddcd6 100644 --- a/dist/latest/custom/latest.dev.js +++ b/dist/latest/custom/latest.dev.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-08-12; 6031; v12) */ +/* Simple Analytics - Privacy friendly analytics (docs.simpleanalytics.com/script; 2026-08-17; 1bd9; v11) */ /* eslint-env browser */ (function ( @@ -191,17 +191,11 @@ attr(scriptElement, namespaceText) || defaultNamespace; + var metadataObject = window[namespace + "_metadata"]; var appendMetadata = function (metadata, data) { - var metadataObject = window[namespace + "_metadata"]; if (isObject(metadataObject)) metadata = assign(metadata, metadataObject); var metadataCollectorFunction = window[metadataCollector]; - if (!isFunction(metadataCollectorFunction)) { - if (metadataCollector) - warn( - metadataCollector + " not found, set window." + metadataCollector - ); - return metadata; - } + if (!isFunction(metadataCollectorFunction)) return metadata; try { return assign( metadata, @@ -222,40 +216,32 @@ overwriteOptions.strictUtm || attr(scriptElement, "strict-utm") == trueText; - var p; - - var getQueryParams = function (ignoreSource, overwriteSearch) { - p = !ignoreSource && collectMetricByString("p") ? "" : falseVar; - var q = (overwriteSearch || loc.search) - .slice(1) - .split("&") - .filter(function (keyValue) { - var i = keyValue.indexOf("="); - if (p !== falseVar && i > 0 && keyValue.slice(i + 1)) - p += (p ? "," : "") + keyValue.slice(0, i); - - var ignore = ignoreSource || !collectMetricByString("ut"); - - var paramsRegexList = allowParams.map(filterRegex).join("|"); - var regex = ignore - ? "^(" + paramsRegexList + ")=" - : "^((utm_)" + - (strictUtm ? "" : "?") + - "(source|medium|content|term|campaign)" + - (strictUtm ? "" : "|ref") + - "|" + - paramsRegexList + - ")="; - if (ignore && !allowParams.length) return falseVar; - - // The prefix "utm_" is optional with "strictUtm" disabled - // "ref" is only collected when "strictUtm" is disabled - return new RegExp(regex, "i").test(keyValue); - }) - .join("&"); - - p = p || undefinedVar; - return q || undefinedVar; + var getQueryParams = function (ignoreSource) { + return ( + loc.search + .slice(1) + .split("&") + .filter(function (keyValue) { + var ignore = ignoreSource || !collectMetricByString("ut"); + + var paramsRegexList = allowParams.map(filterRegex).join("|"); + var regex = ignore + ? "^(" + paramsRegexList + ")=" + : "^((utm_)" + + (strictUtm ? "" : "?") + + "(source|medium|content|term|campaign)" + + (strictUtm ? "" : "|ref") + + "|" + + paramsRegexList + + ")="; + if (ignore && !allowParams.length) return falseVar; + + // The prefix "utm_" is optional with "strictUtm" disabled + // "ref" is only collected when "strictUtm" is disabled + return new RegExp(regex).test(keyValue); + }) + .join("&") || undefinedVar + ); }; // Ignore pages specified in data-ignore-pages @@ -446,13 +432,12 @@ // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS // - var phantom = window.phantom; var bot = nav.webdriver || window.__nightmare || window.callPhantom || window._phantom || - (phantom && !phantom.solana) || + window.phantom || window.__polypane || window._bot || isBotAgent || @@ -527,12 +512,8 @@ var lastSendPath; var getReferrer = function () { - // Customers can overwrite their referrer, here we check for that - var overwrittenReferrer = - overwriteOptions.referrer || attr(scriptElement, "referrer"); - return ( - (overwrittenReferrer || doc.referrer || "") + (doc.referrer || "") .replace(locationHostname, definedHostname) .replace(/^https?:\/\/((m|l|w{2,3}([0-9]+)?)\.)?([^?#]+)(.*)$/, "$4") .replace(/^([^/]+)$/, "$1") || undefinedVar @@ -573,12 +554,7 @@ // sendData will assign payload to request sendData(append, undefinedVar, trueVar); } else { - try { - nav.sendBeacon.bind(nav)(fullApiUrl + "/append", stringify(append)); - } catch (e) { - // Fallback for browsers throwing "Illegal invocation" when the URL is invalid - sendData(append, undefinedVar, trueVar); - } + nav.sendBeacon(fullApiUrl + "/append", stringify(append)); } }; @@ -675,28 +651,21 @@ isPushState, deleteSourceInfo, sameSite, - search, - metadata, - callback + metadata ) { if (isPushState) sendOnLeave("" + payload.page_id, trueVar); if (collectDataOnLeave) payload.page_id = uuid(); var currentPage = definedHostname + getPath(); - var query = getQueryParams(deleteSourceInfo, search); - sendData( - { - id: payload.page_id, - type: pageviewText, - referrer: !deleteSourceInfo || sameSite ? referrer : null, - query: query, - p: p, - - metadata: stringify(metadata), - }, - callback - ); + sendData({ + id: payload.page_id, + type: pageviewText, + referrer: !deleteSourceInfo || sameSite ? referrer : null, + query: getQueryParams(deleteSourceInfo), + + metadata: stringify(metadata), + }); previousReferrer = referrer; referrer = currentPage; @@ -706,21 +675,7 @@ var sameSite, userNavigated; - var pageview = function ( - isPushState, - pathOverwrite, - metadata, - callbackRaw - ) { - if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata; - var callback = isFunction(callbackRaw) ? callbackRaw : function () {}; - var querySearch; - if (isString(pathOverwrite) && pathOverwrite.indexOf("?") > -1) { - // keep query from manual path - var parts = pathOverwrite.split("?"); - pathOverwrite = parts.shift(); - querySearch = "?" + parts.join("?"); - } + var pageview = function (isPushState, pathOverwrite, metadata) { // Obfuscate personal data in URL by dropping the search and hash var path = getPath(pathOverwrite); @@ -783,10 +738,7 @@ : falseVar; // We set unique variable based on pushstate or back navigation, if no match we check the referrer - page.unique = - /__cf_/.test(getReferrer()) || isPushState || userNavigated - ? falseVar - : !sameSite; + page.unique = isPushState || userNavigated ? falseVar : !sameSite; metadata = appendMetadata(metadata, { type: pageviewText, @@ -795,15 +747,11 @@ var triggerSendPageView = function () { fetchedHighEntropyValues = trueVar; - var delSrc = - isPushState || userNavigated || !collectMetricByString("r"); sendPageView( isPushState, - delSrc, // r = referrers + isPushState || userNavigated || !collectMetricByString("r"), // r = referrers sameSite, - querySearch, - metadata, - callback + metadata ); }; @@ -893,11 +841,11 @@ } if (autoCollect) pageview(); - - window.sa_pageview = function (path, metadata, callback) { - pageview(0, path, metadata, callback); - }; - + else { + window.sa_pageview = function (path, metadata) { + pageview(0, path, metadata); + }; + } ///////////////////// // EVENTS @@ -990,6 +938,6 @@ {}, "", "", - "custom_latest_dev_12", + "custom_latest_dev_11", "sa" ); diff --git a/dist/latest/custom/latest.js b/dist/latest/custom/latest.js index 9157be95..ad661a78 100644 --- a/dist/latest/custom/latest.js +++ b/dist/latest/custom/latest.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-08-12; d920; v12) */ +/* Simple Analytics - Privacy friendly analytics (docs.simpleanalytics.com/script; 2026-08-17; 4015; v11) */ -!function(d,t,e,n,m){try{var v=undefined,g=!0,y=!1,r="true",a="https:",_="pageview",u="event",i="error",o=d.console,c="doNotTrack",w=d.navigator,s=d.location,b=s.host,l=d.document,p=w.userAgent,f="Not sending request ",h=f+"when ",O=y,x=encodeURIComponent,E=decodeURIComponent,S=JSON.stringify,M=d.addEventListener,k="https://"+e,A=l.documentElement||{},q="language",$="Height",j="scroll",D=w.userAgentData,C=j+$,H="offset"+$,R="client"+$,P="pagehide",T="platform",U="platformVersion",I="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),N=d.screen,z=l.currentScript||l.querySelector('script[src*="'+e+'"]');m=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){m("Error in your "+t+" function:",e)},W=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},G=function(t){return"string"==typeof t},J=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},L=function(t,e){return t&&t.getAttribute("data-"+e)},Y=function(t){return Array.isArray(t)?t:G(t)&&t.length?t.split(/, ?/):[]},Z=function(t){return t&&t.constructor===Object},K=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},it=function(t){return"function"==typeof t},ot="namespace",ct=t[ot]||L(z,ot)||"sa",st=function(t,e){var n=d[ct+"_metadata"];Z(n)&&(t=K(t,n));var r=d[kt];if(!it(r))return kt&&m(kt+" not found, set window."+kt),t;try{return K(t,r.call(d,K(t,e)))}catch(a){F("metadata",a)}},ut=t.strictUtm||L(z,"strict-utm")==r,lt=function(i,t){tt=!i&&nt("p")?"":y;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");tt!==y&&0"); +!function(l,t,e,n,p){try{var h=undefined,f=!0,d=!1,r="true",a="https:",m="pageview",u="event",i="error",o=l.console,c="doNotTrack",g=l.navigator,s=l.location,v=s.host,y=l.document,_=g.userAgent,w="Not sending request ",b=w+"when ",E=d,O=encodeURIComponent,x=decodeURIComponent,S=JSON.stringify,M=l.addEventListener,k="https://"+e,A=y.documentElement||{},q="language",$="Height",j="scroll",D=g.userAgentData,C=j+$,H="offset"+$,R="client"+$,P="pagehide",T="platform",U="platformVersion",I="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(_)&&!/(cubot)/i.test(_),N=l.screen,z=y.currentScript||y.querySelector('script[src*="'+e+'"]');p=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){p("Error in your "+t+" function:",e)},W=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},G=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},J=function(t,e){return t&&t.getAttribute("data-"+e)},L=function(t){return Array.isArray(t)?t:"string"==typeof t&&t.length?t.split(/, ?/):[]},Y=function(t){return t&&t.constructor===Object},Z=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},rt=function(t){return"function"==typeof t},at="namespace",it=t[at]||J(z,at)||"sa",ot=l[it+"_metadata"],ct=function(t,e){Y(ot)&&(t=Z(t,ot));var n=l[Mt];if(!rt(n))return t;try{return Z(t,n.call(l,Z(t,e)))}catch(r){F("metadata",r)}},st=t.strictUtm||J(z,"strict-utm")==r,ut=function(a){return s.search.slice(1).split("&").filter(function(t){var e=a||!tt("ut"),n=Ot.map(G).join("|"),r=e?"^("+n+")=":"^((utm_)"+(st?"":"?")+"(source|medium|content|term|campaign)"+(st?"":"|ref")+"|"+n+")=";return e&&!Ot.length?d:new RegExp(r).test(t)}).join("&")||h},lt=it+"_loaded";if(l[lt]==f)return p(w+"twice");l.sa_event_loaded=f,l[lt]=f;var pt=function(e,t,n){e=n?e:Z(qt,Dt,e),g.brave&&!n&&(e.brave=f),g._duckduckgoloader_&&!n&&(e.duck=f);var r=new Image;t&&(r.onerror=t,r.onload=t),r.src=k+"/simple.gif?"+Object.keys(e).filter(function(t){return e[t]!=h}).map(function(t){return O(t)+"="+O(e[t])}).join("&")+"&time="+Date.now()},ht=t.hostname||J(z,"hostname"),ft=ht||v,dt={version:"custom_latest_11",hostname:ft};n=function(t){t=t.stack?t+" "+t.stack:t,p(t),pt(Z(dt,{type:i,error:t,path:s.pathname}),h,f)},M(i,function(t){t.filename&&-1"); //# sourceMappingURL=latest.js.map \ No newline at end of file diff --git a/dist/latest/custom/latest.js.map b/dist/latest/custom/latest.js.map index 22d0b988..d0be19b3 100644 --- a/dist/latest/custom/latest.js.map +++ b/dist/latest/custom/latest.js.map @@ -1 +1 @@ -{"version":3,"file":"latest.source.js","sources":["latest.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var p;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n p = !ignoreSource && collectMetricByString(\"p\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (p !== falseVar && i > 0 && keyValue.slice(i + 1))\n p += (p ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n p = p || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n p: p,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_latest_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","p","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","protocol","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"latest.source.js","sources":["latest.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var metadataObject = window[namespace + \"_metadata\"];\n var appendMetadata = function (metadata, data) {\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) return metadata;\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var getQueryParams = function (ignoreSource) {\n return (\n loc.search\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex).test(keyValue);\n })\n .join(\"&\") || undefinedVar\n );\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n window.phantom ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n return (\n (doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n nav.sendBeacon(fullApiUrl + \"/append\", stringify(append));\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n metadata\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n\n sendData({\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: getQueryParams(deleteSourceInfo),\n\n metadata: stringify(metadata),\n });\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (isPushState, pathOverwrite, metadata) {\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique = isPushState || userNavigated ? falseVar : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n sendPageView(\n isPushState,\n isPushState || userNavigated || !collectMetricByString(\"r\"), // r = referrers\n sameSite,\n metadata\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n else {\n window.sa_pageview = function (path, metadata) {\n pageview(0, path, metadata);\n };\n }\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_latest_11\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","metadataObject","appendMetadata","metadata","data","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","search","keyValue","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","indexOf","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","bot","webdriver","__nightmare","callPhantom","_phantom","phantom","__polypane","_bot","collectDataOnLeave","ua","protocol","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","i","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","e","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","callbackRaw","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue","q"],"mappings":"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"} \ No newline at end of file diff --git a/dist/latest/custom/light.js b/dist/latest/custom/light.js index dc2204b7..4c6f493b 100644 --- a/dist/latest/custom/light.js +++ b/dist/latest/custom/light.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-08-12; 1b6a; v12) */ +/* Simple Analytics - Privacy friendly analytics (docs.simpleanalytics.com/script; 2026-08-17; 98d5; v11) */ -!function(l,e,t,f){try{var u=undefined,n="https:",r=l.console,i="doNotTrack",m=l.navigator,p=l.location,g=p.host,a=l.document,o=m.userAgent,c="Not sending request ",h=!1,s=encodeURIComponent,d=decodeURIComponent,v=JSON.stringify,y=l.addEventListener,_="https://"+t,b=(a.documentElement,"language"),w=m.userAgentData,O="platform",S="platformVersion",j="https://docs.simpleanalytics.com",k=/(bot|spider|crawl)/i.test(o)&&!/(cubot)/i.test(o),x=a.currentScript||a.querySelector('script[src*="'+t+'"]');f=function(){var e=[].slice.call(arguments);return e.unshift("Simple Analytics:"),Function.prototype.apply.call(r.warn,r,e)};var E=function(e){return"string"==typeof e},A=function(e,t){return e&&e.getAttribute("data-"+t)},$=function(){for(var e,t,n,r={},i=arguments,a=0;a>e/4).toString(16)})}catch(r){return e.replace(n,function(e){var t=16*Math.random()|0;return(e<2?t:3&t|8).toString(16)})}},N=function(e){return"function"==typeof e},R="namespace",U=e[R]||A(x,R)||"sa",V=e.strictUtm||"true"==A(x,"strict-utm"),B=U+"_loaded";if(1==l[B])return f(c+"twice");l.sa_event_loaded=!0,l[B]=!0;var C,H=function(t,e,n){t=n?t:$(J,M,t),m.brave&&!n&&(t.brave=!0),m._duckduckgoloader_&&!n&&(t.duck=!0),(new Image).src=_+"/simple.gif?"+Object.keys(t).filter(function(e){return t[e]!=u}).map(function(e){return s(e)+"="+s(t[e])}).join("&")+"&time="+Date.now()},T=e.hostname||A(x,"hostname"),F=T||g,z={version:"custom_light_12",hostname:F};e.mode||A(x,"mode");try{C=Intl.DateTimeFormat().resolvedOptions().timeZone}catch(X){f(X)}k&&(z.bot=!0);var J=$(z,{ua:o,https:p.protocol==n,timezone:C,page_id:I(),session_id:I()});if(J.sri=!1,w&&(J.mobile=w.mobile,J.brands=v(w.brands)),F!==g&&(J.hostname_original=g),i in m&&"1"==m[i])return f("Not sending request when "+i+" is enabled. See "+j+"/dnt");-1!=g.indexOf(".")&&!/^[0-9.:]+$/.test(g)||T||f("Set hostname on "+g+". See "+j+"/overwrite-domain-name");var L,M={},P=(e.referrer||A(x,"referrer")||a.referrer||"").replace(g,F).replace(/^https?:\/\/((m|l|w{2,3}([0-9]+)?)\.)?([^?#]+)(.*)$/,"$4").replace(/^([^/]+)$/,"$1")||u,Z=function(e,t){var n=$(z,{type:"append",original_id:t?e:J.page_id});if(t||!m.sendBeacon)H(n,0,!0);else try{m.sendBeacon.bind(m)(_+"/append",v(n))}catch(r){H(n,0,!0)}};y("pagehide",Z,!1);var G,K,Q=function(e){var t="";try{t=e||d(p.pathname)}catch(X){f(X)}return t},W=function(e,t,n,r,i,a){e&&Z(""+J.page_id,!0),J.page_id=I();var o,c=F+Q(),s=(o=t,(r||p.search).slice(1).split("&").filter(function(e){return!o&&new RegExp("^((utm_)"+(V?"":"?")+"(source|medium|content|term|campaign)"+(V?"":"|ref")+")=","i").test(e)}).join("&")||u);H({id:J.page_id,type:"pageview",referrer:!t||n?P:null,query:s}),P=c,0};!function(e,t,n,r){!r&&N(n)&&(r=n);var i,a;N(r);E(t)&&-1"); +!function(s,e,t,u){try{var i=undefined,n="https:",r=s.console,a="doNotTrack",p=s.navigator,c=s.location,d=c.host,o=s.document,l=p.userAgent,m="Not sending request ",f=!1,g=encodeURIComponent,h=decodeURIComponent,v=JSON.stringify,y=s.addEventListener,_="https://"+t,w=(o.documentElement,"language"),b=p.userAgentData,O="platform",S="platformVersion",k="https://docs.simpleanalytics.com",j=/(bot|spider|crawl)/i.test(l)&&!/(cubot)/i.test(l),E=o.currentScript||o.querySelector('script[src*="'+t+'"]');u=function(){var e=[].slice.call(arguments);return e.unshift("Simple Analytics:"),Function.prototype.apply.call(r.warn,r,e)};var x=function(e,t){return e&&e.getAttribute("data-"+t)},A=function(){for(var e,t,n,r={},a=arguments,o=0;o>e/4).toString(16)})}catch(r){return e.replace(n,function(e){var t=16*Math.random()|0;return(e<2?t:3&t|8).toString(16)})}},I="namespace",N=e[I]||x(E,I)||"sa",R=e.strictUtm||"true"==x(E,"strict-utm"),U=N+"_loaded";if(1==s[U])return u(m+"twice");s.sa_event_loaded=!0,s[U]=!0;var V,B=function(t,e,n){t=n?t:A(F,J,t),p.brave&&!n&&(t.brave=!0),p._duckduckgoloader_&&!n&&(t.duck=!0),(new Image).src=_+"/simple.gif?"+Object.keys(t).filter(function(e){return t[e]!=i}).map(function(e){return g(e)+"="+g(t[e])}).join("&")+"&time="+Date.now()},C=e.hostname||x(E,"hostname"),H=C||d,T={version:"custom_light_11",hostname:H};e.mode||x(E,"mode");try{V=Intl.DateTimeFormat().resolvedOptions().timeZone}catch(Q){u(Q)}j&&(T.bot=!0);var F=A(T,{ua:l,https:c.protocol==n,timezone:V,page_id:D(),session_id:D()});if(F.sri=!1,b&&(F.mobile=b.mobile,F.brands=v(b.brands)),H!==d&&(F.hostname_original=d),a in p&&"1"==p[a])return u("Not sending request when "+a+" is enabled. See "+k+"/dnt");-1!=d.indexOf(".")&&!/^[0-9.:]+$/.test(d)||C||u("Set hostname on "+d+". See "+k+"/overwrite-domain-name");var z,J={},L=(o.referrer||"").replace(d,H).replace(/^https?:\/\/((m|l|w{2,3}([0-9]+)?)\.)?([^?#]+)(.*)$/,"$4").replace(/^([^/]+)$/,"$1")||i,M=function(e,t){var n=A(T,{type:"append",original_id:t?e:F.page_id});t||!p.sendBeacon?B(n,0,!0):p.sendBeacon(_+"/append",v(n))};y("pagehide",M,!1);var P,Z,G=function(e){var t="";try{t=e||h(c.pathname)}catch(Q){u(Q)}return t},K=function(e,t,n,r){e&&M(""+F.page_id,!0),F.page_id=D();var a,o=H+G();B({id:F.page_id,type:"pageview",referrer:!t||n?L:null,query:(a=t,c.search.slice(1).split("&").filter(function(e){return!a&&new RegExp("^((utm_)"+(R?"":"?")+"(source|medium|content|term|campaign)"+(R?"":"|ref")+")=").test(e)}).join("&")||i)}),L=o,0};!function(e,t){var n=G(t);if(n&&z!=n){z=n,J.path=n,p[w]&&(J[w]=p[w]);var r,a=s.performance,o="navigation";try{r=a.getEntriesByType(o)[0].type}catch(Q){u(Q)}Z=r?-1<["reload","back_forward"].indexOf(r):a&&a[o]&&-1<[1,2].indexOf(a[o].type),P=!!L&&L.split("/")[0]==d;var i=function(){f=!0,K(e,e||Z||!1,P)};if(f)i();else try{b&&"function"==typeof b.getHighEntropyValues?b.getHighEntropyValues([O,S]).then(function(e){F.os_name=e[O],F.os_version=e[S],i()})["catch"](i):i()}catch(c){i()}}}()}catch(W){u(W)}}(window,{},""); //# sourceMappingURL=light.js.map \ No newline at end of file diff --git a/dist/latest/custom/light.js.map b/dist/latest/custom/light.js.map index a65fce3e..146d92d4 100644 --- a/dist/latest/custom/light.js.map +++ b/dist/latest/custom/light.js.map @@ -1 +1 @@ -{"version":3,"file":"light.source.js","sources":["light.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n\n var collectMetricByString = function (metricAbbreviation) {\n // eslint-disable-next-line no-unreachable\n return true;\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n if (ignore) return falseVar;\n // eslint-disable-next-line no-redeclare\n var regex =\n \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \")=\";\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n return q || undefinedVar;\n };\n\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n\n\n\n\n\n\n\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n // eslint-disable-next-line no-redeclare\n var bot = isBotAgent;\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n\n\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n sameSite = referrer\n ? referrer.split(slash)[0] == locationHostname\n : falseVar;\n\n\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n\n\n pageview();\n\n } catch (e) {\n warn(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_light_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","warn","undefinedVar","undefined","https","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","language","documentElement","uaData","userAgentData","platformText","platformVersionText","docsUrl","isBotAgent","test","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","isString","string","attr","attribute","getAttribute","assign","obj","prop","object","to","arg","index","length","nextSource","constructor","Object","nextKey","hasOwnProperty","settings","sa_settings","logSettings","keys","Date","now","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","replace","c","getRandomValues","Uint8Array","toString","error","r","Math","random","isFunction","func","namespaceText","namespace","strictUtm","loadedVariable","sa_event_loaded","timezone","sendData","data","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","Image","src","filter","key","map","join","overwrittenHostname","hostname","definedHostname","basePayload","version","mode","Intl","DateTimeFormat","resolvedOptions","timeZone","bot","ua","protocol","page_id","session_id","sri","mobile","brands","hostname_original","indexOf","lastSendPath","referrer","sendOnLeave","id","push","append","type","original_id","sendBeacon","bind","e","sameSite","userNavigated","getPath","overwrite","path","pathname","sendPageView","isPushState","deleteSourceInfo","search","metadata","ignoreSource","currentPage","query","split","keyValue","RegExp","pages","pathOverwrite","callbackRaw","querySearch","parts","shift","performaceEntryType","perf","performance","navigationText","getEntriesByType","triggerSendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","pageview"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"light.source.js","sources":["light.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n\n var collectMetricByString = function (metricAbbreviation) {\n return true;\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var getQueryParams = function (ignoreSource) {\n return (\n loc.search\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n if (ignore) return falseVar;\n var regex =\n \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \")=\";\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex).test(keyValue);\n })\n .join(\"&\") || undefinedVar\n );\n };\n\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n\n\n\n\n\n\n\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var bot = isBotAgent;\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n return (\n (doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n nav.sendBeacon(fullApiUrl + \"/append\", stringify(append));\n }\n };\n\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n\n\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n metadata\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n\n sendData({\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: getQueryParams(deleteSourceInfo),\n\n });\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (isPushState, pathOverwrite, metadata) {\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n sameSite = referrer\n ? referrer.split(slash)[0] == locationHostname\n : falseVar;\n\n\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n sendPageView(\n isPushState,\n isPushState || userNavigated || !collectMetricByString(\"r\"), // r = referrers\n sameSite,\n metadata\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n\n\n pageview();\n\n } catch (e) {\n warn(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_light_11\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","warn","undefinedVar","undefined","https","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","language","documentElement","uaData","userAgentData","platformText","platformVersionText","docsUrl","isBotAgent","test","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","attr","attribute","getAttribute","assign","obj","prop","object","to","arg","index","length","nextSource","constructor","Object","nextKey","hasOwnProperty","settings","sa_settings","logSettings","keys","Date","now","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","replace","c","getRandomValues","Uint8Array","toString","error","r","Math","random","namespaceText","namespace","strictUtm","loadedVariable","sa_event_loaded","timezone","sendData","data","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","Image","src","filter","key","map","join","overwrittenHostname","hostname","definedHostname","basePayload","version","mode","Intl","DateTimeFormat","resolvedOptions","timeZone","bot","ua","protocol","page_id","session_id","sri","mobile","brands","hostname_original","indexOf","lastSendPath","referrer","sendOnLeave","id","push","append","type","original_id","sendBeacon","sameSite","userNavigated","getPath","overwrite","path","pathname","sendPageView","isPushState","deleteSourceInfo","metadata","ignoreSource","currentPage","query","search","split","keyValue","RegExp","pages","pathOverwrite","performaceEntryType","perf","performance","navigationText","getEntriesByType","triggerSendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","e","pageview"],"mappings":"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"} \ No newline at end of file diff --git a/dist/latest/custom/proxy.js b/dist/latest/custom/proxy.js index 9666e407..67940588 100644 --- a/dist/latest/custom/proxy.js +++ b/dist/latest/custom/proxy.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-08-12; 899d; v12) */ +/* Simple Analytics - Privacy friendly analytics (docs.simpleanalytics.com/script; 2026-08-17; 9e79; v11) */ -!function(d,t,e,n,m){try{var v=undefined,g=!0,y=!1,r="true",a="https:",_="pageview",u="event",i="error",o=d.console,c="doNotTrack",w=d.navigator,s=d.location,b=s.host,l=d.document,p=w.userAgent,f="Not sending request ",h=f+"when ",x=y,O=encodeURIComponent,E=decodeURIComponent,S=JSON.stringify,M=d.addEventListener,k="https://"+e,A=l.documentElement||{},q="language",$="Height",j="scroll",D=w.userAgentData,C=j+$,H="offset"+$,P="client"+$,R="pagehide",T="platform",U="platformVersion",I="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),N=d.screen,z=l.currentScript||l.querySelector('script[src*="'+e+'"]');m=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){m("Error in your "+t+" function:",e)},W=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},G=function(t){return"string"==typeof t},J=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},L=function(t,e){return t&&t.getAttribute("data-"+e)},Y=function(t){return Array.isArray(t)?t:G(t)&&t.length?t.split(/, ?/):[]},Z=function(t){return t&&t.constructor===Object},K=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},it=function(t){return"function"==typeof t},ot="namespace",ct=t[ot]||L(z,ot)||"sa",st=function(t,e){var n=d[ct+"_metadata"];Z(n)&&(t=K(t,n));var r=d[kt];if(!it(r))return kt&&m(kt+" not found, set window."+kt),t;try{return K(t,r.call(d,K(t,e)))}catch(a){F("metadata",a)}},ut=t.strictUtm||L(z,"strict-utm")==r,lt=function(i,t){tt=!i&&nt("p")?"":y;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");tt!==y&&0"); +!function(l,t,e,n,p){try{var h=undefined,f=!0,d=!1,r="true",a="https:",m="pageview",u="event",i="error",o=l.console,c="doNotTrack",g=l.navigator,s=l.location,v=s.host,y=l.document,_=g.userAgent,w="Not sending request ",b=w+"when ",x=d,E=encodeURIComponent,O=decodeURIComponent,S=JSON.stringify,M=l.addEventListener,k="https://"+e,A=y.documentElement||{},q="language",$="Height",j="scroll",D=g.userAgentData,C=j+$,H="offset"+$,P="client"+$,R="pagehide",T="platform",U="platformVersion",I="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(_)&&!/(cubot)/i.test(_),N=l.screen,z=y.currentScript||y.querySelector('script[src*="'+e+'"]');p=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){p("Error in your "+t+" function:",e)},W=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},G=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},J=function(t,e){return t&&t.getAttribute("data-"+e)},L=function(t){return Array.isArray(t)?t:"string"==typeof t&&t.length?t.split(/, ?/):[]},Y=function(t){return t&&t.constructor===Object},Z=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},rt=function(t){return"function"==typeof t},at="namespace",it=t[at]||J(z,at)||"sa",ot=l[it+"_metadata"],ct=function(t,e){Y(ot)&&(t=Z(t,ot));var n=l[Mt];if(!rt(n))return t;try{return Z(t,n.call(l,Z(t,e)))}catch(r){F("metadata",r)}},st=t.strictUtm||J(z,"strict-utm")==r,ut=function(a){return s.search.slice(1).split("&").filter(function(t){var e=a||!tt("ut"),n=Et.map(G).join("|"),r=e?"^("+n+")=":"^((utm_)"+(st?"":"?")+"(source|medium|content|term|campaign)"+(st?"":"|ref")+"|"+n+")=";return e&&!Et.length?d:new RegExp(r).test(t)}).join("&")||h},lt=it+"_loaded";if(l[lt]==f)return p(w+"twice");l.sa_event_loaded=f,l[lt]=f;var pt=function(e,t,n){e=n?e:Z(qt,Dt,e),g.brave&&!n&&(e.brave=f),g._duckduckgoloader_&&!n&&(e.duck=f);var r=new Image;t&&(r.onerror=t,r.onload=t),r.src=k+"/simple.gif?"+Object.keys(e).filter(function(t){return e[t]!=h}).map(function(t){return E(t)+"="+E(e[t])}).join("&")+"&time="+Date.now()},ht=t.hostname||J(z,"hostname"),ft=ht||v,dt={version:"custom_proxy_11",hostname:ft};n=function(t){t=t.stack?t+" "+t.stack:t,p(t),pt(Z(dt,{type:i,error:t,path:s.pathname}),h,f)},M(i,function(t){t.filename&&-1"); //# sourceMappingURL=proxy.js.map \ No newline at end of file diff --git a/dist/latest/custom/proxy.js.map b/dist/latest/custom/proxy.js.map index a6e8ec6a..0f4461e7 100644 --- a/dist/latest/custom/proxy.js.map +++ b/dist/latest/custom/proxy.js.map @@ -1 +1 @@ -{"version":3,"file":"proxy.source.js","sources":["proxy.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var p;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n p = !ignoreSource && collectMetricByString(\"p\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (p !== falseVar && i > 0 && keyValue.slice(i + 1))\n p += (p ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n p = p || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n p: p,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_proxy_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","p","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","protocol","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"proxy.source.js","sources":["proxy.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var metadataObject = window[namespace + \"_metadata\"];\n var appendMetadata = function (metadata, data) {\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) return metadata;\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var getQueryParams = function (ignoreSource) {\n return (\n loc.search\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex).test(keyValue);\n })\n .join(\"&\") || undefinedVar\n );\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n window.phantom ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n return (\n (doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n nav.sendBeacon(fullApiUrl + \"/append\", stringify(append));\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n metadata\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n\n sendData({\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: getQueryParams(deleteSourceInfo),\n\n metadata: stringify(metadata),\n });\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (isPushState, pathOverwrite, metadata) {\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique = isPushState || userNavigated ? falseVar : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n sendPageView(\n isPushState,\n isPushState || userNavigated || !collectMetricByString(\"r\"), // r = referrers\n sameSite,\n metadata\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n else {\n window.sa_pageview = function (path, metadata) {\n pageview(0, path, metadata);\n };\n }\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_proxy_11\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","metadataObject","appendMetadata","metadata","data","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","search","keyValue","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","indexOf","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","bot","webdriver","__nightmare","callPhantom","_phantom","phantom","__polypane","_bot","collectDataOnLeave","ua","protocol","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","i","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","e","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","callbackRaw","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue","q"],"mappings":"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"} \ No newline at end of file diff --git a/dist/latest/hello.js b/dist/latest/hello.js index 3eca7358..ba75a8d3 100644 --- a/dist/latest/hello.js +++ b/dist/latest/hello.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-08-12; 986f) */ +/* Simple Analytics - Privacy friendly analytics (docs.simpleanalytics.com/script; 2026-08-17; 016a) */ -!function(d,t,e,n,m){try{var v=undefined,g=!0,y=!1,r="true",a="https:",_="pageview",u="event",i="error",o=d.console,c="doNotTrack",w=d.navigator,s=d.location,b=s.host,l=d.document,p=w.userAgent,f="Not sending request ",h=f+"when ",O=y,E=encodeURIComponent,x=decodeURIComponent,S=JSON.stringify,M=d.addEventListener,k="https://queue."+e,q=l.documentElement||{},A="language",$="Height",j="scroll",D=w.userAgentData,C=j+$,R="offset"+$,H="client"+$,P="pagehide",T="platform",U="platformVersion",I="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),N=d.screen,z=l.currentScript||l.querySelector('script[src*="'+e+'"]');m=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){m("Error in your "+t+" function:",e)},W=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},G=function(t){return"string"==typeof t},J=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},L=function(t,e){return t&&t.getAttribute("data-"+e)},Y=function(t){return Array.isArray(t)?t:G(t)&&t.length?t.split(/, ?/):[]},Z=function(t){return t&&t.constructor===Object},K=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},it=function(t){return"function"==typeof t},ot="namespace",ct=t[ot]||L(z,ot)||"sa",st=function(t,e){var n=d[ct+"_metadata"];Z(n)&&(t=K(t,n));var r=d[kt];if(!it(r))return kt&&m(kt+" not found, set window."+kt),t;try{return K(t,r.call(d,K(t,e)))}catch(a){F("metadata",a)}},ut=t.strictUtm||L(z,"strict-utm")==r,lt=function(i,t){tt=!i&&nt("p")?"":y;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");tt!==y&&0>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},rt=function(t){return"function"==typeof t},at="namespace",it=t[at]||J(z,at)||"sa",ot=l[it+"_metadata"],ct=function(t,e){Y(ot)&&(t=Z(t,ot));var n=l[Mt];if(!rt(n))return t;try{return Z(t,n.call(l,Z(t,e)))}catch(r){F("metadata",r)}},st=t.strictUtm||J(z,"strict-utm")==r,ut=function(a){return s.search.slice(1).split("&").filter(function(t){var e=a||!tt("ut"),n=Ot.map(G).join("|"),r=e?"^("+n+")=":"^((utm_)"+(st?"":"?")+"(source|medium|content|term|campaign)"+(st?"":"|ref")+"|"+n+")=";return e&&!Ot.length?d:new RegExp(r).test(t)}).join("&")||h},lt=it+"_loaded";if(l[lt]==f)return p(w+"twice");l.sa_event_loaded=f,l[lt]=f;var pt=function(e,t,n){e=n?e:Z(At,Dt,e),g.brave&&!n&&(e.brave=f),g._duckduckgoloader_&&!n&&(e.duck=f);var r=new Image;t&&(r.onerror=t,r.onload=t),r.src=k+"/simple.gif?"+Object.keys(e).filter(function(t){return e[t]!=h}).map(function(t){return O(t)+"="+O(e[t])}).join("&")+"&time="+Date.now()},ht=t.hostname||J(z,"hostname"),ft=ht||v,dt={version:"cdn_hello_11",hostname:ft};n=function(t){t=t.stack?t+" "+t.stack:t,p(t),pt(Z(dt,{type:i,error:t,path:s.pathname}),h,f)},M(i,function(t){t.filename&&-1> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var p;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n p = !ignoreSource && collectMetricByString(\"p\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (p !== falseVar && i > 0 && keyValue.slice(i + 1))\n p += (p ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n p = p || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n p: p,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"simpleanalyticscdn.com\",\n \"queue.\",\n \"cdn_hello_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","protocol","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","p","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"hello.source.js","sources":["hello.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var metadataObject = window[namespace + \"_metadata\"];\n var appendMetadata = function (metadata, data) {\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) return metadata;\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var getQueryParams = function (ignoreSource) {\n return (\n loc.search\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex).test(keyValue);\n })\n .join(\"&\") || undefinedVar\n );\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n window.phantom ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n return (\n (doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n nav.sendBeacon(fullApiUrl + \"/append\", stringify(append));\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n metadata\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n\n sendData({\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: getQueryParams(deleteSourceInfo),\n\n metadata: stringify(metadata),\n });\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (isPushState, pathOverwrite, metadata) {\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique = isPushState || userNavigated ? falseVar : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n sendPageView(\n isPushState,\n isPushState || userNavigated || !collectMetricByString(\"r\"), // r = referrers\n sameSite,\n metadata\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n else {\n window.sa_pageview = function (path, metadata) {\n pageview(0, path, metadata);\n };\n }\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"simpleanalyticscdn.com\",\n \"queue.\",\n \"cdn_hello_11\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","protocol","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","metadataObject","appendMetadata","metadata","data","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","search","keyValue","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","indexOf","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","bot","webdriver","__nightmare","callPhantom","_phantom","phantom","__polypane","_bot","collectDataOnLeave","ua","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","i","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","e","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","callbackRaw","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue","q"],"mappings":";;CAEA,SACEA,EACAC,EACAC,EAIAC,EACAC,GAEA,IAQE,IAAIC,EAAeC,UACfC,GAAU,EACVC,GAAW,EACXC,EAAW,OACXC,EAAQ,SACRC,EAAe,WACfC,EAAY,QACZC,EAAY,QAGZC,EAAMd,EAAOe,QACbC,EAAa,aACbC,EAAMjB,EAAOkB,UACbC,EAAMnB,EAAOoB,SACbC,EAAmBF,EAAIG,KACvBC,EAAMvB,EAAOwB,SACbC,EAAYR,EAAIQ,UAChBC,EAAa,uBACbC,EAAiBD,EAAa,QAC9BE,EAA2BpB,EAC3BqB,EAAyBC,mBACzBC,EAAyBC,mBACzBC,EAAYC,KAAKD,UAEjBE,EAAuBnC,EAAOoC,iBAC9BC,EAAaC,iBAA0BpC,EACvCqC,EAAkBhB,EAAIgB,iBAAmB,GACzCC,EAAW,WACXC,EAAS,SAETC,EAAS,SACTC,EAAS1B,EAAI2B,cACbC,EAAeH,EAASD,EACxBK,EAAe,SAAWL,EAC1BM,EAAe,SAAWN,EAE1BO,EAAW,WACXC,EAAe,WACfC,EAAsB,kBACtBC,EAAU,mCACVC,EAAQ,EACRC,EACF,sBAAsBC,KAAK7B,KAAe,WAAW6B,KAAK7B,GACxD8B,EAASvD,EAAOuD,OAIhBC,EACFjC,EAAIkC,eAAiBlC,EAAImC,cAAc,gBAAkBxD,EAAU,MAOrEE,EAAO,WAEL,IAAIuD,EAAO,GAAGC,MAAMC,KAAKC,WAOzB,OAJAH,EAAKI,QAAQ,qBAINC,SAASC,UAAUC,MAAML,KAAK/C,EAAIV,KAAMU,EAAK6C,IAGtD,IAAIQ,EAAiB,SAAUC,EAAMC,GACnCjE,EAAK,iBAAmBgE,EAAO,aAAcC,IAG3CC,EAAU,SAAUC,EAAKC,GAC3B,OAAOC,OAAOR,UAAUS,eAAeb,KAAKU,EAAKC,IAO/CG,EAAc,SAAUC,GAC1B,OAAOA,EAAKC,QAAQ,sBAAuB,SAGzCC,EAAO,SAAUtB,EAAeuB,GAClC,OAAOvB,GAAiBA,EAAcwB,aAAa,QAAUD,IAG3DE,EAA+B,SAAUC,GAC3C,OAAOC,MAAMC,QAAQF,GACjBA,EAboB,iBAcXA,GAAQA,EAAIG,OACnBH,EAAII,MAAM,OACV,IAGJC,EAAW,SAAUC,GACvB,OAAOA,GAAUA,EAAOC,cAAgBhB,QAGtCiB,EAAS,WAGX,IAFA,IAAIC,EAAK,GACLC,EAAM9B,UACD+B,EAAQ,EAAGA,EAAQD,EAAIP,OAAQQ,IAAS,CAC/C,IAAIC,EAAaF,EAAIC,GACrB,GAAIN,EAASO,GACX,IAAK,IAAIC,KAAWD,EACdxB,EAAQwB,EAAYC,KACtBJ,EAAGI,GAAWD,EAAWC,IAKjC,OAAOJ,GAGLK,EAAWhG,EAAOiG,YAClBC,EAAcF,GAAYvB,OAAO0B,KAAKlG,GAAkBoF,OAG5DpF,EAAmByF,EAAOzF,EAAkB+F,GAExCE,GAAa9F,EAAK,WAAYH,GAGlC,IAAImG,EAAgBnB,EAClBhF,EAAiBmG,eAAiBtB,EAAKtB,EAAe,mBAGpD6C,GAAwB,SAAUC,GAEpC,OAGgB,IAFdF,EAAcG,OAAO,SAAU3B,GAC7B,OAAO,IAAI4B,OAAO,IAAMF,GAAoBhD,KAAKsB,KAChDS,QAIHoB,GAAMC,KAAKD,IAEXE,GAAO,WACT,IAAIC,EAAe5G,EAAO6G,QAAU7G,EAAO8G,SACvCC,EAAY,CAAC,MAAQ,KAAO,KAAO,KAAO,KAC1CC,EAAY,SAEhB,IACE,OAAOD,EAAUlC,QAAQmC,EAAW,SAAUC,GAC5C,OACEA,EACCL,EAAaM,gBAAgB,IAAIC,WAAW,IAAI,GAC9C,IAAOF,EAAI,GACdG,SAAS,MAEb,MAAO/C,GACP,OAAO0C,EAAUlC,QAAQmC,EAAW,SAAUC,GAC5C,IAAII,EAAqB,GAAhBC,KAAKC,SAAiB,EAE/B,OADMN,EAAI,EAAII,EAAS,EAAJA,EAAW,GACrBD,SAAS,QAKpBI,GAAa,SAAUC,GACzB,MAAsB,mBAARA,GAIZC,GAAgB,YAChBC,GACF1H,EAAiByH,KACjB5C,EAAKtB,EAAekE,KA6uBxB,KA1uBME,GAAiB5H,EAAO2H,GAAY,aACpCE,GAAiB,SAAUC,EAAUC,GACnCxC,EAASqC,MAAiBE,EAAWpC,EAAOoC,EAAUF,KAC1D,IAAII,EAA4BhI,EAAOiI,IACvC,IAAKT,GAAWQ,GAA4B,OAAOF,EACnD,IACE,OAAOpC,EACLoC,EACAE,EAA0BnE,KAAK7D,EAAQ0F,EAAOoC,EAAUC,KAE1D,MAAO1D,GACPF,EAAe,WAAYE,KAU3B6D,GACFjI,EAAiBiI,WACjBpD,EAAKtB,EAAe,eAAiB/C,EAEnC0H,GAAiB,SAAUC,GAC7B,OACEjH,EAAIkH,OACDzE,MAAM,GACN0B,MAAM,KACNiB,OAAO,SAAU+B,GAChB,IAAIC,EAASH,IAAiB/B,GAAsB,MAEhDmC,EAAkBC,GAAYC,IAAI/D,GAAagE,KAAK,KACpDC,EAAQL,EACR,KAAOC,EAAkB,KACzB,YACCN,GAAY,GAAK,KAClB,yCACCA,GAAY,GAAK,QAClB,IACAM,EACA,KACJ,OAAID,IAAWE,GAAYpD,OAAe7E,EAInC,IAAIgG,OAAOoC,GAAOtF,KAAKgF,KAE/BK,KAAK,MAAQtI,GAgChBwI,GAAiBlB,GAAY,UACjC,GAAI3H,EAAO6I,KAAmBtI,EAAS,OAAOH,EAAKsB,EAAa,SAChE1B,EAAO8I,gBAAkBvI,EACzBP,EAAO6I,IAAkBtI,EAOzB,IAAIwI,GAAW,SAAUhB,EAAMiB,EAAUC,GACvClB,EAAOkB,EAAelB,EAAOrC,EAAOwD,GAASC,GAAMpB,GAE/C9G,EAAImI,QAAUH,IAAclB,EAAKqB,MAAQ7I,GACzCU,EAAIoI,qBAAuBJ,IAAclB,EAAKuB,KAAO/I,GAGzD,IAAIgJ,EAAQ,IAAIC,MACZR,IACFO,EAAME,QAAUT,EAChBO,EAAMG,OAASV,GAEjBO,EAAMI,IACJtH,EACA,eACAoC,OAAO0B,KAAK4B,GACTxB,OAAO,SAAUqD,GAChB,OAAO7B,EAAK6B,IAAQvJ,IAErBqI,IAAI,SAAUkB,GACb,OACE/H,EAAuB+H,GACvB,IACA/H,EAAuBkG,EAAK6B,MAG/BjB,KAAK,KACR,SACAjC,KAAKD,OAILoD,GACF5J,EAAiB6J,UAAYhF,EAAKtB,EAAe,YAC/CuG,GAAkBF,IAAuBxI,EAEzC2I,GAAc,CAChBC,QAymBJ,eAxmBIH,SAAUC,IASZ5J,EAAY,SAAU+J,GACpBA,EAAiBA,EAAeC,MAC5BD,EAAiB,IAAMA,EAAeC,MACtCD,EACJ9J,EAAK8J,GACLnB,GACErD,EAAOsE,GAAa,CAClBI,KAAMvJ,EACNwD,MAAO6F,EACPG,KAAMlJ,EAAImJ,WAEZjK,EACAE,IAMJ4B,EACEtB,EACA,SAAU0J,GACJA,EAAMC,WAA+C,EAAnCD,EAAMC,SAASC,QAAQvK,IAC3CC,EAAUoK,EAAMG,UAGpBlK,GAOF,IAwDImK,GAxDAC,GAAQnE,KAERoE,GAAW,EAOXC,GAAO7K,EAAiB6K,MAAQhG,EAAKtB,EAAe,QAGpDuH,MAvKsBC,GAuKC/K,EAAiB8K,cAtKvBC,GAuKjB/K,EAAiB8K,WACjBjG,EAAKtB,EAAe,eAAiB/C,GACrCqE,EAAKtB,EAAe,aAAe/C,GACnCqE,EAAKtB,EAAe,gBAAkB/C,EAGtCwK,KACqC,SAAvCnG,EAAKtB,EAAe,iBACpBvD,EAAiBgL,cAAgBzK,GAI/B0K,GACFjL,EAAiBkL,UACjBrG,EAAKtB,EAAe,cACpBmE,GAAY,IAAM/G,EAGhBwK,GAAcnG,EAChBhF,EAAiBmL,aAAetG,EAAKtB,EAAe,iBAIlDiF,GAAcxD,EAChBhF,EAAiBwI,aAAe3D,EAAKtB,EAAe,iBAIlD6H,GAAqBpG,EACvBhF,EAAiBoL,oBACfvG,EAAKtB,EAAe,yBAIpB8H,GACFrL,EAAiBqL,gBAAkBxG,EAAKtB,EAAe,mBAGrDyE,GACFhI,EAAiBgI,mBACjBnD,EAAKtB,EAAe,sBAItB,IAEEmH,GAAWtE,GAAsB,KAC7BkF,KAAKC,iBAAiBC,kBAAkBC,SACxCrL,EACJ,MAAOgE,IACPjE,EAAKiE,IAOP,IAAIsH,GACF1K,EAAI2K,WACJ5L,EAAO6L,aACP7L,EAAO8L,aACP9L,EAAO+L,UACP/L,EAAOgM,SACPhM,EAAOiM,YACPjM,EAAOkM,MACP7I,GACAiE,KAAKC,UAAYD,KAAKC,SAGpB4E,GACF9F,GAAsB,MAAQA,GAAsB,QAElDsF,KAAK3B,GAAY2B,IAAMpL,GAE3B,IAAI2I,GAAUxD,EAAOsE,GAAa,CAEhCoC,GAAI/F,GAAsB,MAAQ5E,EAAYpB,EAE9CK,MAAOS,EAAImB,UAAY5B,EACvBiK,SAAUA,GACV0B,QAASF,GAAqBxF,KAAStG,EAGvCiM,WAAYjG,GAAsB,MAAQM,KAAStG,IA0BrD,GAvBA6I,GAAQqD,IAAM/L,EAIVmC,IACFuG,GAAQsD,OAAS7J,EAAO6J,OACxBtD,GAAQuD,OAASxK,EAAUU,EAAO8J,SAS/BlL,EAAImL,SAAStM,EAAK,4CAInB2J,KAAoB1I,IACtB6H,GAAQyD,kBAAoBtL,IAGzB0J,IAAc/J,KAAcC,GAA0B,KAAnBA,EAAID,GAC1C,OAAOZ,EACLuB,EAAiBX,EAAa,oBAAsBmC,EAAU,SAK7B,GAAlC9B,EAAiBoJ,QAAQ,OACxB,aAAanH,KAAKjC,IACnBwI,IAEDzJ,EACE,mBACEiB,EACA,SACA8B,EACA,0BAON,IACIyJ,GAiDAC,GAlDA1D,GAAO,GAaP2D,IARCvL,EAAIuL,UAAY,IACdjI,QAAQxD,EAAkB0I,IAC1BlF,QAAQ,sDAAuD,MAC/DA,QAAQ,YAAa,OAASxE,EAYjC0M,GAAW,EAEXC,GAAc,SAAUC,EAAIC,GAC9B,IAEIC,EAFChB,KAEDgB,EAASzH,EAAOsE,GAAa,CAC/BI,KAAM,SACNgD,YAAaF,EAAOD,EAAK/D,GAAQmD,UAI/BhG,GAAsB,OACxB8G,EAAOE,SAAW/F,KAAKgG,OAAO7G,KAAQmE,GAAQmC,IAhfnC,MAkfbA,GAAW,EACXnC,GAAQnE,KAGJJ,GAAsB,UACxB8G,EAAOtC,SAAWvD,KAAKiG,IAAI,EAAG1C,GAAU2C,OAGtCN,IAASjM,EAAIwM,WAEf1E,GAASoE,EAAQ9M,EAAcE,GAE/BU,EAAIwM,WAAWpL,EAAa,UAAWJ,EAAUkL,MAKrDhL,EACE,mBACA,WACMZ,EAAImM,QACA,KAAO1K,KAAYhD,GAASgN,KAClCH,GAAcpG,MACTsG,IAAYtG,KAAQoG,IAE7BrM,GAGF2B,EAAqBa,EAAUgK,GAAaxM,GAE5C,IAAImN,GAAOpM,EAAIoM,MAAQ,GACnBH,GAAW,WACb,IACE,IAAII,EAAuBrL,EAAgBQ,IAAiB,EACxD8K,EAASvG,KAAKiG,IAChBI,GAAK9K,IAAiB,EACtB8K,GAAK7K,IAAiB,EACtBP,EAAgBQ,IAAiB,EACjCR,EAAgBM,IAAiB,EACjCN,EAAgBO,IAAiB,GAEnC,OAAOwE,KAAKwG,IACV,IAKI,EAJJxG,KAAKgG,MACF,MAAQ/K,EAAgBwL,WAAa,GAAKH,GACzCC,EACA,IAGN,MAAOxJ,IAEP,OADAjE,EAAKiE,IACE,IAIXlC,EAAqB,OAAQ,WAC3B0I,GAAW2C,KACXrL,EACEO,EACA,WACMmI,GAAW2C,OAAY3C,GAAW2C,OAExChN,KAQJ,IAgCIwN,GA6BAC,GAAUC,GA7DVC,GAAU,SAAUC,GACtB,IAAI/D,EAAO,GAIX,IACEA,EAAO+D,GAAarM,EAAuBZ,EAAImJ,UAC/C,MAAOjG,IACPjE,EAAKiE,IAGP,IAAIgK,EAAyBrO,EAAOsL,IACpC,GAAI9D,GAAW6G,GACb,IACEhE,EAAOgE,EAAuBxK,KAAK7D,EAAQ,CAAEqK,KAAMA,KAAWA,EAC9D,MAAOhG,IACPF,EAAe,OAAQE,IAK3B,IAlYiB,SAAUgG,GAC3B,IAAK,IAAIiE,KAAKlD,GAAa,CACzB,IAAImD,EAAgBnD,GAAYkD,GAChC,GAAKC,EAAL,CAGA,IAAIC,EAhOI,KAiOND,EAAc,GAAcA,EAjOtB,IAiO8CA,EAEtD,GACEC,IAAenE,GACf,IAAI7D,OACF,IAAM7B,EAAY6J,GAAY3J,QAAQ,SAAU,QAAU,IAC1D,KACAvB,KAAK+G,GAEP,OAAO9J,GAEX,OAAOC,EAgXHiO,CAAapE,GAQjB,MAFY,QAARS,IAAkB3J,EAAIuN,OAAMrE,GAAQlJ,EAAIuN,KAAKpJ,MAAM,KAAK,IAErD+E,EAPLjK,EAAKuB,EAAiB,YAAc0I,IAyCpCsE,GAAW,SAAUC,EAAaC,EAAe/G,GAEnD,IAAIuC,EAAO8D,GAAQU,GAGnB,GAAKxE,GAAQuC,IAAgBvC,EAA7B,CAEAuC,GAAevC,EACflB,GAAKkB,KAAOA,EAGRhE,GAAsB,OACxB8C,GAAK2F,eACHxH,KAAKiG,IAAIhL,EAA2B,aAAK,EAAGvC,EAAO+O,YAAc,IACjE,KACF5F,GAAK6F,gBACH1H,KAAKiG,IACHhL,EAAgBQ,IAAiB,EACjC/C,EAAOiP,aAAe,IACnB,MAIL5I,GAAsB,MACpBpF,EAAIuB,KAAW2G,GAAK3G,GAAYvB,EAAIuB,IAItCe,GAAU8C,GAAsB,QAClC8C,GAAK+F,aAAe3L,EAAO4L,MAC3BhG,GAAKiG,cAAgB7L,EAAOsK,QAI9B,IAIIwB,EAJAC,EAAOtP,EAAOuP,YACdC,EAAiB,aAIrB,IACEH,EAAsBC,EAAKG,iBAAiBD,GAAgB,GAAGpF,KAC/D,MAAO/F,IACPjE,EAAKiE,IAGP6J,GAAgBmB,GAC+C,EAA3D,CAAC,SAAU,gBAAgB5E,QAAQ4E,GAGnCC,GACAA,EAAKE,KACwC,EAA7C,CAAC,EAAG,GAAG/E,QAAQ6E,EAAKE,GAAgBpF,MAGxC,IAAIsF,EAA0B5C,GAC1BA,GAASxH,MA7rBH,KA6rBgB,GACtBjF,EACJ4N,GAAWnB,IACgD,EAAvDzB,GAAmBZ,QAAQiF,IAC3BA,GAA2BrO,EAC3Bb,EAGJ2I,GAAKwG,OAASf,GAAeV,GAAgB1N,GAAYyN,GAEzDnG,EAAWD,GAAeC,EAAU,CAClCsC,KAAMzJ,EACN0J,KAAMlB,GAAKkB,OAGb,IAAIuF,EAAsB,WACxBhO,EAA2BrB,EAnGZ,SACjBqO,EACAiB,EACA5B,EACAnG,GAEI8G,GAAa5B,GAAY,GAAK9D,GAAQmD,QAAS9L,GAC/C4L,KAAoBjD,GAAQmD,QAAU1F,MAE1C,IAAImJ,EAAc/F,GAAkBoE,KAEpCpF,GAAS,CACPkE,GAAI/D,GAAQmD,QACZjC,KAAMzJ,EACNmM,UAAW+C,GAAoB5B,EAAWnB,GAAW,KACrDiD,MAAO5H,GAAe0H,GAEtB/H,SAAU7F,EAAU6F,KAGtBkG,GAAmBlB,GACnBA,GAAWgD,EAEX1M,IA6EE4M,CACEpB,EACAA,GAAeV,KAAkB7H,GAAsB,KACvD4H,GACAnG,IAIJ,GAAKlG,EAmBHgO,SAjBA,IACMjN,GAAU6E,GAAW7E,EAAOsN,sBAC9BtN,EACGsN,qBAAqB,CAAChN,EAAcC,IACpCgN,KAAK,SAAUC,GACdjH,GAAQkH,QAAUD,EAAkBlN,GACpCiG,GAAQmH,WAAaF,EAAkBjN,GACvC0M,MAEDU,SAAMV,GAETA,IAEF,MAAOW,GACPX,OAWFY,GAAMxQ,EAAOyQ,QACbC,GAAeF,GAAMA,GAAIG,UAAYtQ,EACrCuQ,GAAM5Q,EAAO6Q,cACbC,GAAgB,YAIhB7F,IAAeyF,IAAgBK,OAASH,KAqB1CJ,GAAIG,WAnBEK,GAAOR,GADiBpG,GAoBA0G,IAlBrB,WACL,IAEIvG,EAFA3E,EAAM9B,UACNmN,EAAKD,GAAK9M,MAAMgN,KAAMtL,GAY1B,OAVI4B,GAAWuJ,OACbxG,EAAQ,IAAIwG,MAAM3G,KAIlBG,EAAQhJ,EAAI4P,YAAY,UAClBC,UAAUhH,GAAM7J,EAASA,GAEjCgK,EAAMzG,UAAY8B,EAClBgL,GAAIrG,GACG0G,IAMX9O,EACE2O,GACA,WACEnC,GAAS,IAEXnO,GAGF2B,EACE,WACA,WACEwM,GAAS,IAEXnO,IAKAyK,IAAuB,QAARH,IAAkB,iBAAkB9K,GACrDmC,EACE,aACA,WACEwM,GAAS,IAEXnO,GAIAyK,GAAa0D,KAEf3O,EAAOqR,YAAc,SAAUhH,EAAMvC,GACnC6G,GAAS,EAAGtE,EAAMvC,IAQtB,IAAIwJ,GAAa,CAAC,SAAU,UAExBC,GAAY,SAAUhH,EAAOzC,EAAU0J,IACpCA,GAAehK,GAAWM,KAAW0J,EAAc1J,GAExD,IAAI2J,EAAkBjK,GAAW+C,GAC7BvB,EAAWxB,GAAWgK,GAAeA,EAAc,aACnDE,SAAmBnH,EAEvB,GAAI+G,GAAW7G,QAAQiH,GAAa,IAAMD,EAExC,OADAtN,EAAe+G,GAAmBtK,EAAY,aAAe8Q,GACtD1I,IAGT,IACE,GAAIyI,EAAiB,CACnB,IAAIE,EAAcpH,IAClB,GAAI+G,GAAW7G,eAAekH,GAAe,EAK3C,OAJAxN,EACE+G,GACAX,EAAQ,uBAAyBoH,GAE5B3I,IAETuB,EAAQoH,GAEV,MAAOtN,IAEP,OADAF,EAAe+G,GAAmB7G,IAC3B2E,IAGTuB,GAAS,GAAKA,GAAO1F,QAAQ,eAAgB,KAAKA,QAAQ,WAAY,IAEtE,IAAI+M,EAAc,CAAExH,KAAMxJ,EAAW2J,MAAOA,GACxCsH,GAAa3D,IAAiB9K,EAAQ,EAE1C0E,EAAWD,GAAeC,EAAU8J,GAEhCrH,GACFxB,GACErD,EAAOkM,EAAa,CAClB3E,GAAItG,KACJoJ,MAAO5H,IAAgB0J,GACvB/E,UACG+E,GAAa5D,KAAa5H,GAAsB,KAC7C2H,GACA,KAENlG,SAAU7F,EAAU6F,KAEtBkB,IAKF8I,GAAmB,SAAUvH,EAAOzC,EAAUkB,GAChDuI,GAAUhH,EAAOzC,EAAUkB,IAIxBhJ,EAAOkL,MACVlL,EAAOkL,IAAqB4G,IAE9B,IAAIC,GAAY/R,EAAOkL,IAGnB8G,GAAQD,IAAaA,GAAUE,EAAIF,GAAUE,EAAI,GAMrD,IAAK,IAAI1H,MAHTvK,EAAOkL,IAAqB4G,GAGVE,GACZ1N,EAAQ0N,GAAOzH,MACjBpF,MAAMC,QAAQ4M,GAAMzH,KAChBgH,GAAUrN,MAAM,KAAM8N,GAAMzH,KAC5BgH,GAAUS,GAAMzH,MAGxB,MAAOgG,IACPpQ,EAAUoQ,IA7IY,IAAUnG,GACxB4G,GAvkBkBhG,GA7M9B,CAm6BEhL,OACA,uBACA"} \ No newline at end of file diff --git a/dist/latest/latest.dev.js b/dist/latest/latest.dev.js index 06212579..93496d68 100644 --- a/dist/latest/latest.dev.js +++ b/dist/latest/latest.dev.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-08-12; eeb3; v12) */ +/* Simple Analytics - Privacy friendly analytics (docs.simpleanalytics.com/script; 2026-08-17; 2483; v11) */ /* eslint-env browser */ (function ( @@ -191,17 +191,11 @@ attr(scriptElement, namespaceText) || defaultNamespace; + var metadataObject = window[namespace + "_metadata"]; var appendMetadata = function (metadata, data) { - var metadataObject = window[namespace + "_metadata"]; if (isObject(metadataObject)) metadata = assign(metadata, metadataObject); var metadataCollectorFunction = window[metadataCollector]; - if (!isFunction(metadataCollectorFunction)) { - if (metadataCollector) - warn( - metadataCollector + " not found, set window." + metadataCollector - ); - return metadata; - } + if (!isFunction(metadataCollectorFunction)) return metadata; try { return assign( metadata, @@ -222,40 +216,32 @@ overwriteOptions.strictUtm || attr(scriptElement, "strict-utm") == trueText; - var p; - - var getQueryParams = function (ignoreSource, overwriteSearch) { - p = !ignoreSource && collectMetricByString("p") ? "" : falseVar; - var q = (overwriteSearch || loc.search) - .slice(1) - .split("&") - .filter(function (keyValue) { - var i = keyValue.indexOf("="); - if (p !== falseVar && i > 0 && keyValue.slice(i + 1)) - p += (p ? "," : "") + keyValue.slice(0, i); - - var ignore = ignoreSource || !collectMetricByString("ut"); - - var paramsRegexList = allowParams.map(filterRegex).join("|"); - var regex = ignore - ? "^(" + paramsRegexList + ")=" - : "^((utm_)" + - (strictUtm ? "" : "?") + - "(source|medium|content|term|campaign)" + - (strictUtm ? "" : "|ref") + - "|" + - paramsRegexList + - ")="; - if (ignore && !allowParams.length) return falseVar; - - // The prefix "utm_" is optional with "strictUtm" disabled - // "ref" is only collected when "strictUtm" is disabled - return new RegExp(regex, "i").test(keyValue); - }) - .join("&"); - - p = p || undefinedVar; - return q || undefinedVar; + var getQueryParams = function (ignoreSource) { + return ( + loc.search + .slice(1) + .split("&") + .filter(function (keyValue) { + var ignore = ignoreSource || !collectMetricByString("ut"); + + var paramsRegexList = allowParams.map(filterRegex).join("|"); + var regex = ignore + ? "^(" + paramsRegexList + ")=" + : "^((utm_)" + + (strictUtm ? "" : "?") + + "(source|medium|content|term|campaign)" + + (strictUtm ? "" : "|ref") + + "|" + + paramsRegexList + + ")="; + if (ignore && !allowParams.length) return falseVar; + + // The prefix "utm_" is optional with "strictUtm" disabled + // "ref" is only collected when "strictUtm" is disabled + return new RegExp(regex).test(keyValue); + }) + .join("&") || undefinedVar + ); }; // Ignore pages specified in data-ignore-pages @@ -446,13 +432,12 @@ // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS // - var phantom = window.phantom; var bot = nav.webdriver || window.__nightmare || window.callPhantom || window._phantom || - (phantom && !phantom.solana) || + window.phantom || window.__polypane || window._bot || isBotAgent || @@ -527,12 +512,8 @@ var lastSendPath; var getReferrer = function () { - // Customers can overwrite their referrer, here we check for that - var overwrittenReferrer = - overwriteOptions.referrer || attr(scriptElement, "referrer"); - return ( - (overwrittenReferrer || doc.referrer || "") + (doc.referrer || "") .replace(locationHostname, definedHostname) .replace(/^https?:\/\/((m|l|w{2,3}([0-9]+)?)\.)?([^?#]+)(.*)$/, "$4") .replace(/^([^/]+)$/, "$1") || undefinedVar @@ -573,12 +554,7 @@ // sendData will assign payload to request sendData(append, undefinedVar, trueVar); } else { - try { - nav.sendBeacon.bind(nav)(fullApiUrl + "/append", stringify(append)); - } catch (e) { - // Fallback for browsers throwing "Illegal invocation" when the URL is invalid - sendData(append, undefinedVar, trueVar); - } + nav.sendBeacon(fullApiUrl + "/append", stringify(append)); } }; @@ -675,28 +651,21 @@ isPushState, deleteSourceInfo, sameSite, - search, - metadata, - callback + metadata ) { if (isPushState) sendOnLeave("" + payload.page_id, trueVar); if (collectDataOnLeave) payload.page_id = uuid(); var currentPage = definedHostname + getPath(); - var query = getQueryParams(deleteSourceInfo, search); - sendData( - { - id: payload.page_id, - type: pageviewText, - referrer: !deleteSourceInfo || sameSite ? referrer : null, - query: query, - p: p, - - metadata: stringify(metadata), - }, - callback - ); + sendData({ + id: payload.page_id, + type: pageviewText, + referrer: !deleteSourceInfo || sameSite ? referrer : null, + query: getQueryParams(deleteSourceInfo), + + metadata: stringify(metadata), + }); previousReferrer = referrer; referrer = currentPage; @@ -706,21 +675,7 @@ var sameSite, userNavigated; - var pageview = function ( - isPushState, - pathOverwrite, - metadata, - callbackRaw - ) { - if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata; - var callback = isFunction(callbackRaw) ? callbackRaw : function () {}; - var querySearch; - if (isString(pathOverwrite) && pathOverwrite.indexOf("?") > -1) { - // keep query from manual path - var parts = pathOverwrite.split("?"); - pathOverwrite = parts.shift(); - querySearch = "?" + parts.join("?"); - } + var pageview = function (isPushState, pathOverwrite, metadata) { // Obfuscate personal data in URL by dropping the search and hash var path = getPath(pathOverwrite); @@ -783,10 +738,7 @@ : falseVar; // We set unique variable based on pushstate or back navigation, if no match we check the referrer - page.unique = - /__cf_/.test(getReferrer()) || isPushState || userNavigated - ? falseVar - : !sameSite; + page.unique = isPushState || userNavigated ? falseVar : !sameSite; metadata = appendMetadata(metadata, { type: pageviewText, @@ -795,15 +747,11 @@ var triggerSendPageView = function () { fetchedHighEntropyValues = trueVar; - var delSrc = - isPushState || userNavigated || !collectMetricByString("r"); sendPageView( isPushState, - delSrc, // r = referrers + isPushState || userNavigated || !collectMetricByString("r"), // r = referrers sameSite, - querySearch, - metadata, - callback + metadata ); }; @@ -893,11 +841,11 @@ } if (autoCollect) pageview(); - - window.sa_pageview = function (path, metadata, callback) { - pageview(0, path, metadata, callback); - }; - + else { + window.sa_pageview = function (path, metadata) { + pageview(0, path, metadata); + }; + } ///////////////////// // EVENTS @@ -990,6 +938,6 @@ {}, "simpleanalyticscdn.com", "queue.", - "cdn_latest_dev_12", + "cdn_latest_dev_11", "sa" ); diff --git a/dist/latest/latest.js b/dist/latest/latest.js index 2211491b..555b6282 100644 --- a/dist/latest/latest.js +++ b/dist/latest/latest.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-08-12; d2af; v12) */ +/* Simple Analytics - Privacy friendly analytics (docs.simpleanalytics.com/script; 2026-08-17; 3761; v11) */ -!function(d,t,e,n,m){try{var v=undefined,g=!0,y=!1,r="true",a="https:",_="pageview",u="event",i="error",o=d.console,c="doNotTrack",w=d.navigator,s=d.location,b=s.host,l=d.document,p=w.userAgent,f="Not sending request ",h=f+"when ",O=y,E=encodeURIComponent,x=decodeURIComponent,S=JSON.stringify,M=d.addEventListener,k="https://queue."+e,q=l.documentElement||{},A="language",$="Height",j="scroll",D=w.userAgentData,C=j+$,R="offset"+$,H="client"+$,P="pagehide",T="platform",U="platformVersion",I="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),N=d.screen,z=l.currentScript||l.querySelector('script[src*="'+e+'"]');m=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){m("Error in your "+t+" function:",e)},W=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},G=function(t){return"string"==typeof t},J=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},L=function(t,e){return t&&t.getAttribute("data-"+e)},Y=function(t){return Array.isArray(t)?t:G(t)&&t.length?t.split(/, ?/):[]},Z=function(t){return t&&t.constructor===Object},K=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},it=function(t){return"function"==typeof t},ot="namespace",ct=t[ot]||L(z,ot)||"sa",st=function(t,e){var n=d[ct+"_metadata"];Z(n)&&(t=K(t,n));var r=d[kt];if(!it(r))return kt&&m(kt+" not found, set window."+kt),t;try{return K(t,r.call(d,K(t,e)))}catch(a){F("metadata",a)}},ut=t.strictUtm||L(z,"strict-utm")==r,lt=function(i,t){tt=!i&&nt("p")?"":y;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");tt!==y&&0>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},rt=function(t){return"function"==typeof t},at="namespace",it=t[at]||J(z,at)||"sa",ot=l[it+"_metadata"],ct=function(t,e){Y(ot)&&(t=Z(t,ot));var n=l[Mt];if(!rt(n))return t;try{return Z(t,n.call(l,Z(t,e)))}catch(r){F("metadata",r)}},st=t.strictUtm||J(z,"strict-utm")==r,ut=function(a){return s.search.slice(1).split("&").filter(function(t){var e=a||!tt("ut"),n=Ot.map(G).join("|"),r=e?"^("+n+")=":"^((utm_)"+(st?"":"?")+"(source|medium|content|term|campaign)"+(st?"":"|ref")+"|"+n+")=";return e&&!Ot.length?d:new RegExp(r).test(t)}).join("&")||h},lt=it+"_loaded";if(l[lt]==f)return p(w+"twice");l.sa_event_loaded=f,l[lt]=f;var pt=function(e,t,n){e=n?e:Z(At,Dt,e),g.brave&&!n&&(e.brave=f),g._duckduckgoloader_&&!n&&(e.duck=f);var r=new Image;t&&(r.onerror=t,r.onload=t),r.src=k+"/simple.gif?"+Object.keys(e).filter(function(t){return e[t]!=h}).map(function(t){return O(t)+"="+O(e[t])}).join("&")+"&time="+Date.now()},ht=t.hostname||J(z,"hostname"),ft=ht||v,dt={version:"cdn_latest_11",hostname:ft};n=function(t){t=t.stack?t+" "+t.stack:t,p(t),pt(Z(dt,{type:i,error:t,path:s.pathname}),h,f)},M(i,function(t){t.filename&&-1> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var p;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n p = !ignoreSource && collectMetricByString(\"p\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (p !== falseVar && i > 0 && keyValue.slice(i + 1))\n p += (p ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n p = p || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n p: p,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"simpleanalyticscdn.com\",\n \"queue.\",\n \"cdn_latest_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","protocol","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","p","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"latest.source.js","sources":["latest.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var metadataObject = window[namespace + \"_metadata\"];\n var appendMetadata = function (metadata, data) {\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) return metadata;\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var getQueryParams = function (ignoreSource) {\n return (\n loc.search\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex).test(keyValue);\n })\n .join(\"&\") || undefinedVar\n );\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n window.phantom ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n return (\n (doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n nav.sendBeacon(fullApiUrl + \"/append\", stringify(append));\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n metadata\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n\n sendData({\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: getQueryParams(deleteSourceInfo),\n\n metadata: stringify(metadata),\n });\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (isPushState, pathOverwrite, metadata) {\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique = isPushState || userNavigated ? falseVar : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n sendPageView(\n isPushState,\n isPushState || userNavigated || !collectMetricByString(\"r\"), // r = referrers\n sameSite,\n metadata\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n else {\n window.sa_pageview = function (path, metadata) {\n pageview(0, path, metadata);\n };\n }\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"simpleanalyticscdn.com\",\n \"queue.\",\n \"cdn_latest_11\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","protocol","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","metadataObject","appendMetadata","metadata","data","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","search","keyValue","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","indexOf","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","bot","webdriver","__nightmare","callPhantom","_phantom","phantom","__polypane","_bot","collectDataOnLeave","ua","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","i","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","e","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","callbackRaw","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue","q"],"mappings":"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"} \ No newline at end of file diff --git a/dist/latest/light.js b/dist/latest/light.js index c3948d94..12325346 100644 --- a/dist/latest/light.js +++ b/dist/latest/light.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-08-12; 5f98; v12) */ +/* Simple Analytics - Privacy friendly analytics (docs.simpleanalytics.com/script; 2026-08-17; 630c; v11) */ -!function(l,e,t,f){try{var u=undefined,n="https:",r=l.console,a="doNotTrack",m=l.navigator,p=l.location,g=p.host,i=l.document,o=m.userAgent,c="Not sending request ",h=!1,s=encodeURIComponent,d=decodeURIComponent,v=JSON.stringify,y=l.addEventListener,_="https://queue."+t,b=(i.documentElement,"language"),w=m.userAgentData,O="platform",S="platformVersion",j="https://docs.simpleanalytics.com",k=/(bot|spider|crawl)/i.test(o)&&!/(cubot)/i.test(o),E=i.currentScript||i.querySelector('script[src*="'+t+'"]');f=function(){var e=[].slice.call(arguments);return e.unshift("Simple Analytics:"),Function.prototype.apply.call(r.warn,r,e)};var q=function(e){return"string"==typeof e},x=function(e,t){return e&&e.getAttribute("data-"+t)},A=function(){for(var e,t,n,r={},a=arguments,i=0;i>e/4).toString(16)})}catch(r){return e.replace(n,function(e){var t=16*Math.random()|0;return(e<2?t:3&t|8).toString(16)})}},N=function(e){return"function"==typeof e},R="namespace",U=e[R]||x(E,R)||"sa",V=e.strictUtm||"true"==x(E,"strict-utm"),B=U+"_loaded";if(1==l[B])return f(c+"twice");l.sa_event_loaded=!0,l[B]=!0;var C,T=function(t,e,n){t=n?t:A(J,M,t),m.brave&&!n&&(t.brave=!0),m._duckduckgoloader_&&!n&&(t.duck=!0),(new Image).src=_+"/simple.gif?"+Object.keys(t).filter(function(e){return t[e]!=u}).map(function(e){return s(e)+"="+s(t[e])}).join("&")+"&time="+Date.now()},F=e.hostname||x(E,"hostname"),H=F||g,z={version:"cdn_light_12",hostname:H};e.mode||x(E,"mode");try{C=Intl.DateTimeFormat().resolvedOptions().timeZone}catch(X){f(X)}k&&(z.bot=!0);var J=A(z,{ua:o,https:p.protocol==n,timezone:C,page_id:I(),session_id:I()});if(J.sri=!1,w&&(J.mobile=w.mobile,J.brands=v(w.brands)),H!==g&&(J.hostname_original=g),a in m&&"1"==m[a])return f("Not sending request when "+a+" is enabled. See "+j+"/dnt");-1!=g.indexOf(".")&&!/^[0-9.:]+$/.test(g)||F||f("Set hostname on "+g+". See "+j+"/overwrite-domain-name");var L,M={},P=(e.referrer||x(E,"referrer")||i.referrer||"").replace(g,H).replace(/^https?:\/\/((m|l|w{2,3}([0-9]+)?)\.)?([^?#]+)(.*)$/,"$4").replace(/^([^/]+)$/,"$1")||u,Z=function(e,t){var n=A(z,{type:"append",original_id:t?e:J.page_id});if(t||!m.sendBeacon)T(n,0,!0);else try{m.sendBeacon.bind(m)(_+"/append",v(n))}catch(r){T(n,0,!0)}};y("pagehide",Z,!1);var G,K,Q=function(e){var t="";try{t=e||d(p.pathname)}catch(X){f(X)}return t},W=function(e,t,n,r,a,i){e&&Z(""+J.page_id,!0),J.page_id=I();var o,c=H+Q(),s=(o=t,(r||p.search).slice(1).split("&").filter(function(e){return!o&&new RegExp("^((utm_)"+(V?"":"?")+"(source|medium|content|term|campaign)"+(V?"":"|ref")+")=","i").test(e)}).join("&")||u);T({id:J.page_id,type:"pageview",referrer:!t||n?P:null,query:s}),P=c,0};!function(e,t,n,r){!r&&N(n)&&(r=n);var a,i;N(r);q(t)&&-1>e/4).toString(16)})}catch(r){return e.replace(n,function(e){var t=16*Math.random()|0;return(e<2?t:3&t|8).toString(16)})}},I="namespace",N=e[I]||q(E,I)||"sa",R=e.strictUtm||"true"==q(E,"strict-utm"),U=N+"_loaded";if(1==s[U])return u(m+"twice");s.sa_event_loaded=!0,s[U]=!0;var V,B=function(t,e,n){t=n?t:A(H,J,t),p.brave&&!n&&(t.brave=!0),p._duckduckgoloader_&&!n&&(t.duck=!0),(new Image).src=_+"/simple.gif?"+Object.keys(t).filter(function(e){return t[e]!=i}).map(function(e){return g(e)+"="+g(t[e])}).join("&")+"&time="+Date.now()},C=e.hostname||q(E,"hostname"),T=C||d,F={version:"cdn_light_11",hostname:T};e.mode||q(E,"mode");try{V=Intl.DateTimeFormat().resolvedOptions().timeZone}catch(Q){u(Q)}j&&(F.bot=!0);var H=A(F,{ua:l,https:c.protocol==n,timezone:V,page_id:D(),session_id:D()});if(H.sri=!1,b&&(H.mobile=b.mobile,H.brands=v(b.brands)),T!==d&&(H.hostname_original=d),a in p&&"1"==p[a])return u("Not sending request when "+a+" is enabled. See "+k+"/dnt");-1!=d.indexOf(".")&&!/^[0-9.:]+$/.test(d)||C||u("Set hostname on "+d+". See "+k+"/overwrite-domain-name");var z,J={},L=(o.referrer||"").replace(d,T).replace(/^https?:\/\/((m|l|w{2,3}([0-9]+)?)\.)?([^?#]+)(.*)$/,"$4").replace(/^([^/]+)$/,"$1")||i,M=function(e,t){var n=A(F,{type:"append",original_id:t?e:H.page_id});t||!p.sendBeacon?B(n,0,!0):p.sendBeacon(_+"/append",v(n))};y("pagehide",M,!1);var P,Z,G=function(e){var t="";try{t=e||h(c.pathname)}catch(Q){u(Q)}return t},K=function(e,t,n,r){e&&M(""+H.page_id,!0),H.page_id=D();var a,o=T+G();B({id:H.page_id,type:"pageview",referrer:!t||n?L:null,query:(a=t,c.search.slice(1).split("&").filter(function(e){return!a&&new RegExp("^((utm_)"+(R?"":"?")+"(source|medium|content|term|campaign)"+(R?"":"|ref")+")=").test(e)}).join("&")||i)}),L=o,0};!function(e,t){var n=G(t);if(n&&z!=n){z=n,J.path=n,p[w]&&(J[w]=p[w]);var r,a=s.performance,o="navigation";try{r=a.getEntriesByType(o)[0].type}catch(Q){u(Q)}Z=r?-1<["reload","back_forward"].indexOf(r):a&&a[o]&&-1<[1,2].indexOf(a[o].type),P=!!L&&L.split("/")[0]==d;var i=function(){f=!0,K(e,e||Z||!1,P)};if(f)i();else try{b&&"function"==typeof b.getHighEntropyValues?b.getHighEntropyValues([O,S]).then(function(e){H.os_name=e[O],H.os_version=e[S],i()})["catch"](i):i()}catch(c){i()}}}()}catch(W){u(W)}}(window,{},"simpleanalyticscdn.com"); //# sourceMappingURL=light.js.map \ No newline at end of file diff --git a/dist/latest/light.js.map b/dist/latest/light.js.map index a9d5a874..3e539765 100644 --- a/dist/latest/light.js.map +++ b/dist/latest/light.js.map @@ -1 +1 @@ -{"version":3,"file":"light.source.js","sources":["light.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n\n var collectMetricByString = function (metricAbbreviation) {\n // eslint-disable-next-line no-unreachable\n return true;\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n if (ignore) return falseVar;\n // eslint-disable-next-line no-redeclare\n var regex =\n \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \")=\";\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n return q || undefinedVar;\n };\n\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n\n\n\n\n\n\n\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n // eslint-disable-next-line no-redeclare\n var bot = isBotAgent;\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n\n\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n sameSite = referrer\n ? referrer.split(slash)[0] == locationHostname\n : falseVar;\n\n\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n\n\n pageview();\n\n } catch (e) {\n warn(e);\n }\n})(\n window,\n {},\n \"simpleanalyticscdn.com\",\n \"queue.\",\n \"cdn_light_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","warn","undefinedVar","undefined","https","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","protocol","language","documentElement","uaData","userAgentData","platformText","platformVersionText","docsUrl","isBotAgent","test","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","isString","string","attr","attribute","getAttribute","assign","obj","prop","object","to","arg","index","length","nextSource","constructor","Object","nextKey","hasOwnProperty","settings","sa_settings","logSettings","keys","Date","now","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","replace","c","getRandomValues","Uint8Array","toString","error","r","Math","random","isFunction","func","namespaceText","namespace","strictUtm","loadedVariable","sa_event_loaded","timezone","sendData","data","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","Image","src","filter","key","map","join","overwrittenHostname","hostname","definedHostname","basePayload","version","mode","Intl","DateTimeFormat","resolvedOptions","timeZone","bot","ua","page_id","session_id","sri","mobile","brands","hostname_original","indexOf","lastSendPath","referrer","sendOnLeave","id","push","append","type","original_id","sendBeacon","bind","e","sameSite","userNavigated","getPath","overwrite","path","pathname","sendPageView","isPushState","deleteSourceInfo","search","metadata","ignoreSource","currentPage","query","split","keyValue","RegExp","pages","pathOverwrite","callbackRaw","querySearch","parts","shift","performaceEntryType","perf","performance","navigationText","getEntriesByType","triggerSendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","pageview"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"light.source.js","sources":["light.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n\n var collectMetricByString = function (metricAbbreviation) {\n return true;\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var getQueryParams = function (ignoreSource) {\n return (\n loc.search\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n if (ignore) return falseVar;\n var regex =\n \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \")=\";\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex).test(keyValue);\n })\n .join(\"&\") || undefinedVar\n );\n };\n\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n\n\n\n\n\n\n\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var bot = isBotAgent;\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n return (\n (doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n nav.sendBeacon(fullApiUrl + \"/append\", stringify(append));\n }\n };\n\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n\n\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n metadata\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n\n sendData({\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: getQueryParams(deleteSourceInfo),\n\n });\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (isPushState, pathOverwrite, metadata) {\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n sameSite = referrer\n ? referrer.split(slash)[0] == locationHostname\n : falseVar;\n\n\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n sendPageView(\n isPushState,\n isPushState || userNavigated || !collectMetricByString(\"r\"), // r = referrers\n sameSite,\n metadata\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n\n\n pageview();\n\n } catch (e) {\n warn(e);\n }\n})(\n window,\n {},\n \"simpleanalyticscdn.com\",\n \"queue.\",\n \"cdn_light_11\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","warn","undefinedVar","undefined","https","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","protocol","language","documentElement","uaData","userAgentData","platformText","platformVersionText","docsUrl","isBotAgent","test","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","attr","attribute","getAttribute","assign","obj","prop","object","to","arg","index","length","nextSource","constructor","Object","nextKey","hasOwnProperty","settings","sa_settings","logSettings","keys","Date","now","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","replace","c","getRandomValues","Uint8Array","toString","error","r","Math","random","namespaceText","namespace","strictUtm","loadedVariable","sa_event_loaded","timezone","sendData","data","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","Image","src","filter","key","map","join","overwrittenHostname","hostname","definedHostname","basePayload","version","mode","Intl","DateTimeFormat","resolvedOptions","timeZone","bot","ua","page_id","session_id","sri","mobile","brands","hostname_original","indexOf","lastSendPath","referrer","sendOnLeave","id","push","append","type","original_id","sendBeacon","sameSite","userNavigated","getPath","overwrite","path","pathname","sendPageView","isPushState","deleteSourceInfo","metadata","ignoreSource","currentPage","query","search","split","keyValue","RegExp","pages","pathOverwrite","performaceEntryType","perf","performance","navigationText","getEntriesByType","triggerSendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","e","pageview"],"mappings":"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"} \ No newline at end of file diff --git a/dist/v11/app.js b/dist/v11/app.js index ebeba2c5..cb2d6747 100644 --- a/dist/v11/app.js +++ b/dist/v11/app.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy friendly analytics (docs.simpleanalytics.com/script; 2023-05-03; 10ee; SRI-version; v11) */ +/* Simple Analytics - Privacy friendly analytics (docs.simpleanalytics.com/script; 2026-08-17; f809; SRI-version; v11) */ !function(l,t,e,n,p){try{var h=undefined,f=!0,d=!1,r="true",a="https:",m="pageview",u="event",i="error",o=l.console,c="doNotTrack",g=l.navigator,s=l.location,v=s.host,y=l.document,_=g.userAgent,w="Not sending request ",b=w+"when ",E=d,O=encodeURIComponent,x=decodeURIComponent,S=JSON.stringify,M=l.addEventListener,k="https://queue."+e,q=y.documentElement||{},A="language",$="Height",j="scroll",D=g.userAgentData,C=j+$,R="offset"+$,H="client"+$,P="pagehide",T="platform",U="platformVersion",I="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(_)&&!/(cubot)/i.test(_),N=l.screen,z=y.currentScript||y.querySelector('script[src*="'+e+'"]');p=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){p("Error in your "+t+" function:",e)},W=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},G=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},J=function(t,e){return t&&t.getAttribute("data-"+e)},L=function(t){return Array.isArray(t)?t:"string"==typeof t&&t.length?t.split(/, ?/):[]},Y=function(t){return t&&t.constructor===Object},Z=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},rt=function(t){return"function"==typeof t},at="namespace",it=t[at]||J(z,at)||"sa",ot=l[it+"_metadata"],ct=function(t,e){Y(ot)&&(t=Z(t,ot));var n=l[Mt];if(!rt(n))return t;try{return Z(t,n.call(l,Z(t,e)))}catch(r){F("metadata",r)}},st=t.strictUtm||J(z,"strict-utm")==r,ut=function(a){return s.search.slice(1).split("&").filter(function(t){var e=a||!tt("ut"),n=Ot.map(G).join("|"),r=e?"^("+n+")=":"^((utm_)"+(st?"":"?")+"(source|medium|content|term|campaign)"+(st?"":"|ref")+"|"+n+")=";return e&&!Ot.length?d:new RegExp(r).test(t)}).join("&")||h},lt=it+"_loaded";if(l[lt]==f)return p(w+"twice");l.sa_event_loaded=f,l[lt]=f;var pt=function(e,t,n){e=n?e:Z(At,Dt,e),g.brave&&!n&&(e.brave=f),g._duckduckgoloader_&&!n&&(e.duck=f);var r=new Image;t&&(r.onerror=t,r.onload=t),r.src=k+"/simple.gif?"+Object.keys(e).filter(function(t){return e[t]!=h}).map(function(t){return O(t)+"="+O(e[t])}).join("&")+"&time="+Date.now()},ht=t.hostname||J(z,"hostname"),ft=ht||v,dt={version:"cdn_latest_11",hostname:ft};n=function(t){t=t.stack?t+" "+t.stack:t,p(t),pt(Z(dt,{type:i,error:t,path:s.pathname}),h,f)},M(i,function(t){t.filename&&-1> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var metadataObject = window[namespace + \"_metadata\"];\n var appendMetadata = function (metadata, data) {\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) return metadata;\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var getQueryParams = function (ignoreSource) {\n return (\n loc.search\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex).test(keyValue);\n })\n .join(\"&\") || undefinedVar\n );\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n window.phantom ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = trueVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n return (\n (doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n nav.sendBeacon(fullApiUrl + \"/append\", stringify(append));\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n metadata\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n\n sendData({\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: getQueryParams(deleteSourceInfo),\n\n metadata: stringify(metadata),\n });\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (isPushState, pathOverwrite, metadata) {\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique = isPushState || userNavigated ? falseVar : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n sendPageView(\n isPushState,\n isPushState || userNavigated || !collectMetricByString(\"r\"), // r = referrers\n sameSite,\n metadata\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n else {\n window.sa_pageview = function (path, metadata) {\n pageview(0, path, metadata);\n };\n }\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"simpleanalyticscdn.com\",\n \"queue.\",\n \"cdn_latest_11\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","protocol","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","metadataObject","appendMetadata","metadata","data","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","search","keyValue","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","indexOf","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","bot","webdriver","__nightmare","callPhantom","_phantom","phantom","__polypane","_bot","collectDataOnLeave","ua","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","i","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","e","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","callbackRaw","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue","q"],"mappings":";;CAEA,SACEA,EACAC,EACAC,EAIAC,EACAC,GAEA,IAQE,IAAIC,EAAeC,UACfC,GAAU,EACVC,GAAW,EACXC,EAAW,OACXC,EAAQ,SACRC,EAAe,WACfC,EAAY,QACZC,EAAY,QAGZC,EAAMd,EAAOe,QACbC,EAAa,aACbC,EAAMjB,EAAOkB,UACbC,EAAMnB,EAAOoB,SACbC,EAAmBF,EAAIG,KACvBC,EAAMvB,EAAOwB,SACbC,EAAYR,EAAIQ,UAChBC,EAAa,uBACbC,EAAiBD,EAAa,QAC9BE,EAA2BpB,EAC3BqB,EAAyBC,mBACzBC,EAAyBC,mBACzBC,EAAYC,KAAKD,UAEjBE,EAAuBnC,EAAOoC,iBAC9BC,EAAaC,iBAA0BpC,EACvCqC,EAAkBhB,EAAIgB,iBAAmB,GACzCC,EAAW,WACXC,EAAS,SAETC,EAAS,SACTC,EAAS1B,EAAI2B,cACbC,EAAeH,EAASD,EACxBK,EAAe,SAAWL,EAC1BM,EAAe,SAAWN,EAE1BO,EAAW,WACXC,EAAe,WACfC,EAAsB,kBACtBC,EAAU,mCACVC,EAAQ,EACRC,EACF,sBAAsBC,KAAK7B,KAAe,WAAW6B,KAAK7B,GACxD8B,EAASvD,EAAOuD,OAIhBC,EACFjC,EAAIkC,eAAiBlC,EAAImC,cAAc,gBAAkBxD,EAAU,MAOrEE,EAAO,WAEL,IAAIuD,EAAO,GAAGC,MAAMC,KAAKC,WAOzB,OAJAH,EAAKI,QAAQ,qBAINC,SAASC,UAAUC,MAAML,KAAK/C,EAAIV,KAAMU,EAAK6C,IAGtD,IAAIQ,EAAiB,SAAUC,EAAMC,GACnCjE,EAAK,iBAAmBgE,EAAO,aAAcC,IAG3CC,EAAU,SAAUC,EAAKC,GAC3B,OAAOC,OAAOR,UAAUS,eAAeb,KAAKU,EAAKC,IAO/CG,EAAc,SAAUC,GAC1B,OAAOA,EAAKC,QAAQ,sBAAuB,SAGzCC,EAAO,SAAUtB,EAAeuB,GAClC,OAAOvB,GAAiBA,EAAcwB,aAAa,QAAUD,IAG3DE,EAA+B,SAAUC,GAC3C,OAAOC,MAAMC,QAAQF,GACjBA,EAboB,iBAcXA,GAAQA,EAAIG,OACrBH,EAAII,MAAM,OACV,IAGFC,EAAW,SAAUC,GACvB,OAAOA,GAAUA,EAAOC,cAAgBhB,QAGtCiB,EAAS,WAGX,IAFA,IAAIC,EAAK,GACLC,EAAM9B,UACD+B,EAAQ,EAAGA,EAAQD,EAAIP,OAAQQ,IAAS,CAC/C,IAAIC,EAAaF,EAAIC,GACrB,GAAIN,EAASO,GACX,IAAK,IAAIC,KAAWD,EACdxB,EAAQwB,EAAYC,KACtBJ,EAAGI,GAAWD,EAAWC,IAKjC,OAAOJ,GAGLK,EAAWhG,EAAOiG,YAClBC,EAAcF,GAAYvB,OAAO0B,KAAKlG,GAAkBoF,OAG5DpF,EAAmByF,EAAOzF,EAAkB+F,GAExCE,GAAa9F,EAAK,WAAYH,GAGlC,IAAImG,EAAgBnB,EAClBhF,EAAiBmG,eAAiBtB,EAAKtB,EAAe,mBAGpD6C,GAAwB,SAAUC,GAEpC,OAGgB,IAFdF,EAAcG,OAAO,SAAU3B,GAC7B,OAAO,IAAI4B,OAAO,IAAMF,GAAoBhD,KAAKsB,KAChDS,QAIHoB,GAAMC,KAAKD,IAEXE,GAAO,WACT,IAAIC,EAAe5G,EAAO6G,QAAU7G,EAAO8G,SACvCC,EAAY,CAAC,MAAQ,KAAO,KAAO,KAAO,KAC1CC,EAAY,SAEhB,IACE,OAAOD,EAAUlC,QAAQmC,EAAW,SAAUC,GAC5C,OACEA,EACCL,EAAaM,gBAAgB,IAAIC,WAAW,IAAI,GAC9C,IAAOF,EAAI,GACdG,SAAS,MAEb,MAAO/C,GACP,OAAO0C,EAAUlC,QAAQmC,EAAW,SAAUC,GAC5C,IAAII,EAAqB,GAAhBC,KAAKC,SAAiB,EAE/B,OADMN,EAAI,EAAII,EAAS,EAAJA,EAAW,GACrBD,SAAS,QAKpBI,GAAa,SAAUC,GACzB,MAAsB,mBAARA,GAIZC,GAAgB,YAChBC,GACF1H,EAAiByH,KACjB5C,EAAKtB,EAAekE,KA6uBxB,KA1uBME,GAAiB5H,EAAO2H,GAAY,aACpCE,GAAiB,SAAUC,EAAUC,GACnCxC,EAASqC,MAAiBE,EAAWpC,EAAOoC,EAAUF,KAC1D,IAAII,EAA4BhI,EAAOiI,IACvC,IAAKT,GAAWQ,GAA4B,OAAOF,EACnD,IACE,OAAOpC,EACLoC,EACAE,EAA0BnE,KAAK7D,EAAQ0F,EAAOoC,EAAUC,KAE1D,MAAO1D,GACPF,EAAe,WAAYE,KAU3B6D,GACFjI,EAAiBiI,WACjBpD,EAAKtB,EAAe,eAAiB/C,EAEnC0H,GAAiB,SAAUC,GAC7B,OACEjH,EAAIkH,OACDzE,MAAM,GACN0B,MAAM,KACNiB,OAAO,SAAU+B,GAChB,IAAIC,EAASH,IAAiB/B,GAAsB,MAEhDmC,EAAkBC,GAAYC,IAAI/D,GAAagE,KAAK,KACpDC,EAAQL,EACR,KAAOC,EAAkB,KACzB,YACCN,GAAY,GAAK,KAClB,yCACCA,GAAY,GAAK,QAClB,IACAM,EACA,KACJ,OAAID,IAAWE,GAAYpD,OAAe7E,EAInC,IAAIgG,OAAOoC,GAAOtF,KAAKgF,KAE/BK,KAAK,MAAQtI,GAgChBwI,GAAiBlB,GAAY,UACjC,GAAI3H,EAAO6I,KAAmBtI,EAAS,OAAOH,EAAKsB,EAAa,SAChE1B,EAAO8I,gBAAkBvI,EACzBP,EAAO6I,IAAkBtI,EAOzB,IAAIwI,GAAW,SAAUhB,EAAMiB,EAAUC,GACvClB,EAAOkB,EAAelB,EAAOrC,EAAOwD,GAASC,GAAMpB,GAE/C9G,EAAImI,QAAUH,IAAclB,EAAKqB,MAAQ7I,GACzCU,EAAIoI,qBAAuBJ,IAAclB,EAAKuB,KAAO/I,GAGzD,IAAIgJ,EAAQ,IAAIC,MACZR,IACFO,EAAME,QAAUT,EAChBO,EAAMG,OAASV,GAEjBO,EAAMI,IACJtH,EACA,eACAoC,OAAO0B,KAAK4B,GACTxB,OAAO,SAAUqD,GAChB,OAAO7B,EAAK6B,IAAQvJ,IAErBqI,IAAI,SAAUkB,GACb,OACE/H,EAAuB+H,GACvB,IACA/H,EAAuBkG,EAAK6B,MAG/BjB,KAAK,KACR,SACAjC,KAAKD,OAILoD,GACF5J,EAAiB6J,UAAYhF,EAAKtB,EAAe,YAC/CuG,GAAkBF,IAAuBxI,EAEzC2I,GAAc,CAChBC,QAymBJ,gBAxmBIH,SAAUC,IASZ5J,EAAY,SAAU+J,GACpBA,EAAiBA,EAAeC,MAC5BD,EAAiB,IAAMA,EAAeC,MACtCD,EACJ9J,EAAK8J,GACLnB,GACErD,EAAOsE,GAAa,CAClBI,KAAMvJ,EACNwD,MAAO6F,EACPG,KAAMlJ,EAAImJ,WAEZjK,EACAE,IAMJ4B,EACEtB,EACA,SAAU0J,GACJA,EAAMC,WAA+C,EAAnCD,EAAMC,SAASC,QAAQvK,IAC3CC,EAAUoK,EAAMG,UAGpBlK,GAOF,IAwDImK,GAxDAC,GAAQnE,KAERoE,GAAW,EAOXC,GAAO7K,EAAiB6K,MAAQhG,EAAKtB,EAAe,QAGpDuH,MAvKsBC,GAuKC/K,EAAiB8K,cAtKvBC,GAuKjB/K,EAAiB8K,WACjBjG,EAAKtB,EAAe,eAAiB/C,GACrCqE,EAAKtB,EAAe,aAAe/C,GACnCqE,EAAKtB,EAAe,gBAAkB/C,EAGtCwK,KACqC,SAAvCnG,EAAKtB,EAAe,iBACpBvD,EAAiBgL,cAAgBzK,GAI/B0K,GACFjL,EAAiBkL,UACjBrG,EAAKtB,EAAe,cACpBmE,GAAY,IAAM/G,EAGhBwK,GAAcnG,EAChBhF,EAAiBmL,aAAetG,EAAKtB,EAAe,iBAIlDiF,GAAcxD,EAChBhF,EAAiBwI,aAAe3D,EAAKtB,EAAe,iBAIlD6H,GAAqBpG,EACvBhF,EAAiBoL,oBACfvG,EAAKtB,EAAe,yBAIpB8H,GACFrL,EAAiBqL,gBAAkBxG,EAAKtB,EAAe,mBAGrDyE,GACFhI,EAAiBgI,mBACjBnD,EAAKtB,EAAe,sBAItB,IAEEmH,GAAWtE,GAAsB,KAC7BkF,KAAKC,iBAAiBC,kBAAkBC,SACxCrL,EACJ,MAAOgE,IACPjE,EAAKiE,IAOP,IAAIsH,GACF1K,EAAI2K,WACJ5L,EAAO6L,aACP7L,EAAO8L,aACP9L,EAAO+L,UACP/L,EAAOgM,SACPhM,EAAOiM,YACPjM,EAAOkM,MACP7I,GACAiE,KAAKC,UAAYD,KAAKC,SAGpB4E,GACF9F,GAAsB,MAAQA,GAAsB,QAElDsF,KAAK3B,GAAY2B,IAAMpL,GAE3B,IAAI2I,GAAUxD,EAAOsE,GAAa,CAEhCoC,GAAI/F,GAAsB,MAAQ5E,EAAYpB,EAE9CK,MAAOS,EAAImB,UAAY5B,EACvBiK,SAAUA,GACV0B,QAASF,GAAqBxF,KAAStG,EAGvCiM,WAAYjG,GAAsB,MAAQM,KAAStG,IA0BrD,GAvBA6I,GAAQqD,IAAMhM,EAIVoC,IACFuG,GAAQsD,OAAS7J,EAAO6J,OACxBtD,GAAQuD,OAASxK,EAAUU,EAAO8J,SAS/BlL,EAAImL,SAAStM,EAAK,4CAInB2J,KAAoB1I,IACtB6H,GAAQyD,kBAAoBtL,IAGzB0J,IAAc/J,KAAcC,GAA0B,KAAnBA,EAAID,GAC1C,OAAOZ,EACLuB,EAAiBX,EAAa,oBAAsBmC,EAAU,SAK7B,GAAlC9B,EAAiBoJ,QAAQ,OACxB,aAAanH,KAAKjC,IACnBwI,IAEDzJ,EACE,mBACEiB,EACA,SACA8B,EACA,0BAON,IACIyJ,GAiDAC,GAlDA1D,GAAO,GAaP2D,IARCvL,EAAIuL,UAAY,IACdjI,QAAQxD,EAAkB0I,IAC1BlF,QAAQ,sDAAuD,MAC/DA,QAAQ,YAAa,OAASxE,EAYjC0M,GAAW,EAEXC,GAAc,SAAUC,EAAIC,GAC9B,IAEIC,EAFChB,KAEDgB,EAASzH,EAAOsE,GAAa,CAC/BI,KAAM,SACNgD,YAAaF,EAAOD,EAAK/D,GAAQmD,UAI/BhG,GAAsB,OACxB8G,EAAOE,SAAW/F,KAAKgG,OAAO7G,KAAQmE,GAAQmC,IAhfnC,MAkfbA,GAAW,EACXnC,GAAQnE,KAGJJ,GAAsB,UACxB8G,EAAOtC,SAAWvD,KAAKiG,IAAI,EAAG1C,GAAU2C,OAGtCN,IAASjM,EAAIwM,WAEf1E,GAASoE,EAAQ9M,EAAcE,GAE/BU,EAAIwM,WAAWpL,EAAa,UAAWJ,EAAUkL,MAKrDhL,EACE,mBACA,WACMZ,EAAImM,QACA,KAAO1K,KAAYhD,GAASgN,KAClCH,GAAcpG,MACTsG,IAAYtG,KAAQoG,IAE7BrM,GAGF2B,EAAqBa,EAAUgK,GAAaxM,GAE5C,IAAImN,GAAOpM,EAAIoM,MAAQ,GACnBH,GAAW,WACb,IACE,IAAII,EAAuBrL,EAAgBQ,IAAiB,EACxD8K,EAASvG,KAAKiG,IAChBI,GAAK9K,IAAiB,EACtB8K,GAAK7K,IAAiB,EACtBP,EAAgBQ,IAAiB,EACjCR,EAAgBM,IAAiB,EACjCN,EAAgBO,IAAiB,GAEnC,OAAOwE,KAAKwG,IACV,IAKI,EAJJxG,KAAKgG,MACF,MAAQ/K,EAAgBwL,WAAa,GAAKH,GACzCC,EACA,IAGN,MAAOxJ,IAEP,OADAjE,EAAKiE,IACE,IAIXlC,EAAqB,OAAQ,WAC3B0I,GAAW2C,KACXrL,EACEO,EACA,WACMmI,GAAW2C,OAAY3C,GAAW2C,OAExChN,KAQJ,IAgCIwN,GA6BAC,GAAUC,GA7DVC,GAAU,SAAUC,GACtB,IAAI/D,EAAO,GAIX,IACEA,EAAO+D,GAAarM,EAAuBZ,EAAImJ,UAC/C,MAAOjG,IACPjE,EAAKiE,IAGP,IAAIgK,EAAyBrO,EAAOsL,IACpC,GAAI9D,GAAW6G,GACb,IACEhE,EAAOgE,EAAuBxK,KAAK7D,EAAQ,CAAEqK,KAAMA,KAAWA,EAC9D,MAAOhG,IACPF,EAAe,OAAQE,IAK3B,IAlYiB,SAAUgG,GAC3B,IAAK,IAAIiE,KAAKlD,GAAa,CACzB,IAAImD,EAAgBnD,GAAYkD,GAChC,GAAKC,EAAL,CAGA,IAAIC,EAhOI,KAiOND,EAAc,GAAcA,EAjOtB,IAiO8CA,EAEtD,GACEC,IAAenE,GACf,IAAI7D,OACF,IAAM7B,EAAY6J,GAAY3J,QAAQ,SAAU,QAAU,IAC1D,KACAvB,KAAK+G,GAEP,OAAO9J,GAEX,OAAOC,EAgXHiO,CAAapE,GAQjB,MAFY,QAARS,IAAkB3J,EAAIuN,OAAMrE,GAAQlJ,EAAIuN,KAAKpJ,MAAM,KAAK,IAErD+E,EAPLjK,EAAKuB,EAAiB,YAAc0I,IAyCpCsE,GAAW,SAAUC,EAAaC,EAAe/G,GAEnD,IAAIuC,EAAO8D,GAAQU,GAGnB,GAAKxE,GAAQuC,IAAgBvC,EAA7B,CAEAuC,GAAevC,EACflB,GAAKkB,KAAOA,EAGRhE,GAAsB,OACxB8C,GAAK2F,eACHxH,KAAKiG,IAAIhL,EAA2B,aAAK,EAAGvC,EAAO+O,YAAc,IACjE,KACF5F,GAAK6F,gBACH1H,KAAKiG,IACHhL,EAAgBQ,IAAiB,EACjC/C,EAAOiP,aAAe,IACnB,MAIL5I,GAAsB,MACpBpF,EAAIuB,KAAW2G,GAAK3G,GAAYvB,EAAIuB,IAItCe,GAAU8C,GAAsB,QAClC8C,GAAK+F,aAAe3L,EAAO4L,MAC3BhG,GAAKiG,cAAgB7L,EAAOsK,QAI9B,IAIIwB,EAJAC,EAAOtP,EAAOuP,YACdC,EAAiB,aAIrB,IACEH,EAAsBC,EAAKG,iBAAiBD,GAAgB,GAAGpF,KAC/D,MAAO/F,IACPjE,EAAKiE,IAGP6J,GAAgBmB,GAC+C,EAA3D,CAAC,SAAU,gBAAgB5E,QAAQ4E,GAGnCC,GACAA,EAAKE,KACwC,EAA7C,CAAC,EAAG,GAAG/E,QAAQ6E,EAAKE,GAAgBpF,MAGxC,IAAIsF,EAA0B5C,GAC1BA,GAASxH,MA7rBH,KA6rBgB,GACtBjF,EACJ4N,GAAWnB,IACgD,EAAvDzB,GAAmBZ,QAAQiF,IAC3BA,GAA2BrO,EAC3Bb,EAGJ2I,GAAKwG,OAASf,GAAeV,GAAgB1N,GAAYyN,GAEzDnG,EAAWD,GAAeC,EAAU,CAClCsC,KAAMzJ,EACN0J,KAAMlB,GAAKkB,OAGb,IAAIuF,EAAsB,WACxBhO,EAA2BrB,EAnGZ,SACjBqO,EACAiB,EACA5B,EACAnG,GAEI8G,GAAa5B,GAAY,GAAK9D,GAAQmD,QAAS9L,GAC/C4L,KAAoBjD,GAAQmD,QAAU1F,MAE1C,IAAImJ,EAAc/F,GAAkBoE,KAEpCpF,GAAS,CACPkE,GAAI/D,GAAQmD,QACZjC,KAAMzJ,EACNmM,UAAW+C,GAAoB5B,EAAWnB,GAAW,KACrDiD,MAAO5H,GAAe0H,GAEtB/H,SAAU7F,EAAU6F,KAGtBkG,GAAmBlB,GACnBA,GAAWgD,EAEX1M,IA6EE4M,CACEpB,EACAA,GAAeV,KAAkB7H,GAAsB,KACvD4H,GACAnG,IAIJ,GAAKlG,EAmBHgO,SAjBA,IACMjN,GAAU6E,GAAW7E,EAAOsN,sBAC9BtN,EACGsN,qBAAqB,CAAChN,EAAcC,IACpCgN,KAAK,SAAUC,GACdjH,GAAQkH,QAAUD,EAAkBlN,GACpCiG,GAAQmH,WAAaF,EAAkBjN,GACvC0M,MAEDU,SAAMV,GAETA,IAEF,MAAOW,GACPX,OAWFY,GAAMxQ,EAAOyQ,QACbC,GAAeF,GAAMA,GAAIG,UAAYtQ,EACrCuQ,GAAM5Q,EAAO6Q,cACbC,GAAgB,YAIhB7F,IAAeyF,IAAgBK,OAASH,KAqB1CJ,GAAIG,WAnBEK,GAAOR,GADiBpG,GAoBA0G,IAlBrB,WACL,IAEIvG,EAFA3E,EAAM9B,UACNmN,EAAKD,GAAK9M,MAAMgN,KAAMtL,GAY1B,OAVI4B,GAAWuJ,OACbxG,EAAQ,IAAIwG,MAAM3G,KAIlBG,EAAQhJ,EAAI4P,YAAY,UAClBC,UAAUhH,GAAM7J,EAASA,GAEjCgK,EAAMzG,UAAY8B,EAClBgL,GAAIrG,GACG0G,IAMX9O,EACE2O,GACA,WACEnC,GAAS,IAEXnO,GAGF2B,EACE,WACA,WACEwM,GAAS,IAEXnO,IAKAyK,IAAuB,QAARH,IAAkB,iBAAkB9K,GACrDmC,EACE,aACA,WACEwM,GAAS,IAEXnO,GAIAyK,GAAa0D,KAEf3O,EAAOqR,YAAc,SAAUhH,EAAMvC,GACnC6G,GAAS,EAAGtE,EAAMvC,IAQtB,IAAIwJ,GAAa,CAAC,SAAU,UAExBC,GAAY,SAAUhH,EAAOzC,EAAU0J,IACpCA,GAAehK,GAAWM,KAAW0J,EAAc1J,GAExD,IAAI2J,EAAkBjK,GAAW+C,GAC7BvB,EAAWxB,GAAWgK,GAAeA,EAAc,aACnDE,SAAmBnH,EAEvB,GAAI+G,GAAW7G,QAAQiH,GAAa,IAAMD,EAExC,OADAtN,EAAe+G,GAAmBtK,EAAY,aAAe8Q,GACtD1I,IAGT,IACE,GAAIyI,EAAiB,CACnB,IAAIE,EAAcpH,IAClB,GAAI+G,GAAW7G,eAAekH,GAAe,EAK3C,OAJAxN,EACE+G,GACAX,EAAQ,uBAAyBoH,GAE5B3I,IAETuB,EAAQoH,GAEV,MAAOtN,IAEP,OADAF,EAAe+G,GAAmB7G,IAC3B2E,IAGTuB,GAAS,GAAKA,GAAO1F,QAAQ,eAAgB,KAAKA,QAAQ,WAAY,IAEtE,IAAI+M,EAAc,CAAExH,KAAMxJ,EAAW2J,MAAOA,GACxCsH,GAAa3D,IAAiB9K,EAAQ,EAE1C0E,EAAWD,GAAeC,EAAU8J,GAEhCrH,GACFxB,GACErD,EAAOkM,EAAa,CAClB3E,GAAItG,KACJoJ,MAAO5H,IAAgB0J,GACvB/E,UACG+E,GAAa5D,KAAa5H,GAAsB,KAC7C2H,GACA,KAENlG,SAAU7F,EAAU6F,KAEtBkB,IAKF8I,GAAmB,SAAUvH,EAAOzC,EAAUkB,GAChDuI,GAAUhH,EAAOzC,EAAUkB,IAIxBhJ,EAAOkL,MACVlL,EAAOkL,IAAqB4G,IAE9B,IAAIC,GAAY/R,EAAOkL,IAGnB8G,GAAQD,IAAaA,GAAUE,EAAIF,GAAUE,EAAI,GAMrD,IAAK,IAAI1H,MAHTvK,EAAOkL,IAAqB4G,GAGVE,GACZ1N,EAAQ0N,GAAOzH,MACjBpF,MAAMC,QAAQ4M,GAAMzH,KAChBgH,GAAUrN,MAAM,KAAM8N,GAAMzH,KAC5BgH,GAAUS,GAAMzH,MAGxB,MAAOgG,IACPpQ,EAAUoQ,IA7IY,IAAUnG,GACxB4G,GAvkBkBhG,GA7M9B,CAm6BEhL,OACA,uBACA"} \ No newline at end of file +{"version":3,"file":"app.js","sources":["app.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var metadataObject = window[namespace + \"_metadata\"];\n var appendMetadata = function (metadata, data) {\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) return metadata;\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var getQueryParams = function (ignoreSource) {\n return (\n loc.search\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex).test(keyValue);\n })\n .join(\"&\") || undefinedVar\n );\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n window.phantom ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = trueVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n return (\n (doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n nav.sendBeacon(fullApiUrl + \"/append\", stringify(append));\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n metadata\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n\n sendData({\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: getQueryParams(deleteSourceInfo),\n\n metadata: stringify(metadata),\n });\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (isPushState, pathOverwrite, metadata) {\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique = isPushState || userNavigated ? falseVar : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n sendPageView(\n isPushState,\n isPushState || userNavigated || !collectMetricByString(\"r\"), // r = referrers\n sameSite,\n metadata\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n else {\n window.sa_pageview = function (path, metadata) {\n pageview(0, path, metadata);\n };\n }\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"simpleanalyticscdn.com\",\n \"queue.\",\n \"cdn_latest_11\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","protocol","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","metadataObject","appendMetadata","metadata","data","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","search","keyValue","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","indexOf","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","bot","webdriver","__nightmare","callPhantom","_phantom","phantom","__polypane","_bot","collectDataOnLeave","ua","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","i","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","e","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","callbackRaw","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue","q"],"mappings":";;CAEA,SACEA,EACAC,EACAC,EAIAC,EACAC,GAEA,IAQE,IAAIC,EAAeC,UACfC,GAAU,EACVC,GAAW,EACXC,EAAW,OACXC,EAAQ,SACRC,EAAe,WACfC,EAAY,QACZC,EAAY,QAGZC,EAAMd,EAAOe,QACbC,EAAa,aACbC,EAAMjB,EAAOkB,UACbC,EAAMnB,EAAOoB,SACbC,EAAmBF,EAAIG,KACvBC,EAAMvB,EAAOwB,SACbC,EAAYR,EAAIQ,UAChBC,EAAa,uBACbC,EAAiBD,EAAa,QAC9BE,EAA2BpB,EAC3BqB,EAAyBC,mBACzBC,EAAyBC,mBACzBC,EAAYC,KAAKD,UAEjBE,EAAuBnC,EAAOoC,iBAC9BC,EAAaC,iBAA0BpC,EACvCqC,EAAkBhB,EAAIgB,iBAAmB,GACzCC,EAAW,WACXC,EAAS,SAETC,EAAS,SACTC,EAAS1B,EAAI2B,cACbC,EAAeH,EAASD,EACxBK,EAAe,SAAWL,EAC1BM,EAAe,SAAWN,EAE1BO,EAAW,WACXC,EAAe,WACfC,EAAsB,kBACtBC,EAAU,mCACVC,EAAQ,EACRC,EACF,sBAAsBC,KAAK7B,KAAe,WAAW6B,KAAK7B,GACxD8B,EAASvD,EAAOuD,OAIhBC,EACFjC,EAAIkC,eAAiBlC,EAAImC,cAAc,gBAAkBxD,EAAU,MAOrEE,EAAO,WAEL,IAAIuD,EAAO,GAAGC,MAAMC,KAAKC,WAOzB,OAJAH,EAAKI,QAAQ,qBAINC,SAASC,UAAUC,MAAML,KAAK/C,EAAIV,KAAMU,EAAK6C,IAGtD,IAAIQ,EAAiB,SAAUC,EAAMC,GACnCjE,EAAK,iBAAmBgE,EAAO,aAAcC,IAG3CC,EAAU,SAAUC,EAAKC,GAC3B,OAAOC,OAAOR,UAAUS,eAAeb,KAAKU,EAAKC,IAO/CG,EAAc,SAAUC,GAC1B,OAAOA,EAAKC,QAAQ,sBAAuB,SAGzCC,EAAO,SAAUtB,EAAeuB,GAClC,OAAOvB,GAAiBA,EAAcwB,aAAa,QAAUD,IAG3DE,EAA+B,SAAUC,GAC3C,OAAOC,MAAMC,QAAQF,GACjBA,EAboB,iBAcXA,GAAQA,EAAIG,OACnBH,EAAII,MAAM,OACV,IAGJC,EAAW,SAAUC,GACvB,OAAOA,GAAUA,EAAOC,cAAgBhB,QAGtCiB,EAAS,WAGX,IAFA,IAAIC,EAAK,GACLC,EAAM9B,UACD+B,EAAQ,EAAGA,EAAQD,EAAIP,OAAQQ,IAAS,CAC/C,IAAIC,EAAaF,EAAIC,GACrB,GAAIN,EAASO,GACX,IAAK,IAAIC,KAAWD,EACdxB,EAAQwB,EAAYC,KACtBJ,EAAGI,GAAWD,EAAWC,IAKjC,OAAOJ,GAGLK,EAAWhG,EAAOiG,YAClBC,EAAcF,GAAYvB,OAAO0B,KAAKlG,GAAkBoF,OAG5DpF,EAAmByF,EAAOzF,EAAkB+F,GAExCE,GAAa9F,EAAK,WAAYH,GAGlC,IAAImG,EAAgBnB,EAClBhF,EAAiBmG,eAAiBtB,EAAKtB,EAAe,mBAGpD6C,GAAwB,SAAUC,GAEpC,OAGgB,IAFdF,EAAcG,OAAO,SAAU3B,GAC7B,OAAO,IAAI4B,OAAO,IAAMF,GAAoBhD,KAAKsB,KAChDS,QAIHoB,GAAMC,KAAKD,IAEXE,GAAO,WACT,IAAIC,EAAe5G,EAAO6G,QAAU7G,EAAO8G,SACvCC,EAAY,CAAC,MAAQ,KAAO,KAAO,KAAO,KAC1CC,EAAY,SAEhB,IACE,OAAOD,EAAUlC,QAAQmC,EAAW,SAAUC,GAC5C,OACEA,EACCL,EAAaM,gBAAgB,IAAIC,WAAW,IAAI,GAC9C,IAAOF,EAAI,GACdG,SAAS,MAEb,MAAO/C,GACP,OAAO0C,EAAUlC,QAAQmC,EAAW,SAAUC,GAC5C,IAAII,EAAqB,GAAhBC,KAAKC,SAAiB,EAE/B,OADMN,EAAI,EAAII,EAAS,EAAJA,EAAW,GACrBD,SAAS,QAKpBI,GAAa,SAAUC,GACzB,MAAsB,mBAARA,GAIZC,GAAgB,YAChBC,GACF1H,EAAiByH,KACjB5C,EAAKtB,EAAekE,KA6uBxB,KA1uBME,GAAiB5H,EAAO2H,GAAY,aACpCE,GAAiB,SAAUC,EAAUC,GACnCxC,EAASqC,MAAiBE,EAAWpC,EAAOoC,EAAUF,KAC1D,IAAII,EAA4BhI,EAAOiI,IACvC,IAAKT,GAAWQ,GAA4B,OAAOF,EACnD,IACE,OAAOpC,EACLoC,EACAE,EAA0BnE,KAAK7D,EAAQ0F,EAAOoC,EAAUC,KAE1D,MAAO1D,GACPF,EAAe,WAAYE,KAU3B6D,GACFjI,EAAiBiI,WACjBpD,EAAKtB,EAAe,eAAiB/C,EAEnC0H,GAAiB,SAAUC,GAC7B,OACEjH,EAAIkH,OACDzE,MAAM,GACN0B,MAAM,KACNiB,OAAO,SAAU+B,GAChB,IAAIC,EAASH,IAAiB/B,GAAsB,MAEhDmC,EAAkBC,GAAYC,IAAI/D,GAAagE,KAAK,KACpDC,EAAQL,EACR,KAAOC,EAAkB,KACzB,YACCN,GAAY,GAAK,KAClB,yCACCA,GAAY,GAAK,QAClB,IACAM,EACA,KACJ,OAAID,IAAWE,GAAYpD,OAAe7E,EAInC,IAAIgG,OAAOoC,GAAOtF,KAAKgF,KAE/BK,KAAK,MAAQtI,GAgChBwI,GAAiBlB,GAAY,UACjC,GAAI3H,EAAO6I,KAAmBtI,EAAS,OAAOH,EAAKsB,EAAa,SAChE1B,EAAO8I,gBAAkBvI,EACzBP,EAAO6I,IAAkBtI,EAOzB,IAAIwI,GAAW,SAAUhB,EAAMiB,EAAUC,GACvClB,EAAOkB,EAAelB,EAAOrC,EAAOwD,GAASC,GAAMpB,GAE/C9G,EAAImI,QAAUH,IAAclB,EAAKqB,MAAQ7I,GACzCU,EAAIoI,qBAAuBJ,IAAclB,EAAKuB,KAAO/I,GAGzD,IAAIgJ,EAAQ,IAAIC,MACZR,IACFO,EAAME,QAAUT,EAChBO,EAAMG,OAASV,GAEjBO,EAAMI,IACJtH,EACA,eACAoC,OAAO0B,KAAK4B,GACTxB,OAAO,SAAUqD,GAChB,OAAO7B,EAAK6B,IAAQvJ,IAErBqI,IAAI,SAAUkB,GACb,OACE/H,EAAuB+H,GACvB,IACA/H,EAAuBkG,EAAK6B,MAG/BjB,KAAK,KACR,SACAjC,KAAKD,OAILoD,GACF5J,EAAiB6J,UAAYhF,EAAKtB,EAAe,YAC/CuG,GAAkBF,IAAuBxI,EAEzC2I,GAAc,CAChBC,QAymBJ,gBAxmBIH,SAAUC,IASZ5J,EAAY,SAAU+J,GACpBA,EAAiBA,EAAeC,MAC5BD,EAAiB,IAAMA,EAAeC,MACtCD,EACJ9J,EAAK8J,GACLnB,GACErD,EAAOsE,GAAa,CAClBI,KAAMvJ,EACNwD,MAAO6F,EACPG,KAAMlJ,EAAImJ,WAEZjK,EACAE,IAMJ4B,EACEtB,EACA,SAAU0J,GACJA,EAAMC,WAA+C,EAAnCD,EAAMC,SAASC,QAAQvK,IAC3CC,EAAUoK,EAAMG,UAGpBlK,GAOF,IAwDImK,GAxDAC,GAAQnE,KAERoE,GAAW,EAOXC,GAAO7K,EAAiB6K,MAAQhG,EAAKtB,EAAe,QAGpDuH,MAvKsBC,GAuKC/K,EAAiB8K,cAtKvBC,GAuKjB/K,EAAiB8K,WACjBjG,EAAKtB,EAAe,eAAiB/C,GACrCqE,EAAKtB,EAAe,aAAe/C,GACnCqE,EAAKtB,EAAe,gBAAkB/C,EAGtCwK,KACqC,SAAvCnG,EAAKtB,EAAe,iBACpBvD,EAAiBgL,cAAgBzK,GAI/B0K,GACFjL,EAAiBkL,UACjBrG,EAAKtB,EAAe,cACpBmE,GAAY,IAAM/G,EAGhBwK,GAAcnG,EAChBhF,EAAiBmL,aAAetG,EAAKtB,EAAe,iBAIlDiF,GAAcxD,EAChBhF,EAAiBwI,aAAe3D,EAAKtB,EAAe,iBAIlD6H,GAAqBpG,EACvBhF,EAAiBoL,oBACfvG,EAAKtB,EAAe,yBAIpB8H,GACFrL,EAAiBqL,gBAAkBxG,EAAKtB,EAAe,mBAGrDyE,GACFhI,EAAiBgI,mBACjBnD,EAAKtB,EAAe,sBAItB,IAEEmH,GAAWtE,GAAsB,KAC7BkF,KAAKC,iBAAiBC,kBAAkBC,SACxCrL,EACJ,MAAOgE,IACPjE,EAAKiE,IAOP,IAAIsH,GACF1K,EAAI2K,WACJ5L,EAAO6L,aACP7L,EAAO8L,aACP9L,EAAO+L,UACP/L,EAAOgM,SACPhM,EAAOiM,YACPjM,EAAOkM,MACP7I,GACAiE,KAAKC,UAAYD,KAAKC,SAGpB4E,GACF9F,GAAsB,MAAQA,GAAsB,QAElDsF,KAAK3B,GAAY2B,IAAMpL,GAE3B,IAAI2I,GAAUxD,EAAOsE,GAAa,CAEhCoC,GAAI/F,GAAsB,MAAQ5E,EAAYpB,EAE9CK,MAAOS,EAAImB,UAAY5B,EACvBiK,SAAUA,GACV0B,QAASF,GAAqBxF,KAAStG,EAGvCiM,WAAYjG,GAAsB,MAAQM,KAAStG,IA0BrD,GAvBA6I,GAAQqD,IAAMhM,EAIVoC,IACFuG,GAAQsD,OAAS7J,EAAO6J,OACxBtD,GAAQuD,OAASxK,EAAUU,EAAO8J,SAS/BlL,EAAImL,SAAStM,EAAK,4CAInB2J,KAAoB1I,IACtB6H,GAAQyD,kBAAoBtL,IAGzB0J,IAAc/J,KAAcC,GAA0B,KAAnBA,EAAID,GAC1C,OAAOZ,EACLuB,EAAiBX,EAAa,oBAAsBmC,EAAU,SAK7B,GAAlC9B,EAAiBoJ,QAAQ,OACxB,aAAanH,KAAKjC,IACnBwI,IAEDzJ,EACE,mBACEiB,EACA,SACA8B,EACA,0BAON,IACIyJ,GAiDAC,GAlDA1D,GAAO,GAaP2D,IARCvL,EAAIuL,UAAY,IACdjI,QAAQxD,EAAkB0I,IAC1BlF,QAAQ,sDAAuD,MAC/DA,QAAQ,YAAa,OAASxE,EAYjC0M,GAAW,EAEXC,GAAc,SAAUC,EAAIC,GAC9B,IAEIC,EAFChB,KAEDgB,EAASzH,EAAOsE,GAAa,CAC/BI,KAAM,SACNgD,YAAaF,EAAOD,EAAK/D,GAAQmD,UAI/BhG,GAAsB,OACxB8G,EAAOE,SAAW/F,KAAKgG,OAAO7G,KAAQmE,GAAQmC,IAhfnC,MAkfbA,GAAW,EACXnC,GAAQnE,KAGJJ,GAAsB,UACxB8G,EAAOtC,SAAWvD,KAAKiG,IAAI,EAAG1C,GAAU2C,OAGtCN,IAASjM,EAAIwM,WAEf1E,GAASoE,EAAQ9M,EAAcE,GAE/BU,EAAIwM,WAAWpL,EAAa,UAAWJ,EAAUkL,MAKrDhL,EACE,mBACA,WACMZ,EAAImM,QACA,KAAO1K,KAAYhD,GAASgN,KAClCH,GAAcpG,MACTsG,IAAYtG,KAAQoG,IAE7BrM,GAGF2B,EAAqBa,EAAUgK,GAAaxM,GAE5C,IAAImN,GAAOpM,EAAIoM,MAAQ,GACnBH,GAAW,WACb,IACE,IAAII,EAAuBrL,EAAgBQ,IAAiB,EACxD8K,EAASvG,KAAKiG,IAChBI,GAAK9K,IAAiB,EACtB8K,GAAK7K,IAAiB,EACtBP,EAAgBQ,IAAiB,EACjCR,EAAgBM,IAAiB,EACjCN,EAAgBO,IAAiB,GAEnC,OAAOwE,KAAKwG,IACV,IAKI,EAJJxG,KAAKgG,MACF,MAAQ/K,EAAgBwL,WAAa,GAAKH,GACzCC,EACA,IAGN,MAAOxJ,IAEP,OADAjE,EAAKiE,IACE,IAIXlC,EAAqB,OAAQ,WAC3B0I,GAAW2C,KACXrL,EACEO,EACA,WACMmI,GAAW2C,OAAY3C,GAAW2C,OAExChN,KAQJ,IAgCIwN,GA6BAC,GAAUC,GA7DVC,GAAU,SAAUC,GACtB,IAAI/D,EAAO,GAIX,IACEA,EAAO+D,GAAarM,EAAuBZ,EAAImJ,UAC/C,MAAOjG,IACPjE,EAAKiE,IAGP,IAAIgK,EAAyBrO,EAAOsL,IACpC,GAAI9D,GAAW6G,GACb,IACEhE,EAAOgE,EAAuBxK,KAAK7D,EAAQ,CAAEqK,KAAMA,KAAWA,EAC9D,MAAOhG,IACPF,EAAe,OAAQE,IAK3B,IAlYiB,SAAUgG,GAC3B,IAAK,IAAIiE,KAAKlD,GAAa,CACzB,IAAImD,EAAgBnD,GAAYkD,GAChC,GAAKC,EAAL,CAGA,IAAIC,EAhOI,KAiOND,EAAc,GAAcA,EAjOtB,IAiO8CA,EAEtD,GACEC,IAAenE,GACf,IAAI7D,OACF,IAAM7B,EAAY6J,GAAY3J,QAAQ,SAAU,QAAU,IAC1D,KACAvB,KAAK+G,GAEP,OAAO9J,GAEX,OAAOC,EAgXHiO,CAAapE,GAQjB,MAFY,QAARS,IAAkB3J,EAAIuN,OAAMrE,GAAQlJ,EAAIuN,KAAKpJ,MAAM,KAAK,IAErD+E,EAPLjK,EAAKuB,EAAiB,YAAc0I,IAyCpCsE,GAAW,SAAUC,EAAaC,EAAe/G,GAEnD,IAAIuC,EAAO8D,GAAQU,GAGnB,GAAKxE,GAAQuC,IAAgBvC,EAA7B,CAEAuC,GAAevC,EACflB,GAAKkB,KAAOA,EAGRhE,GAAsB,OACxB8C,GAAK2F,eACHxH,KAAKiG,IAAIhL,EAA2B,aAAK,EAAGvC,EAAO+O,YAAc,IACjE,KACF5F,GAAK6F,gBACH1H,KAAKiG,IACHhL,EAAgBQ,IAAiB,EACjC/C,EAAOiP,aAAe,IACnB,MAIL5I,GAAsB,MACpBpF,EAAIuB,KAAW2G,GAAK3G,GAAYvB,EAAIuB,IAItCe,GAAU8C,GAAsB,QAClC8C,GAAK+F,aAAe3L,EAAO4L,MAC3BhG,GAAKiG,cAAgB7L,EAAOsK,QAI9B,IAIIwB,EAJAC,EAAOtP,EAAOuP,YACdC,EAAiB,aAIrB,IACEH,EAAsBC,EAAKG,iBAAiBD,GAAgB,GAAGpF,KAC/D,MAAO/F,IACPjE,EAAKiE,IAGP6J,GAAgBmB,GAC+C,EAA3D,CAAC,SAAU,gBAAgB5E,QAAQ4E,GAGnCC,GACAA,EAAKE,KACwC,EAA7C,CAAC,EAAG,GAAG/E,QAAQ6E,EAAKE,GAAgBpF,MAGxC,IAAIsF,EAA0B5C,GAC1BA,GAASxH,MA7rBH,KA6rBgB,GACtBjF,EACJ4N,GAAWnB,IACgD,EAAvDzB,GAAmBZ,QAAQiF,IAC3BA,GAA2BrO,EAC3Bb,EAGJ2I,GAAKwG,OAASf,GAAeV,GAAgB1N,GAAYyN,GAEzDnG,EAAWD,GAAeC,EAAU,CAClCsC,KAAMzJ,EACN0J,KAAMlB,GAAKkB,OAGb,IAAIuF,EAAsB,WACxBhO,EAA2BrB,EAnGZ,SACjBqO,EACAiB,EACA5B,EACAnG,GAEI8G,GAAa5B,GAAY,GAAK9D,GAAQmD,QAAS9L,GAC/C4L,KAAoBjD,GAAQmD,QAAU1F,MAE1C,IAAImJ,EAAc/F,GAAkBoE,KAEpCpF,GAAS,CACPkE,GAAI/D,GAAQmD,QACZjC,KAAMzJ,EACNmM,UAAW+C,GAAoB5B,EAAWnB,GAAW,KACrDiD,MAAO5H,GAAe0H,GAEtB/H,SAAU7F,EAAU6F,KAGtBkG,GAAmBlB,GACnBA,GAAWgD,EAEX1M,IA6EE4M,CACEpB,EACAA,GAAeV,KAAkB7H,GAAsB,KACvD4H,GACAnG,IAIJ,GAAKlG,EAmBHgO,SAjBA,IACMjN,GAAU6E,GAAW7E,EAAOsN,sBAC9BtN,EACGsN,qBAAqB,CAAChN,EAAcC,IACpCgN,KAAK,SAAUC,GACdjH,GAAQkH,QAAUD,EAAkBlN,GACpCiG,GAAQmH,WAAaF,EAAkBjN,GACvC0M,MAEDU,SAAMV,GAETA,IAEF,MAAOW,GACPX,OAWFY,GAAMxQ,EAAOyQ,QACbC,GAAeF,GAAMA,GAAIG,UAAYtQ,EACrCuQ,GAAM5Q,EAAO6Q,cACbC,GAAgB,YAIhB7F,IAAeyF,IAAgBK,OAASH,KAqB1CJ,GAAIG,WAnBEK,GAAOR,GADiBpG,GAoBA0G,IAlBrB,WACL,IAEIvG,EAFA3E,EAAM9B,UACNmN,EAAKD,GAAK9M,MAAMgN,KAAMtL,GAY1B,OAVI4B,GAAWuJ,OACbxG,EAAQ,IAAIwG,MAAM3G,KAIlBG,EAAQhJ,EAAI4P,YAAY,UAClBC,UAAUhH,GAAM7J,EAASA,GAEjCgK,EAAMzG,UAAY8B,EAClBgL,GAAIrG,GACG0G,IAMX9O,EACE2O,GACA,WACEnC,GAAS,IAEXnO,GAGF2B,EACE,WACA,WACEwM,GAAS,IAEXnO,IAKAyK,IAAuB,QAARH,IAAkB,iBAAkB9K,GACrDmC,EACE,aACA,WACEwM,GAAS,IAEXnO,GAIAyK,GAAa0D,KAEf3O,EAAOqR,YAAc,SAAUhH,EAAMvC,GACnC6G,GAAS,EAAGtE,EAAMvC,IAQtB,IAAIwJ,GAAa,CAAC,SAAU,UAExBC,GAAY,SAAUhH,EAAOzC,EAAU0J,IACpCA,GAAehK,GAAWM,KAAW0J,EAAc1J,GAExD,IAAI2J,EAAkBjK,GAAW+C,GAC7BvB,EAAWxB,GAAWgK,GAAeA,EAAc,aACnDE,SAAmBnH,EAEvB,GAAI+G,GAAW7G,QAAQiH,GAAa,IAAMD,EAExC,OADAtN,EAAe+G,GAAmBtK,EAAY,aAAe8Q,GACtD1I,IAGT,IACE,GAAIyI,EAAiB,CACnB,IAAIE,EAAcpH,IAClB,GAAI+G,GAAW7G,eAAekH,GAAe,EAK3C,OAJAxN,EACE+G,GACAX,EAAQ,uBAAyBoH,GAE5B3I,IAETuB,EAAQoH,GAEV,MAAOtN,IAEP,OADAF,EAAe+G,GAAmB7G,IAC3B2E,IAGTuB,GAAS,GAAKA,GAAO1F,QAAQ,eAAgB,KAAKA,QAAQ,WAAY,IAEtE,IAAI+M,EAAc,CAAExH,KAAMxJ,EAAW2J,MAAOA,GACxCsH,GAAa3D,IAAiB9K,EAAQ,EAE1C0E,EAAWD,GAAeC,EAAU8J,GAEhCrH,GACFxB,GACErD,EAAOkM,EAAa,CAClB3E,GAAItG,KACJoJ,MAAO5H,IAAgB0J,GACvB/E,UACG+E,GAAa5D,KAAa5H,GAAsB,KAC7C2H,GACA,KAENlG,SAAU7F,EAAU6F,KAEtBkB,IAKF8I,GAAmB,SAAUvH,EAAOzC,EAAUkB,GAChDuI,GAAUhH,EAAOzC,EAAUkB,IAIxBhJ,EAAOkL,MACVlL,EAAOkL,IAAqB4G,IAE9B,IAAIC,GAAY/R,EAAOkL,IAGnB8G,GAAQD,IAAaA,GAAUE,EAAIF,GAAUE,EAAI,GAMrD,IAAK,IAAI1H,MAHTvK,EAAOkL,IAAqB4G,GAGVE,GACZ1N,EAAQ0N,GAAOzH,MACjBpF,MAAMC,QAAQ4M,GAAMzH,KAChBgH,GAAUrN,MAAM,KAAM8N,GAAMzH,KAC5BgH,GAAUS,GAAMzH,MAGxB,MAAOgG,IACPpQ,EAAUoQ,IA7IY,IAAUnG,GACxB4G,GAvkBkBhG,GA7M9B,CAm6BEhL,OACA,uBACA"} \ No newline at end of file diff --git a/dist/v11/auto-events.js b/dist/v11/auto-events.js index 3f5ff6ee..451495d7 100644 --- a/dist/v11/auto-events.js +++ b/dist/v11/auto-events.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy friendly analytics (docs.simpleanalytics.com/script; 2023-05-03; 19c1; SRI-version; v11) */ +/* Simple Analytics - Privacy friendly analytics (docs.simpleanalytics.com/script; 2026-08-17; 5dd7; SRI-version; v11) */ -function r(t,e){var a,o=!1;h.downloads&&/^https?:\/\//i.test(t.href)&&new RegExp("\\.("+(h.downloadsExtensions||[]).join("|")+")$","i").test(t.pathname)?o="download":h.outbound&&/^https?:\/\//i.test(t.href)&&t.hostname!==m.location.hostname?o="outbound":h.emails&&/^mailto:/i.test(t.href)&&(o="email"),o&&(e?(a="saAutomatedLink(this, '"+o+"');",t.hasAttribute("target")&&"_self"!==t.getAttribute("target")||(a+=" return false;"),t.setAttribute("onclick",a)):t.addEventListener("click",function(t){saAutomatedLink(t.target,o)}))}function e(){try{for(var t=document.getElementsByTagName("a"),e=0;e -1,\n emails: collectTypes.indexOf(\"emails\") > -1,\n downloads: collectTypes.indexOf(\"downloads\") > -1,\n // Downloads: enter file extensions you want to collect\n downloadsExtensions: setting(\"extensions\", \"array\", [\n \"pdf\",\n \"csv\",\n \"docx\",\n \"xlsx\",\n \"zip\",\n \"doc\",\n \"xls\",\n ]),\n\n // All: use title attribute if set for event name (for all events)\n // THIS TAKES PRECEDENCE OVER OTHER SETTINGS BELOW\n title: setting(\"useTitle\", \"bool\", true),\n // Outbound: use full URL of the links? false for just the hostname\n outboundFullUrl: fullUrls,\n // Downloads: if taking event name from URL, use full URL or just filename (default)\n downloadsFullUrl: fullUrls,\n };\n\n var saGlobal = setting(\"saGlobal\", \"string\", \"sa_event\");\n\n // For compiling the script\n var optionsLink = options;\n\n if (typeof optionsLink === \"undefined\")\n log(\"options object not found, please specify\", \"warn\");\n\n window.saAutomatedLink = function saAutomatedLink(element, type) {\n try {\n if (!element) return log(\"no element found\");\n var sent = false;\n\n var callback = function () {\n if (!sent && !element.hasAttribute(\"target\"))\n document.location = element.getAttribute(\"href\");\n sent = true;\n };\n\n if (window[saGlobal] && window[saGlobal + \"_loaded\"]) {\n var hostname = element.hostname;\n var pathname = element.pathname;\n\n var event;\n var metadata = {\n title: element.getAttribute(\"title\") || undefined,\n };\n var url = element.href || undefined;\n\n var useTitle = false;\n if (optionsLink.title && element.hasAttribute(\"title\")) {\n var theTitle = element.getAttribute(\"title\").trim();\n if (theTitle != \"\") useTitle = true;\n }\n\n if (useTitle) {\n event = theTitle;\n } else {\n switch (type) {\n case \"outbound\": {\n event = hostname + (optionsLink.outboundFullUrl ? pathname : \"\");\n metadata.url = url;\n break;\n }\n case \"download\": {\n event = optionsLink.downloadsFullUrl\n ? hostname + pathname\n : pathname.split(\"/\").pop();\n metadata.url = url;\n break;\n }\n case \"email\": {\n var href = element.getAttribute(\"href\");\n event = (href.split(\":\")[1] || \"\").split(\"?\")[0];\n metadata.email = event;\n break;\n }\n }\n }\n\n var clean =\n type +\n \"_\" +\n event.replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_+|_+$)/g, \"\");\n\n window[saGlobal](clean, metadata, callback);\n\n log(\"collected \" + clean);\n\n return type === \"email\"\n ? callback()\n : window.setTimeout(callback, 5000);\n } else {\n log(saGlobal + \" is not defined\", \"warn\");\n return callback();\n }\n } catch (error) {\n log(error.message, \"warn\");\n }\n };\n\n function collectLink(link, onclick) {\n var collect = false;\n\n // Collect download clicks\n if (\n optionsLink.downloads &&\n /^https?:\\/\\//i.test(link.href) &&\n new RegExp(\n \"\\\\.(\" + (optionsLink.downloadsExtensions || []).join(\"|\") + \")$\",\n \"i\"\n ).test(link.pathname)\n ) {\n collect = \"download\";\n\n // Collect outbound links clicks\n } else if (\n optionsLink.outbound &&\n /^https?:\\/\\//i.test(link.href) &&\n link.hostname !== window.location.hostname\n ) {\n collect = \"outbound\";\n\n // Collect email clicks\n } else if (optionsLink.emails && /^mailto:/i.test(link.href)) {\n collect = \"email\";\n }\n\n if (!collect) return;\n\n if (onclick) {\n var onClickAttribute = \"saAutomatedLink(this, '\" + collect + \"');\";\n\n if (\n !link.hasAttribute(\"target\") ||\n link.getAttribute(\"target\") === \"_self\"\n )\n onClickAttribute += \" return false;\";\n\n link.setAttribute(\"onclick\", onClickAttribute);\n } else {\n link.addEventListener(\"click\", function (element) {\n saAutomatedLink(element.target, collect);\n });\n }\n }\n\n function onDOMContentLoaded() {\n try {\n var a = document.getElementsByTagName(\"a\");\n\n // Loop over all links on the page\n for (var i = 0; i < a.length; i++) {\n var link = a[i];\n var href = link.getAttribute(\"href\");\n\n // Skip links that don't have an href\n if (!href) continue;\n\n // We don't want to overwrite website behaviour so we check for the onclick attribute\n if (!link.getAttribute(\"onclick\") && !/^mailto:/.test(href)) {\n collectLink(link, true);\n } else {\n collectLink(link, false);\n }\n }\n } catch (error) {\n log(error.message, \"warn\");\n }\n }\n\n if (doc.readyState === \"ready\" || doc.readyState === \"complete\") {\n onDOMContentLoaded();\n } else {\n document.addEventListener(\"readystatechange\", function (event) {\n if (event.target.readyState === \"complete\") onDOMContentLoaded();\n });\n }\n})(window);\n"],"names":["collectLink","link","onclick","onClickAttribute","collect","optionsLink","downloads","test","href","RegExp","downloadsExtensions","join","pathname","outbound","hostname","window","location","emails","hasAttribute","getAttribute","setAttribute","addEventListener","element","saAutomatedLink","target","onDOMContentLoaded","a","document","getElementsByTagName","i","length","error","log","message","doc","scriptElement","setting","collectTypes","fullUrls","options","saGlobal","type","logger","console","warn","info","currentScript","querySelector","attribute","defaultValue","value","dataset","split","map","item","trim","filter","Boolean","indexOf","title","outboundFullUrl","downloadsFullUrl","sent","callback","theTitle","metadata","undefined","url","useTitle","event","pop","email","clean","replace","setTimeout","readyState"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"auto-events.source.js","sources":["auto-events.source.js"],"sourcesContent":["(function saAutomatedEvents(window) {\n // Skip server side rendered pages\n if (typeof window === \"undefined\") return;\n\n var log = function (message, type) {\n var logger = type === \"warn\" ? console.warn : console.info;\n return logger && logger(\"Simple Analytics auto events:\", message);\n };\n\n var doc = window.document;\n\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"auto-events.js\"]');\n\n var setting = function (attribute, type, defaultValue) {\n var value = scriptElement && scriptElement.dataset[attribute];\n\n // Booleans\n if (type === \"bool\" && (value === \"true\" || value === \"false\"))\n return value === \"true\";\n else if (type === \"bool\") return defaultValue;\n\n // Arrays\n if (type === \"array\" && value)\n return value\n .split(\",\")\n .map(function (item) {\n return item.trim();\n })\n .filter(Boolean);\n else if (type === \"array\") return defaultValue;\n\n return value || defaultValue;\n };\n\n var collectTypes = setting(\"collect\", \"array\", [\n \"outbound\",\n \"emails\",\n \"downloads\",\n ]);\n var fullUrls = setting(\"fullUrls\", \"bool\", false);\n\n var options = {\n // What to collect\n outbound: collectTypes.indexOf(\"outbound\") > -1,\n emails: collectTypes.indexOf(\"emails\") > -1,\n downloads: collectTypes.indexOf(\"downloads\") > -1,\n // Downloads: enter file extensions you want to collect\n downloadsExtensions: setting(\"extensions\", \"array\", [\n \"pdf\",\n \"csv\",\n \"docx\",\n \"xlsx\",\n \"zip\",\n \"doc\",\n \"xls\",\n ]),\n\n // All: use title attribute if set for event name (for all events)\n // THIS TAKES PRECEDENCE OVER OTHER SETTINGS BELOW\n title: setting(\"useTitle\", \"bool\", true),\n // Outbound: use full URL of the links? false for just the hostname\n outboundFullUrl: fullUrls,\n // Downloads: if taking event name from URL, use full URL or just filename (default)\n downloadsFullUrl: fullUrls,\n };\n\n var saGlobal = setting(\"saGlobal\", \"string\", \"sa_event\");\n\n // For compiling the script\n var optionsLink = options;\n\n if (typeof optionsLink === \"undefined\")\n log(\"options object not found, please specify\", \"warn\");\n\n window.saAutomatedLink = function saAutomatedLink(element, type) {\n try {\n if (!element) return log(\"no element found\");\n var sent = false;\n\n var callback = function () {\n if (\n !sent &&\n (!element.hasAttribute(\"target\") ||\n element.getAttribute(\"target\") === \"_self\")\n )\n document.location = element.getAttribute(\"href\");\n sent = true;\n };\n\n if (window[saGlobal] && window[saGlobal + \"_loaded\"]) {\n var hostname = element.hostname;\n var pathname = element.pathname;\n\n var event;\n var metadata = {\n title: element.getAttribute(\"title\") || undefined,\n };\n var url = element.href || undefined;\n\n var useTitle = false;\n if (optionsLink.title && element.hasAttribute(\"title\")) {\n var theTitle = element.getAttribute(\"title\").trim();\n if (theTitle != \"\") useTitle = true;\n }\n\n if (useTitle) {\n event = theTitle;\n } else {\n switch (type) {\n case \"outbound\": {\n event = hostname + (optionsLink.outboundFullUrl ? pathname : \"\");\n metadata.url = url;\n break;\n }\n case \"download\": {\n event = optionsLink.downloadsFullUrl\n ? hostname + pathname\n : pathname.split(\"/\").pop();\n metadata.url = url;\n break;\n }\n case \"email\": {\n var href = element.getAttribute(\"href\");\n event = (href.split(\":\")[1] || \"\").split(\"?\")[0];\n metadata.email = event;\n break;\n }\n }\n }\n\n var clean =\n type +\n \"_\" +\n event.replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_+|_+$)/g, \"\");\n\n window[saGlobal](clean, metadata, callback);\n\n log(\"collected \" + clean);\n\n return type === \"email\"\n ? callback()\n : window.setTimeout(callback, 5000);\n } else {\n log(saGlobal + \" is not defined\", \"warn\");\n return callback();\n }\n } catch (error) {\n log(error.message, \"warn\");\n }\n };\n\n function collectLink(link, onclick) {\n var collect = false;\n\n // Collect download clicks\n if (\n optionsLink.downloads &&\n /^https?:\\/\\//i.test(link.href) &&\n new RegExp(\n \"\\\\.(\" + (optionsLink.downloadsExtensions || []).join(\"|\") + \")$\",\n \"i\"\n ).test(link.pathname)\n ) {\n collect = \"download\";\n\n // Collect outbound links clicks\n } else if (\n optionsLink.outbound &&\n /^https?:\\/\\//i.test(link.href) &&\n link.hostname !== window.location.hostname\n ) {\n collect = \"outbound\";\n\n // Collect email clicks\n } else if (optionsLink.emails && /^mailto:/i.test(link.href)) {\n collect = \"email\";\n }\n\n if (!collect) return;\n\n if (onclick) {\n var onClickAttribute = \"saAutomatedLink(this, '\" + collect + \"');\";\n\n if (\n !link.hasAttribute(\"target\") ||\n link.getAttribute(\"target\") === \"_self\"\n )\n onClickAttribute += \" return false;\";\n\n link.setAttribute(\"onclick\", onClickAttribute);\n } else {\n link.addEventListener(\"click\", function () {\n saAutomatedLink(this, collect);\n });\n }\n }\n\n function onDOMContentLoaded() {\n try {\n var a = document.getElementsByTagName(\"a\");\n\n // Loop over all links on the page\n for (var i = 0; i < a.length; i++) {\n var link = a[i];\n var href = link.getAttribute(\"href\");\n\n // Skip links that don't have an href\n if (!href) continue;\n\n // We don't want to overwrite website behaviour so we check for the onclick attribute\n if (!link.getAttribute(\"onclick\") && !/^mailto:/.test(href)) {\n collectLink(link, true);\n } else {\n collectLink(link, false);\n }\n }\n } catch (error) {\n log(error.message, \"warn\");\n }\n }\n\n if (doc.readyState === \"ready\" || doc.readyState === \"complete\") {\n onDOMContentLoaded();\n } else {\n document.addEventListener(\"readystatechange\", function (event) {\n if (event.target.readyState === \"complete\") onDOMContentLoaded();\n });\n }\n})(window);\n"],"names":["collectLink","link","onclick","onClickAttribute","collect","optionsLink","downloads","test","href","RegExp","downloadsExtensions","join","pathname","outbound","hostname","window","location","emails","hasAttribute","getAttribute","setAttribute","addEventListener","saAutomatedLink","this","onDOMContentLoaded","a","document","getElementsByTagName","i","length","error","log","message","doc","scriptElement","setting","collectTypes","fullUrls","options","saGlobal","type","logger","console","warn","info","currentScript","querySelector","attribute","defaultValue","value","dataset","split","map","item","trim","filter","Boolean","indexOf","title","outboundFullUrl","downloadsFullUrl","element","sent","callback","theTitle","metadata","undefined","url","useTitle","event","pop","email","clean","replace","setTimeout","readyState","target"],"mappings":"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"} \ No newline at end of file diff --git a/dist/v11/custom/app.js b/dist/v11/custom/app.js index cd85c13f..bbb0adbf 100644 --- a/dist/v11/custom/app.js +++ b/dist/v11/custom/app.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy friendly analytics (docs.simpleanalytics.com/script; 2023-05-03; 120c; SRI-version; v11) */ +/* Simple Analytics - Privacy friendly analytics (docs.simpleanalytics.com/script; 2026-08-17; 23d3; SRI-version; v11) */ !function(l,t,e,n,p){try{var h=undefined,f=!0,d=!1,r="true",a="https:",m="pageview",u="event",i="error",o=l.console,c="doNotTrack",g=l.navigator,s=l.location,v=s.host,y=l.document,_=g.userAgent,w="Not sending request ",b=w+"when ",E=d,O=encodeURIComponent,x=decodeURIComponent,S=JSON.stringify,M=l.addEventListener,k="https://"+e,A=y.documentElement||{},q="language",$="Height",j="scroll",D=g.userAgentData,C=j+$,H="offset"+$,R="client"+$,P="pagehide",T="platform",U="platformVersion",I="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(_)&&!/(cubot)/i.test(_),N=l.screen,z=y.currentScript||y.querySelector('script[src*="'+e+'"]');p=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){p("Error in your "+t+" function:",e)},W=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},G=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},J=function(t,e){return t&&t.getAttribute("data-"+e)},L=function(t){return Array.isArray(t)?t:"string"==typeof t&&t.length?t.split(/, ?/):[]},Y=function(t){return t&&t.constructor===Object},Z=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},rt=function(t){return"function"==typeof t},at="namespace",it=t[at]||J(z,at)||"sa",ot=l[it+"_metadata"],ct=function(t,e){Y(ot)&&(t=Z(t,ot));var n=l[Mt];if(!rt(n))return t;try{return Z(t,n.call(l,Z(t,e)))}catch(r){F("metadata",r)}},st=t.strictUtm||J(z,"strict-utm")==r,ut=function(a){return s.search.slice(1).split("&").filter(function(t){var e=a||!tt("ut"),n=Ot.map(G).join("|"),r=e?"^("+n+")=":"^((utm_)"+(st?"":"?")+"(source|medium|content|term|campaign)"+(st?"":"|ref")+"|"+n+")=";return e&&!Ot.length?d:new RegExp(r).test(t)}).join("&")||h},lt=it+"_loaded";if(l[lt]==f)return p(w+"twice");l.sa_event_loaded=f,l[lt]=f;var pt=function(e,t,n){e=n?e:Z(qt,Dt,e),g.brave&&!n&&(e.brave=f),g._duckduckgoloader_&&!n&&(e.duck=f);var r=new Image;t&&(r.onerror=t,r.onload=t),r.src=k+"/simple.gif?"+Object.keys(e).filter(function(t){return e[t]!=h}).map(function(t){return O(t)+"="+O(e[t])}).join("&")+"&time="+Date.now()},ht=t.hostname||J(z,"hostname"),ft=ht||v,dt={version:"custom_app_11",hostname:ft};n=function(t){t=t.stack?t+" "+t.stack:t,p(t),pt(Z(dt,{type:i,error:t,path:s.pathname}),h,f)},M(i,function(t){t.filename&&-1"); //# sourceMappingURL=app.js.map \ No newline at end of file diff --git a/dist/v11/custom/app.js.map b/dist/v11/custom/app.js.map index 9bc6a22b..b1e9ee83 100644 --- a/dist/v11/custom/app.js.map +++ b/dist/v11/custom/app.js.map @@ -1 +1 @@ -{"version":3,"file":"app.source.js","sources":["app.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var metadataObject = window[namespace + \"_metadata\"];\n var appendMetadata = function (metadata, data) {\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) return metadata;\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var getQueryParams = function (ignoreSource) {\n return (\n loc.search\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex).test(keyValue);\n })\n .join(\"&\") || undefinedVar\n );\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n window.phantom ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = trueVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n return (\n (doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n nav.sendBeacon(fullApiUrl + \"/append\", stringify(append));\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n metadata\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n\n sendData({\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: getQueryParams(deleteSourceInfo),\n\n metadata: stringify(metadata),\n });\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (isPushState, pathOverwrite, metadata) {\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique = isPushState || userNavigated ? falseVar : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n sendPageView(\n isPushState,\n isPushState || userNavigated || !collectMetricByString(\"r\"), // r = referrers\n sameSite,\n metadata\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n else {\n window.sa_pageview = function (path, metadata) {\n pageview(0, path, metadata);\n };\n }\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_app_11\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","metadataObject","appendMetadata","metadata","data","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","search","keyValue","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","indexOf","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","bot","webdriver","__nightmare","callPhantom","_phantom","phantom","__polypane","_bot","collectDataOnLeave","ua","protocol","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","i","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","e","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","callbackRaw","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue","q"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"app.source.js","sources":["app.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var metadataObject = window[namespace + \"_metadata\"];\n var appendMetadata = function (metadata, data) {\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) return metadata;\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var getQueryParams = function (ignoreSource) {\n return (\n loc.search\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex).test(keyValue);\n })\n .join(\"&\") || undefinedVar\n );\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n window.phantom ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = trueVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n return (\n (doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n nav.sendBeacon(fullApiUrl + \"/append\", stringify(append));\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n metadata\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n\n sendData({\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: getQueryParams(deleteSourceInfo),\n\n metadata: stringify(metadata),\n });\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (isPushState, pathOverwrite, metadata) {\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique = isPushState || userNavigated ? falseVar : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n sendPageView(\n isPushState,\n isPushState || userNavigated || !collectMetricByString(\"r\"), // r = referrers\n sameSite,\n metadata\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n else {\n window.sa_pageview = function (path, metadata) {\n pageview(0, path, metadata);\n };\n }\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_app_11\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","metadataObject","appendMetadata","metadata","data","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","search","keyValue","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","indexOf","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","bot","webdriver","__nightmare","callPhantom","_phantom","phantom","__polypane","_bot","collectDataOnLeave","ua","protocol","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","i","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","e","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","callbackRaw","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue","q"],"mappings":"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"} \ No newline at end of file diff --git a/dist/v11/custom/auto-events.js b/dist/v11/custom/auto-events.js index 3f5ff6ee..451495d7 100644 --- a/dist/v11/custom/auto-events.js +++ b/dist/v11/custom/auto-events.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy friendly analytics (docs.simpleanalytics.com/script; 2023-05-03; 19c1; SRI-version; v11) */ +/* Simple Analytics - Privacy friendly analytics (docs.simpleanalytics.com/script; 2026-08-17; 5dd7; SRI-version; v11) */ -function r(t,e){var a,o=!1;h.downloads&&/^https?:\/\//i.test(t.href)&&new RegExp("\\.("+(h.downloadsExtensions||[]).join("|")+")$","i").test(t.pathname)?o="download":h.outbound&&/^https?:\/\//i.test(t.href)&&t.hostname!==m.location.hostname?o="outbound":h.emails&&/^mailto:/i.test(t.href)&&(o="email"),o&&(e?(a="saAutomatedLink(this, '"+o+"');",t.hasAttribute("target")&&"_self"!==t.getAttribute("target")||(a+=" return false;"),t.setAttribute("onclick",a)):t.addEventListener("click",function(t){saAutomatedLink(t.target,o)}))}function e(){try{for(var t=document.getElementsByTagName("a"),e=0;e -1,\n emails: collectTypes.indexOf(\"emails\") > -1,\n downloads: collectTypes.indexOf(\"downloads\") > -1,\n // Downloads: enter file extensions you want to collect\n downloadsExtensions: setting(\"extensions\", \"array\", [\n \"pdf\",\n \"csv\",\n \"docx\",\n \"xlsx\",\n \"zip\",\n \"doc\",\n \"xls\",\n ]),\n\n // All: use title attribute if set for event name (for all events)\n // THIS TAKES PRECEDENCE OVER OTHER SETTINGS BELOW\n title: setting(\"useTitle\", \"bool\", true),\n // Outbound: use full URL of the links? false for just the hostname\n outboundFullUrl: fullUrls,\n // Downloads: if taking event name from URL, use full URL or just filename (default)\n downloadsFullUrl: fullUrls,\n };\n\n var saGlobal = setting(\"saGlobal\", \"string\", \"sa_event\");\n\n // For compiling the script\n var optionsLink = options;\n\n if (typeof optionsLink === \"undefined\")\n log(\"options object not found, please specify\", \"warn\");\n\n window.saAutomatedLink = function saAutomatedLink(element, type) {\n try {\n if (!element) return log(\"no element found\");\n var sent = false;\n\n var callback = function () {\n if (!sent && !element.hasAttribute(\"target\"))\n document.location = element.getAttribute(\"href\");\n sent = true;\n };\n\n if (window[saGlobal] && window[saGlobal + \"_loaded\"]) {\n var hostname = element.hostname;\n var pathname = element.pathname;\n\n var event;\n var metadata = {\n title: element.getAttribute(\"title\") || undefined,\n };\n var url = element.href || undefined;\n\n var useTitle = false;\n if (optionsLink.title && element.hasAttribute(\"title\")) {\n var theTitle = element.getAttribute(\"title\").trim();\n if (theTitle != \"\") useTitle = true;\n }\n\n if (useTitle) {\n event = theTitle;\n } else {\n switch (type) {\n case \"outbound\": {\n event = hostname + (optionsLink.outboundFullUrl ? pathname : \"\");\n metadata.url = url;\n break;\n }\n case \"download\": {\n event = optionsLink.downloadsFullUrl\n ? hostname + pathname\n : pathname.split(\"/\").pop();\n metadata.url = url;\n break;\n }\n case \"email\": {\n var href = element.getAttribute(\"href\");\n event = (href.split(\":\")[1] || \"\").split(\"?\")[0];\n metadata.email = event;\n break;\n }\n }\n }\n\n var clean =\n type +\n \"_\" +\n event.replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_+|_+$)/g, \"\");\n\n window[saGlobal](clean, metadata, callback);\n\n log(\"collected \" + clean);\n\n return type === \"email\"\n ? callback()\n : window.setTimeout(callback, 5000);\n } else {\n log(saGlobal + \" is not defined\", \"warn\");\n return callback();\n }\n } catch (error) {\n log(error.message, \"warn\");\n }\n };\n\n function collectLink(link, onclick) {\n var collect = false;\n\n // Collect download clicks\n if (\n optionsLink.downloads &&\n /^https?:\\/\\//i.test(link.href) &&\n new RegExp(\n \"\\\\.(\" + (optionsLink.downloadsExtensions || []).join(\"|\") + \")$\",\n \"i\"\n ).test(link.pathname)\n ) {\n collect = \"download\";\n\n // Collect outbound links clicks\n } else if (\n optionsLink.outbound &&\n /^https?:\\/\\//i.test(link.href) &&\n link.hostname !== window.location.hostname\n ) {\n collect = \"outbound\";\n\n // Collect email clicks\n } else if (optionsLink.emails && /^mailto:/i.test(link.href)) {\n collect = \"email\";\n }\n\n if (!collect) return;\n\n if (onclick) {\n var onClickAttribute = \"saAutomatedLink(this, '\" + collect + \"');\";\n\n if (\n !link.hasAttribute(\"target\") ||\n link.getAttribute(\"target\") === \"_self\"\n )\n onClickAttribute += \" return false;\";\n\n link.setAttribute(\"onclick\", onClickAttribute);\n } else {\n link.addEventListener(\"click\", function (element) {\n saAutomatedLink(element.target, collect);\n });\n }\n }\n\n function onDOMContentLoaded() {\n try {\n var a = document.getElementsByTagName(\"a\");\n\n // Loop over all links on the page\n for (var i = 0; i < a.length; i++) {\n var link = a[i];\n var href = link.getAttribute(\"href\");\n\n // Skip links that don't have an href\n if (!href) continue;\n\n // We don't want to overwrite website behaviour so we check for the onclick attribute\n if (!link.getAttribute(\"onclick\") && !/^mailto:/.test(href)) {\n collectLink(link, true);\n } else {\n collectLink(link, false);\n }\n }\n } catch (error) {\n log(error.message, \"warn\");\n }\n }\n\n if (doc.readyState === \"ready\" || doc.readyState === \"complete\") {\n onDOMContentLoaded();\n } else {\n document.addEventListener(\"readystatechange\", function (event) {\n if (event.target.readyState === \"complete\") onDOMContentLoaded();\n });\n }\n})(window);\n"],"names":["collectLink","link","onclick","onClickAttribute","collect","optionsLink","downloads","test","href","RegExp","downloadsExtensions","join","pathname","outbound","hostname","window","location","emails","hasAttribute","getAttribute","setAttribute","addEventListener","element","saAutomatedLink","target","onDOMContentLoaded","a","document","getElementsByTagName","i","length","error","log","message","doc","scriptElement","setting","collectTypes","fullUrls","options","saGlobal","type","logger","console","warn","info","currentScript","querySelector","attribute","defaultValue","value","dataset","split","map","item","trim","filter","Boolean","indexOf","title","outboundFullUrl","downloadsFullUrl","sent","callback","theTitle","metadata","undefined","url","useTitle","event","pop","email","clean","replace","setTimeout","readyState"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"auto-events.source.js","sources":["auto-events.source.js"],"sourcesContent":["(function saAutomatedEvents(window) {\n // Skip server side rendered pages\n if (typeof window === \"undefined\") return;\n\n var log = function (message, type) {\n var logger = type === \"warn\" ? console.warn : console.info;\n return logger && logger(\"Simple Analytics auto events:\", message);\n };\n\n var doc = window.document;\n\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"auto-events.js\"]');\n\n var setting = function (attribute, type, defaultValue) {\n var value = scriptElement && scriptElement.dataset[attribute];\n\n // Booleans\n if (type === \"bool\" && (value === \"true\" || value === \"false\"))\n return value === \"true\";\n else if (type === \"bool\") return defaultValue;\n\n // Arrays\n if (type === \"array\" && value)\n return value\n .split(\",\")\n .map(function (item) {\n return item.trim();\n })\n .filter(Boolean);\n else if (type === \"array\") return defaultValue;\n\n return value || defaultValue;\n };\n\n var collectTypes = setting(\"collect\", \"array\", [\n \"outbound\",\n \"emails\",\n \"downloads\",\n ]);\n var fullUrls = setting(\"fullUrls\", \"bool\", false);\n\n var options = {\n // What to collect\n outbound: collectTypes.indexOf(\"outbound\") > -1,\n emails: collectTypes.indexOf(\"emails\") > -1,\n downloads: collectTypes.indexOf(\"downloads\") > -1,\n // Downloads: enter file extensions you want to collect\n downloadsExtensions: setting(\"extensions\", \"array\", [\n \"pdf\",\n \"csv\",\n \"docx\",\n \"xlsx\",\n \"zip\",\n \"doc\",\n \"xls\",\n ]),\n\n // All: use title attribute if set for event name (for all events)\n // THIS TAKES PRECEDENCE OVER OTHER SETTINGS BELOW\n title: setting(\"useTitle\", \"bool\", true),\n // Outbound: use full URL of the links? false for just the hostname\n outboundFullUrl: fullUrls,\n // Downloads: if taking event name from URL, use full URL or just filename (default)\n downloadsFullUrl: fullUrls,\n };\n\n var saGlobal = setting(\"saGlobal\", \"string\", \"sa_event\");\n\n // For compiling the script\n var optionsLink = options;\n\n if (typeof optionsLink === \"undefined\")\n log(\"options object not found, please specify\", \"warn\");\n\n window.saAutomatedLink = function saAutomatedLink(element, type) {\n try {\n if (!element) return log(\"no element found\");\n var sent = false;\n\n var callback = function () {\n if (\n !sent &&\n (!element.hasAttribute(\"target\") ||\n element.getAttribute(\"target\") === \"_self\")\n )\n document.location = element.getAttribute(\"href\");\n sent = true;\n };\n\n if (window[saGlobal] && window[saGlobal + \"_loaded\"]) {\n var hostname = element.hostname;\n var pathname = element.pathname;\n\n var event;\n var metadata = {\n title: element.getAttribute(\"title\") || undefined,\n };\n var url = element.href || undefined;\n\n var useTitle = false;\n if (optionsLink.title && element.hasAttribute(\"title\")) {\n var theTitle = element.getAttribute(\"title\").trim();\n if (theTitle != \"\") useTitle = true;\n }\n\n if (useTitle) {\n event = theTitle;\n } else {\n switch (type) {\n case \"outbound\": {\n event = hostname + (optionsLink.outboundFullUrl ? pathname : \"\");\n metadata.url = url;\n break;\n }\n case \"download\": {\n event = optionsLink.downloadsFullUrl\n ? hostname + pathname\n : pathname.split(\"/\").pop();\n metadata.url = url;\n break;\n }\n case \"email\": {\n var href = element.getAttribute(\"href\");\n event = (href.split(\":\")[1] || \"\").split(\"?\")[0];\n metadata.email = event;\n break;\n }\n }\n }\n\n var clean =\n type +\n \"_\" +\n event.replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_+|_+$)/g, \"\");\n\n window[saGlobal](clean, metadata, callback);\n\n log(\"collected \" + clean);\n\n return type === \"email\"\n ? callback()\n : window.setTimeout(callback, 5000);\n } else {\n log(saGlobal + \" is not defined\", \"warn\");\n return callback();\n }\n } catch (error) {\n log(error.message, \"warn\");\n }\n };\n\n function collectLink(link, onclick) {\n var collect = false;\n\n // Collect download clicks\n if (\n optionsLink.downloads &&\n /^https?:\\/\\//i.test(link.href) &&\n new RegExp(\n \"\\\\.(\" + (optionsLink.downloadsExtensions || []).join(\"|\") + \")$\",\n \"i\"\n ).test(link.pathname)\n ) {\n collect = \"download\";\n\n // Collect outbound links clicks\n } else if (\n optionsLink.outbound &&\n /^https?:\\/\\//i.test(link.href) &&\n link.hostname !== window.location.hostname\n ) {\n collect = \"outbound\";\n\n // Collect email clicks\n } else if (optionsLink.emails && /^mailto:/i.test(link.href)) {\n collect = \"email\";\n }\n\n if (!collect) return;\n\n if (onclick) {\n var onClickAttribute = \"saAutomatedLink(this, '\" + collect + \"');\";\n\n if (\n !link.hasAttribute(\"target\") ||\n link.getAttribute(\"target\") === \"_self\"\n )\n onClickAttribute += \" return false;\";\n\n link.setAttribute(\"onclick\", onClickAttribute);\n } else {\n link.addEventListener(\"click\", function () {\n saAutomatedLink(this, collect);\n });\n }\n }\n\n function onDOMContentLoaded() {\n try {\n var a = document.getElementsByTagName(\"a\");\n\n // Loop over all links on the page\n for (var i = 0; i < a.length; i++) {\n var link = a[i];\n var href = link.getAttribute(\"href\");\n\n // Skip links that don't have an href\n if (!href) continue;\n\n // We don't want to overwrite website behaviour so we check for the onclick attribute\n if (!link.getAttribute(\"onclick\") && !/^mailto:/.test(href)) {\n collectLink(link, true);\n } else {\n collectLink(link, false);\n }\n }\n } catch (error) {\n log(error.message, \"warn\");\n }\n }\n\n if (doc.readyState === \"ready\" || doc.readyState === \"complete\") {\n onDOMContentLoaded();\n } else {\n document.addEventListener(\"readystatechange\", function (event) {\n if (event.target.readyState === \"complete\") onDOMContentLoaded();\n });\n }\n})(window);\n"],"names":["collectLink","link","onclick","onClickAttribute","collect","optionsLink","downloads","test","href","RegExp","downloadsExtensions","join","pathname","outbound","hostname","window","location","emails","hasAttribute","getAttribute","setAttribute","addEventListener","saAutomatedLink","this","onDOMContentLoaded","a","document","getElementsByTagName","i","length","error","log","message","doc","scriptElement","setting","collectTypes","fullUrls","options","saGlobal","type","logger","console","warn","info","currentScript","querySelector","attribute","defaultValue","value","dataset","split","map","item","trim","filter","Boolean","indexOf","title","outboundFullUrl","downloadsFullUrl","element","sent","callback","theTitle","metadata","undefined","url","useTitle","event","pop","email","clean","replace","setTimeout","readyState","target"],"mappings":"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"} \ No newline at end of file diff --git a/dist/v11/custom/light.js b/dist/v11/custom/light.js index bc77d998..7ac8d22e 100644 --- a/dist/v11/custom/light.js +++ b/dist/v11/custom/light.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy friendly analytics (docs.simpleanalytics.com/script; 2023-05-03; e624; SRI-version; v11) */ +/* Simple Analytics - Privacy friendly analytics (docs.simpleanalytics.com/script; 2026-08-17; ab84; SRI-version; v11) */ !function(s,e,t,u){try{var i=undefined,n="https:",r=s.console,a="doNotTrack",p=s.navigator,c=s.location,d=c.host,o=s.document,l=p.userAgent,m="Not sending request ",f=!1,g=encodeURIComponent,h=decodeURIComponent,v=JSON.stringify,y=s.addEventListener,_="https://"+t,w=(o.documentElement,"language"),b=p.userAgentData,O="platform",S="platformVersion",k="https://docs.simpleanalytics.com",j=/(bot|spider|crawl)/i.test(l)&&!/(cubot)/i.test(l),E=o.currentScript||o.querySelector('script[src*="'+t+'"]');u=function(){var e=[].slice.call(arguments);return e.unshift("Simple Analytics:"),Function.prototype.apply.call(r.warn,r,e)};var x=function(e,t){return e&&e.getAttribute("data-"+t)},A=function(){for(var e,t,n,r={},a=arguments,o=0;o>e/4).toString(16)})}catch(r){return e.replace(n,function(e){var t=16*Math.random()|0;return(e<2?t:3&t|8).toString(16)})}},I="namespace",N=e[I]||x(E,I)||"sa",R=e.strictUtm||"true"==x(E,"strict-utm"),U=N+"_loaded";if(1==s[U])return u(m+"twice");s.sa_event_loaded=!0,s[U]=!0;var V,B=function(t,e,n){t=n?t:A(F,J,t),p.brave&&!n&&(t.brave=!0),p._duckduckgoloader_&&!n&&(t.duck=!0),(new Image).src=_+"/simple.gif?"+Object.keys(t).filter(function(e){return t[e]!=i}).map(function(e){return g(e)+"="+g(t[e])}).join("&")+"&time="+Date.now()},C=e.hostname||x(E,"hostname"),H=C||d,T={version:"custom_light_11",hostname:H};e.mode||x(E,"mode");try{V=Intl.DateTimeFormat().resolvedOptions().timeZone}catch(Q){u(Q)}j&&(T.bot=!0);var F=A(T,{ua:l,https:c.protocol==n,timezone:V,page_id:D(),session_id:D()});if(F.sri=!0,b&&(F.mobile=b.mobile,F.brands=v(b.brands)),H!==d&&(F.hostname_original=d),a in p&&"1"==p[a])return u("Not sending request when "+a+" is enabled. See "+k+"/dnt");-1!=d.indexOf(".")&&!/^[0-9.:]+$/.test(d)||C||u("Set hostname on "+d+". See "+k+"/overwrite-domain-name");var z,J={},L=(o.referrer||"").replace(d,H).replace(/^https?:\/\/((m|l|w{2,3}([0-9]+)?)\.)?([^?#]+)(.*)$/,"$4").replace(/^([^/]+)$/,"$1")||i,M=function(e,t){var n=A(T,{type:"append",original_id:t?e:F.page_id});t||!p.sendBeacon?B(n,0,!0):p.sendBeacon(_+"/append",v(n))};y("pagehide",M,!1);var P,Z,G=function(e){var t="";try{t=e||h(c.pathname)}catch(Q){u(Q)}return t},K=function(e,t,n,r){e&&M(""+F.page_id,!0),F.page_id=D();var a,o=H+G();B({id:F.page_id,type:"pageview",referrer:!t||n?L:null,query:(a=t,c.search.slice(1).split("&").filter(function(e){return!a&&new RegExp("^((utm_)"+(R?"":"?")+"(source|medium|content|term|campaign)"+(R?"":"|ref")+")=").test(e)}).join("&")||i)}),L=o,0};!function(e,t){var n=G(t);if(n&&z!=n){z=n,J.path=n,p[w]&&(J[w]=p[w]);var r,a=s.performance,o="navigation";try{r=a.getEntriesByType(o)[0].type}catch(Q){u(Q)}Z=r?-1<["reload","back_forward"].indexOf(r):a&&a[o]&&-1<[1,2].indexOf(a[o].type),P=!!L&&L.split("/")[0]==d;var i=function(){f=!0,K(e,e||Z||!1,P)};if(f)i();else try{b&&"function"==typeof b.getHighEntropyValues?b.getHighEntropyValues([O,S]).then(function(e){F.os_name=e[O],F.os_version=e[S],i()})["catch"](i):i()}catch(c){i()}}}()}catch(W){u(W)}}(window,{},""); //# sourceMappingURL=light.js.map \ No newline at end of file diff --git a/dist/v11/custom/light.js.map b/dist/v11/custom/light.js.map index 1820aebc..5ce47fe9 100644 --- a/dist/v11/custom/light.js.map +++ b/dist/v11/custom/light.js.map @@ -1 +1 @@ -{"version":3,"file":"light.source.js","sources":["light.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n\n var collectMetricByString = function (metricAbbreviation) {\n return true;\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var getQueryParams = function (ignoreSource) {\n return (\n loc.search\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n if (ignore) return falseVar;\n var regex =\n \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \")=\";\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex).test(keyValue);\n })\n .join(\"&\") || undefinedVar\n );\n };\n\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n\n\n\n\n\n\n\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var bot = isBotAgent;\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = trueVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n return (\n (doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n nav.sendBeacon(fullApiUrl + \"/append\", stringify(append));\n }\n };\n\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n\n\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n metadata\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n\n sendData({\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: getQueryParams(deleteSourceInfo),\n\n });\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (isPushState, pathOverwrite, metadata) {\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n sameSite = referrer\n ? referrer.split(slash)[0] == locationHostname\n : falseVar;\n\n\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n sendPageView(\n isPushState,\n isPushState || userNavigated || !collectMetricByString(\"r\"), // r = referrers\n sameSite,\n metadata\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n\n\n pageview();\n\n } catch (e) {\n warn(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_light_11\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","warn","undefinedVar","undefined","https","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","language","documentElement","uaData","userAgentData","platformText","platformVersionText","docsUrl","isBotAgent","test","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","attr","attribute","getAttribute","assign","obj","prop","object","to","arg","index","length","nextSource","constructor","Object","nextKey","hasOwnProperty","settings","sa_settings","logSettings","keys","Date","now","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","replace","c","getRandomValues","Uint8Array","toString","error","r","Math","random","namespaceText","namespace","strictUtm","loadedVariable","sa_event_loaded","timezone","sendData","data","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","Image","src","filter","key","map","join","overwrittenHostname","hostname","definedHostname","basePayload","version","mode","Intl","DateTimeFormat","resolvedOptions","timeZone","bot","ua","protocol","page_id","session_id","sri","mobile","brands","hostname_original","indexOf","lastSendPath","referrer","sendOnLeave","id","push","append","type","original_id","sendBeacon","sameSite","userNavigated","getPath","overwrite","path","pathname","sendPageView","isPushState","deleteSourceInfo","metadata","ignoreSource","currentPage","query","search","split","keyValue","RegExp","pages","pathOverwrite","performaceEntryType","perf","performance","navigationText","getEntriesByType","triggerSendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","e","pageview"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"light.source.js","sources":["light.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n\n var collectMetricByString = function (metricAbbreviation) {\n return true;\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var getQueryParams = function (ignoreSource) {\n return (\n loc.search\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n if (ignore) return falseVar;\n var regex =\n \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \")=\";\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex).test(keyValue);\n })\n .join(\"&\") || undefinedVar\n );\n };\n\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n\n\n\n\n\n\n\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var bot = isBotAgent;\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = trueVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n return (\n (doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n nav.sendBeacon(fullApiUrl + \"/append\", stringify(append));\n }\n };\n\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n\n\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n metadata\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n\n sendData({\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: getQueryParams(deleteSourceInfo),\n\n });\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (isPushState, pathOverwrite, metadata) {\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n sameSite = referrer\n ? referrer.split(slash)[0] == locationHostname\n : falseVar;\n\n\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n sendPageView(\n isPushState,\n isPushState || userNavigated || !collectMetricByString(\"r\"), // r = referrers\n sameSite,\n metadata\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n\n\n pageview();\n\n } catch (e) {\n warn(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_light_11\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","warn","undefinedVar","undefined","https","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","language","documentElement","uaData","userAgentData","platformText","platformVersionText","docsUrl","isBotAgent","test","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","attr","attribute","getAttribute","assign","obj","prop","object","to","arg","index","length","nextSource","constructor","Object","nextKey","hasOwnProperty","settings","sa_settings","logSettings","keys","Date","now","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","replace","c","getRandomValues","Uint8Array","toString","error","r","Math","random","namespaceText","namespace","strictUtm","loadedVariable","sa_event_loaded","timezone","sendData","data","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","Image","src","filter","key","map","join","overwrittenHostname","hostname","definedHostname","basePayload","version","mode","Intl","DateTimeFormat","resolvedOptions","timeZone","bot","ua","protocol","page_id","session_id","sri","mobile","brands","hostname_original","indexOf","lastSendPath","referrer","sendOnLeave","id","push","append","type","original_id","sendBeacon","sameSite","userNavigated","getPath","overwrite","path","pathname","sendPageView","isPushState","deleteSourceInfo","metadata","ignoreSource","currentPage","query","search","split","keyValue","RegExp","pages","pathOverwrite","performaceEntryType","perf","performance","navigationText","getEntriesByType","triggerSendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","e","pageview"],"mappings":"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"} \ No newline at end of file diff --git a/dist/v11/custom/proxy.js b/dist/v11/custom/proxy.js index 1fd4bf80..f7889145 100644 --- a/dist/v11/custom/proxy.js +++ b/dist/v11/custom/proxy.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy friendly analytics (docs.simpleanalytics.com/script; 2023-05-03; 0989; SRI-version; v11) */ +/* Simple Analytics - Privacy friendly analytics (docs.simpleanalytics.com/script; 2026-08-17; b0f0; SRI-version; v11) */ !function(l,t,e,n,p){try{var h=undefined,f=!0,d=!1,r="true",a="https:",m="pageview",u="event",i="error",o=l.console,c="doNotTrack",g=l.navigator,s=l.location,v=s.host,y=l.document,_=g.userAgent,w="Not sending request ",b=w+"when ",x=d,E=encodeURIComponent,O=decodeURIComponent,S=JSON.stringify,M=l.addEventListener,k="https://"+e,A=y.documentElement||{},q="language",$="Height",j="scroll",D=g.userAgentData,C=j+$,H="offset"+$,P="client"+$,R="pagehide",T="platform",U="platformVersion",I="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(_)&&!/(cubot)/i.test(_),N=l.screen,z=y.currentScript||y.querySelector('script[src*="'+e+'"]');p=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){p("Error in your "+t+" function:",e)},W=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},G=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},J=function(t,e){return t&&t.getAttribute("data-"+e)},L=function(t){return Array.isArray(t)?t:"string"==typeof t&&t.length?t.split(/, ?/):[]},Y=function(t){return t&&t.constructor===Object},Z=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},rt=function(t){return"function"==typeof t},at="namespace",it=t[at]||J(z,at)||"sa",ot=l[it+"_metadata"],ct=function(t,e){Y(ot)&&(t=Z(t,ot));var n=l[Mt];if(!rt(n))return t;try{return Z(t,n.call(l,Z(t,e)))}catch(r){F("metadata",r)}},st=t.strictUtm||J(z,"strict-utm")==r,ut=function(a){return s.search.slice(1).split("&").filter(function(t){var e=a||!tt("ut"),n=Et.map(G).join("|"),r=e?"^("+n+")=":"^((utm_)"+(st?"":"?")+"(source|medium|content|term|campaign)"+(st?"":"|ref")+"|"+n+")=";return e&&!Et.length?d:new RegExp(r).test(t)}).join("&")||h},lt=it+"_loaded";if(l[lt]==f)return p(w+"twice");l.sa_event_loaded=f,l[lt]=f;var pt=function(e,t,n){e=n?e:Z(qt,Dt,e),g.brave&&!n&&(e.brave=f),g._duckduckgoloader_&&!n&&(e.duck=f);var r=new Image;t&&(r.onerror=t,r.onload=t),r.src=k+"/simple.gif?"+Object.keys(e).filter(function(t){return e[t]!=h}).map(function(t){return E(t)+"="+E(e[t])}).join("&")+"&time="+Date.now()},ht=t.hostname||J(z,"hostname"),ft=ht||v,dt={version:"custom_proxy_11",hostname:ft};n=function(t){t=t.stack?t+" "+t.stack:t,p(t),pt(Z(dt,{type:i,error:t,path:s.pathname}),h,f)},M(i,function(t){t.filename&&-1"); //# sourceMappingURL=proxy.js.map \ No newline at end of file diff --git a/dist/v11/custom/proxy.js.map b/dist/v11/custom/proxy.js.map index f6f5a906..cbf0496f 100644 --- a/dist/v11/custom/proxy.js.map +++ b/dist/v11/custom/proxy.js.map @@ -1 +1 @@ -{"version":3,"file":"proxy.source.js","sources":["proxy.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var metadataObject = window[namespace + \"_metadata\"];\n var appendMetadata = function (metadata, data) {\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) return metadata;\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var getQueryParams = function (ignoreSource) {\n return (\n loc.search\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex).test(keyValue);\n })\n .join(\"&\") || undefinedVar\n );\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n window.phantom ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = trueVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n return (\n (doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n nav.sendBeacon(fullApiUrl + \"/append\", stringify(append));\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n metadata\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n\n sendData({\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: getQueryParams(deleteSourceInfo),\n\n metadata: stringify(metadata),\n });\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (isPushState, pathOverwrite, metadata) {\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique = isPushState || userNavigated ? falseVar : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n sendPageView(\n isPushState,\n isPushState || userNavigated || !collectMetricByString(\"r\"), // r = referrers\n sameSite,\n metadata\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n else {\n window.sa_pageview = function (path, metadata) {\n pageview(0, path, metadata);\n };\n }\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_proxy_11\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","metadataObject","appendMetadata","metadata","data","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","search","keyValue","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","indexOf","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","bot","webdriver","__nightmare","callPhantom","_phantom","phantom","__polypane","_bot","collectDataOnLeave","ua","protocol","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","i","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","e","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","callbackRaw","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue","q"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"proxy.source.js","sources":["proxy.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var metadataObject = window[namespace + \"_metadata\"];\n var appendMetadata = function (metadata, data) {\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) return metadata;\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var getQueryParams = function (ignoreSource) {\n return (\n loc.search\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex).test(keyValue);\n })\n .join(\"&\") || undefinedVar\n );\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n window.phantom ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = trueVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n return (\n (doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n nav.sendBeacon(fullApiUrl + \"/append\", stringify(append));\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n metadata\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n\n sendData({\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: getQueryParams(deleteSourceInfo),\n\n metadata: stringify(metadata),\n });\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (isPushState, pathOverwrite, metadata) {\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique = isPushState || userNavigated ? falseVar : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n sendPageView(\n isPushState,\n isPushState || userNavigated || !collectMetricByString(\"r\"), // r = referrers\n sameSite,\n metadata\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n else {\n window.sa_pageview = function (path, metadata) {\n pageview(0, path, metadata);\n };\n }\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_proxy_11\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","metadataObject","appendMetadata","metadata","data","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","search","keyValue","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","indexOf","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","bot","webdriver","__nightmare","callPhantom","_phantom","phantom","__polypane","_bot","collectDataOnLeave","ua","protocol","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","i","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","e","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","callbackRaw","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue","q"],"mappings":"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"} \ No newline at end of file diff --git a/dist/v11/light.js b/dist/v11/light.js index f63624be..3b791380 100644 --- a/dist/v11/light.js +++ b/dist/v11/light.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy friendly analytics (docs.simpleanalytics.com/script; 2023-05-03; e23d; SRI-version; v11) */ +/* Simple Analytics - Privacy friendly analytics (docs.simpleanalytics.com/script; 2026-08-17; bf3d; SRI-version; v11) */ !function(s,e,t,u){try{var i=undefined,n="https:",r=s.console,a="doNotTrack",p=s.navigator,c=s.location,d=c.host,o=s.document,l=p.userAgent,m="Not sending request ",f=!1,g=encodeURIComponent,h=decodeURIComponent,v=JSON.stringify,y=s.addEventListener,_="https://queue."+t,w=(o.documentElement,"language"),b=p.userAgentData,O="platform",S="platformVersion",k="https://docs.simpleanalytics.com",j=/(bot|spider|crawl)/i.test(l)&&!/(cubot)/i.test(l),E=o.currentScript||o.querySelector('script[src*="'+t+'"]');u=function(){var e=[].slice.call(arguments);return e.unshift("Simple Analytics:"),Function.prototype.apply.call(r.warn,r,e)};var q=function(e,t){return e&&e.getAttribute("data-"+t)},A=function(){for(var e,t,n,r={},a=arguments,o=0;o>e/4).toString(16)})}catch(r){return e.replace(n,function(e){var t=16*Math.random()|0;return(e<2?t:3&t|8).toString(16)})}},I="namespace",N=e[I]||q(E,I)||"sa",R=e.strictUtm||"true"==q(E,"strict-utm"),U=N+"_loaded";if(1==s[U])return u(m+"twice");s.sa_event_loaded=!0,s[U]=!0;var V,B=function(t,e,n){t=n?t:A(H,J,t),p.brave&&!n&&(t.brave=!0),p._duckduckgoloader_&&!n&&(t.duck=!0),(new Image).src=_+"/simple.gif?"+Object.keys(t).filter(function(e){return t[e]!=i}).map(function(e){return g(e)+"="+g(t[e])}).join("&")+"&time="+Date.now()},C=e.hostname||q(E,"hostname"),T=C||d,F={version:"cdn_light_11",hostname:T};e.mode||q(E,"mode");try{V=Intl.DateTimeFormat().resolvedOptions().timeZone}catch(Q){u(Q)}j&&(F.bot=!0);var H=A(F,{ua:l,https:c.protocol==n,timezone:V,page_id:D(),session_id:D()});if(H.sri=!0,b&&(H.mobile=b.mobile,H.brands=v(b.brands)),T!==d&&(H.hostname_original=d),a in p&&"1"==p[a])return u("Not sending request when "+a+" is enabled. See "+k+"/dnt");-1!=d.indexOf(".")&&!/^[0-9.:]+$/.test(d)||C||u("Set hostname on "+d+". See "+k+"/overwrite-domain-name");var z,J={},L=(o.referrer||"").replace(d,T).replace(/^https?:\/\/((m|l|w{2,3}([0-9]+)?)\.)?([^?#]+)(.*)$/,"$4").replace(/^([^/]+)$/,"$1")||i,M=function(e,t){var n=A(F,{type:"append",original_id:t?e:H.page_id});t||!p.sendBeacon?B(n,0,!0):p.sendBeacon(_+"/append",v(n))};y("pagehide",M,!1);var P,Z,G=function(e){var t="";try{t=e||h(c.pathname)}catch(Q){u(Q)}return t},K=function(e,t,n,r){e&&M(""+H.page_id,!0),H.page_id=D();var a,o=T+G();B({id:H.page_id,type:"pageview",referrer:!t||n?L:null,query:(a=t,c.search.slice(1).split("&").filter(function(e){return!a&&new RegExp("^((utm_)"+(R?"":"?")+"(source|medium|content|term|campaign)"+(R?"":"|ref")+")=").test(e)}).join("&")||i)}),L=o,0};!function(e,t){var n=G(t);if(n&&z!=n){z=n,J.path=n,p[w]&&(J[w]=p[w]);var r,a=s.performance,o="navigation";try{r=a.getEntriesByType(o)[0].type}catch(Q){u(Q)}Z=r?-1<["reload","back_forward"].indexOf(r):a&&a[o]&&-1<[1,2].indexOf(a[o].type),P=!!L&&L.split("/")[0]==d;var i=function(){f=!0,K(e,e||Z||!1,P)};if(f)i();else try{b&&"function"==typeof b.getHighEntropyValues?b.getHighEntropyValues([O,S]).then(function(e){H.os_name=e[O],H.os_version=e[S],i()})["catch"](i):i()}catch(c){i()}}}()}catch(W){u(W)}}(window,{},"simpleanalyticscdn.com"); //# sourceMappingURL=light.js.map \ No newline at end of file diff --git a/dist/v11/light.js.map b/dist/v11/light.js.map index fca40996..ff6b4be1 100644 --- a/dist/v11/light.js.map +++ b/dist/v11/light.js.map @@ -1 +1 @@ -{"version":3,"file":"light.source.js","sources":["light.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n\n var collectMetricByString = function (metricAbbreviation) {\n return true;\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var getQueryParams = function (ignoreSource) {\n return (\n loc.search\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n if (ignore) return falseVar;\n var regex =\n \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \")=\";\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex).test(keyValue);\n })\n .join(\"&\") || undefinedVar\n );\n };\n\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n\n\n\n\n\n\n\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var bot = isBotAgent;\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = trueVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n return (\n (doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n nav.sendBeacon(fullApiUrl + \"/append\", stringify(append));\n }\n };\n\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n\n\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n metadata\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n\n sendData({\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: getQueryParams(deleteSourceInfo),\n\n });\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (isPushState, pathOverwrite, metadata) {\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n sameSite = referrer\n ? referrer.split(slash)[0] == locationHostname\n : falseVar;\n\n\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n sendPageView(\n isPushState,\n isPushState || userNavigated || !collectMetricByString(\"r\"), // r = referrers\n sameSite,\n metadata\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n\n\n pageview();\n\n } catch (e) {\n warn(e);\n }\n})(\n window,\n {},\n \"simpleanalyticscdn.com\",\n \"queue.\",\n \"cdn_light_11\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","warn","undefinedVar","undefined","https","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","protocol","language","documentElement","uaData","userAgentData","platformText","platformVersionText","docsUrl","isBotAgent","test","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","attr","attribute","getAttribute","assign","obj","prop","object","to","arg","index","length","nextSource","constructor","Object","nextKey","hasOwnProperty","settings","sa_settings","logSettings","keys","Date","now","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","replace","c","getRandomValues","Uint8Array","toString","error","r","Math","random","namespaceText","namespace","strictUtm","loadedVariable","sa_event_loaded","timezone","sendData","data","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","Image","src","filter","key","map","join","overwrittenHostname","hostname","definedHostname","basePayload","version","mode","Intl","DateTimeFormat","resolvedOptions","timeZone","bot","ua","page_id","session_id","sri","mobile","brands","hostname_original","indexOf","lastSendPath","referrer","sendOnLeave","id","push","append","type","original_id","sendBeacon","sameSite","userNavigated","getPath","overwrite","path","pathname","sendPageView","isPushState","deleteSourceInfo","metadata","ignoreSource","currentPage","query","search","split","keyValue","RegExp","pages","pathOverwrite","performaceEntryType","perf","performance","navigationText","getEntriesByType","triggerSendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","e","pageview"],"mappings":";;CAEA,SACEA,EACAC,EACAC,EAKAC,GAEA,IAQE,IAAIC,EAAeC,UAIfC,EAAQ,SAKRC,EAAMP,EAAOQ,QACbC,EAAa,aACbC,EAAMV,EAAOW,UACbC,EAAMZ,EAAOa,SACbC,EAAmBF,EAAIG,KACvBC,EAAMhB,EAAOiB,SACbC,EAAYR,EAAIQ,UAChBC,EAAa,uBAEbC,GAhBW,EAiBXC,EAAyBC,mBACzBC,EAAyBC,mBACzBC,EAAYC,KAAKD,UAEjBE,EAAuB3B,EAAO4B,iBAC9BC,EAAaC,iBAA0B5B,EAEvC6B,GADkBf,EAAIgB,gBACX,YAIXC,EAASvB,EAAIwB,cAMbC,EAAe,WACfC,EAAsB,kBACtBC,EAAU,mCAEVC,EACF,sBAAsBC,KAAKrB,KAAe,WAAWqB,KAAKrB,GAIxDsB,EACFxB,EAAIyB,eAAiBzB,EAAI0B,cAAc,gBAAkBxC,EAAU,MAOrEC,EAAO,WAEL,IAAIwC,EAAO,GAAGC,MAAMC,KAAKC,WAOzB,OAJAH,EAAKI,QAAQ,qBAINC,SAASC,UAAUC,MAAML,KAAKtC,EAAIJ,KAAMI,EAAKoC,IAGtD,IAgBIQ,EAAO,SAAUX,EAAeY,GAClC,OAAOZ,GAAiBA,EAAca,aAAa,QAAUD,IAe3DE,EAAS,WAGX,IAFA,IA7BsBC,EAAKC,EAwBJC,EAKnBC,EAAK,GACLC,EAAMb,UACDc,EAAQ,EAAGA,EAAQD,EAAIE,OAAQD,IAAS,CAC/C,IAAIE,EAAaH,EAAIC,GACrB,IATqBH,EASRK,IAREL,EAAOM,cAAgBC,OASpC,IAAK,IAAIC,KAAWH,EAlCFP,EAmCJO,EAnCSN,EAmCGS,EAlCvBD,OAAOf,UAAUiB,eAAerB,KAAKU,EAAKC,KAmCzCE,EAAGO,GAAWH,EAAWG,IAKjC,OAAOP,GAGLS,EAAWnE,EAAOoE,YAClBC,EAAcF,GAAYH,OAAOM,KAAKrE,GAAkB4D,OAG5D5D,EAAmBqD,EAAOrD,EAAkBkE,GAExCE,GAAalE,EAAK,WAAYF,GAOxBsE,KAAKC,IAJf,IAMIC,EAAO,WACT,IAAIC,EAAe1E,EAAO2E,QAAU3E,EAAO4E,SACvCC,EAAY,CAAC,MAAQ,KAAO,KAAO,KAAO,KAC1CC,EAAY,SAEhB,IACE,OAAOD,EAAUE,QAAQD,EAAW,SAAUE,GAC5C,OACEA,EACCN,EAAaO,gBAAgB,IAAIC,WAAW,IAAI,GAC9C,IAAOF,EAAI,GACdG,SAAS,MAEb,MAAOC,GACP,OAAOP,EAAUE,QAAQD,EAAW,SAAUE,GAC5C,IAAIK,EAAqB,GAAhBC,KAAKC,SAAiB,EAE/B,OADMP,EAAI,EAAIK,EAAS,EAAJA,EAAW,GACrBF,SAAS,QAUpBK,EAAgB,YAChBC,EACFxF,EAAiBuF,IACjBrC,EAAKX,EAAegD,IA0XxB,KAhXME,EACFzF,EAAiByF,WAtKJ,QAuKbvC,EAAKX,EAAe,cAiClBmD,EAAiBF,EAAY,UACjC,GA3Mc,GA2MVzF,EAAO2F,GAA4B,OAAOxF,EAAKgB,EAAa,SAChEnB,EAAO4F,iBA5MO,EA6Md5F,EAAO2F,IA7MO,EAoNd,IA4DIE,EA5DAC,EAAW,SAAUC,EAAMC,EAAUC,GACvCF,EAAOE,EAAeF,EAAOzC,EAAO4C,EAASC,EAAMJ,GAE/CrF,EAAI0F,QAAUH,IAAcF,EAAKK,OAvNzB,GAwNR1F,EAAI2F,qBAAuBJ,IAAcF,EAAKO,MAxNtC,IA2NA,IAAIC,OACVC,IACJ3E,EACA,eACAmC,OAAOM,KAAKyB,GACTU,OAAO,SAAUC,GAChB,OAAOX,EAAKW,IAAQtG,IAErBuG,IAAI,SAAUD,GACb,OACErF,EAAuBqF,GACvB,IACArF,EAAuB0E,EAAKW,MAG/BE,KAAK,KACR,SACArC,KAAKC,OAILqC,EACF5G,EAAiB6G,UAAY3D,EAAKX,EAAe,YAC/CuE,EAAkBF,GAAuB/F,EAEzCkG,EAAc,CAChBC,QAiSJ,eAhSIH,SAAUC,GAeD9G,EAAiBiH,MAAQ/D,EAAKX,EAAe,QAYxD,IAEEqD,EACIsB,KAAKC,iBAAiBC,kBAAkBC,SAE5C,MAAOlC,GACPjF,EAAKiF,GAOG9C,IAMD0E,EAAYO,KApSP,GAsSd,IAAIrB,EAAU5C,EAAO0D,EAAa,CAEhCQ,GAAkCtG,EAElCZ,MAAOM,EAAIkB,UAAYxB,EACvBuF,SAAUA,EACV4B,QAA8BhD,IAG9BiD,WAA0CjD,MAwB5C,GArBAyB,EAAQyB,KAlTM,EAsTV1F,IACFiE,EAAQ0B,OAAS3F,EAAO2F,OACxB1B,EAAQ2B,OAASpG,EAAUQ,EAAO4F,SAWhCd,IAAoBjG,IACtBoF,EAAQ4B,kBAAoBhH,GAG1BL,KAAcC,GAA0B,KAAnBA,EAAID,GAC3B,OAAON,EAxTYgB,4BAyTAV,EAAa,oBAAsB4B,EAAU,SAK7B,GAAlCvB,EAAiBiH,QAAQ,OACxB,aAAaxF,KAAKzB,IACnB+F,GAED1G,EACE,mBACEW,EACA,SACAuB,EACA,0BAON,IACI2F,EADA7B,EAAO,GAaP8B,GARCjH,EAAIiH,UAAY,IACdlD,QAAQjE,EAAkBiG,GAC1BhC,QAAQ,sDAAuD,MAC/DA,QAAQ,YAAa,OAAS3E,EAcjC8H,EAAc,SAAUC,EAAIC,GAG9B,IAAIC,EAAS/E,EAAO0D,EAAa,CAC/BsB,KAAM,SACNC,YAAaH,EAAOD,EAAKjC,EAAQuB,UAK/BW,IAAS1H,EAAI8H,WAEf1C,EAASuC,EAAQjI,GAhYP,GAkYVM,EAAI8H,WAAW3G,EAAa,UAAWJ,EAAU4G,KAKrD1G,EArWe,WAqWgBuG,GAtYhB,GA6Yf,IA6CIO,EAAUC,EA7CVC,EAAU,SAAUC,GACtB,IAAIC,EAAO,GAIX,IACEA,EAAOD,GAAarH,EAAuBX,EAAIkI,UAC/C,MAAO1D,GACPjF,EAAKiF,GAMP,OAAOyD,GAMLE,EAAe,SACjBC,EACAC,EACAR,EACAS,GAEIF,GAAad,EAAY,GAAKhC,EAAQuB,SAxa9B,GAyaYvB,EAAQuB,QAAUhD,IAE1C,IAhQ6B0E,EAgQzBC,EAAcrC,EAAkB4B,IAEpC7C,EAAS,CACPqC,GAAIjC,EAAQuB,QACZa,KA3ae,WA4afL,UAAWgB,GAAoBR,EAAWR,EAAW,KACrDoB,OAtQ2BF,EAsQLF,EApQtBrI,EAAI0I,OACD1G,MAAM,GACN2G,MAAM,KACN9C,OAAO,SAAU+C,GAGhB,OAFaL,GAYN,IAAIM,OART,YACC/D,EAAY,GAAK,KAClB,yCACCA,EAAY,GAAK,QAClB,MAIuBnD,KAAKiH,KAE/B5C,KAAK,MAAQxG,KAuPlB6H,EAAWmB,EAEXM,IAKa,SAAUV,EAAaW,GAEpC,IAAId,EAAOF,EAAQgB,GAGnB,GAAKd,GAAQb,GAAgBa,EAA7B,CAEAb,EAAea,EACf1C,EAAK0C,KAAOA,EAKNnI,EAAIqB,KAAWoE,EAAKpE,GAAYrB,EAAIqB,IAK1C,IAII6H,EAJAC,EAAO7J,EAAO8J,YACdC,EAAiB,aAIrB,IACEH,EAAsBC,EAAKG,iBAAiBD,GAAgB,GAAGzB,KAC/D,MAAOlD,GACPjF,EAAKiF,GAGPsD,EAAgBkB,GAC+C,EAA3D,CAAC,SAAU,gBAAgB7B,QAAQ6B,GAGnCC,GACAA,EAAKE,KACwC,EAA7C,CAAC,EAAG,GAAGhC,QAAQ8B,EAAKE,GAAgBzB,MAGxCG,IAAWR,GACPA,EAASsB,MA9dH,KA8dgB,IAAMzI,EAKhC,IAAImJ,EAAsB,WACxB7I,GA1eU,EA2eV2H,EACEC,EACAA,GAAeN,IAAiB,EAChCD,IAKJ,GAAKrH,EAmBH6I,SAjBA,IACMhI,GAhWc,mBAgWOA,EAAOiI,qBAC9BjI,EACGiI,qBAAqB,CAAC/H,EAAcC,IACpC+H,KAAK,SAAUC,GACdlE,EAAQmE,QAAUD,EAAkBjI,GACpC+D,EAAQoE,WAAaF,EAAkBhI,GACvC6H,MAEDM,SAAMN,GAETA,IAEF,MAAOO,GACPP,MASNQ,GAEA,MAAOD,GACPrK,EAAKqK,IAliBT,CAqiBExK,OACA,uBACA"} \ No newline at end of file +{"version":3,"file":"light.source.js","sources":["light.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n\n var collectMetricByString = function (metricAbbreviation) {\n return true;\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var getQueryParams = function (ignoreSource) {\n return (\n loc.search\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n if (ignore) return falseVar;\n var regex =\n \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \")=\";\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex).test(keyValue);\n })\n .join(\"&\") || undefinedVar\n );\n };\n\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n\n\n\n\n\n\n\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var bot = isBotAgent;\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = trueVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n return (\n (doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n nav.sendBeacon(fullApiUrl + \"/append\", stringify(append));\n }\n };\n\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n\n\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n metadata\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n\n sendData({\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: getQueryParams(deleteSourceInfo),\n\n });\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (isPushState, pathOverwrite, metadata) {\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n sameSite = referrer\n ? referrer.split(slash)[0] == locationHostname\n : falseVar;\n\n\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n sendPageView(\n isPushState,\n isPushState || userNavigated || !collectMetricByString(\"r\"), // r = referrers\n sameSite,\n metadata\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n\n\n pageview();\n\n } catch (e) {\n warn(e);\n }\n})(\n window,\n {},\n \"simpleanalyticscdn.com\",\n \"queue.\",\n \"cdn_light_11\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","warn","undefinedVar","undefined","https","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","protocol","language","documentElement","uaData","userAgentData","platformText","platformVersionText","docsUrl","isBotAgent","test","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","attr","attribute","getAttribute","assign","obj","prop","object","to","arg","index","length","nextSource","constructor","Object","nextKey","hasOwnProperty","settings","sa_settings","logSettings","keys","Date","now","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","replace","c","getRandomValues","Uint8Array","toString","error","r","Math","random","namespaceText","namespace","strictUtm","loadedVariable","sa_event_loaded","timezone","sendData","data","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","Image","src","filter","key","map","join","overwrittenHostname","hostname","definedHostname","basePayload","version","mode","Intl","DateTimeFormat","resolvedOptions","timeZone","bot","ua","page_id","session_id","sri","mobile","brands","hostname_original","indexOf","lastSendPath","referrer","sendOnLeave","id","push","append","type","original_id","sendBeacon","sameSite","userNavigated","getPath","overwrite","path","pathname","sendPageView","isPushState","deleteSourceInfo","metadata","ignoreSource","currentPage","query","search","split","keyValue","RegExp","pages","pathOverwrite","performaceEntryType","perf","performance","navigationText","getEntriesByType","triggerSendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","e","pageview"],"mappings":"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"} \ No newline at end of file diff --git a/package-lock.json b/package-lock.json deleted file mode 100644 index 7c2d2440..00000000 --- a/package-lock.json +++ /dev/null @@ -1,10246 +0,0 @@ -{ - "name": "scripts", - "version": "9.0.0", - "lockfileVersion": 2, - "requires": true, - "packages": { - "": { - "name": "scripts", - "version": "9.0.0", - "license": "ISC", - "devDependencies": { - "acorn": "^8.11.3", - "browserstack-local": "^1.5.1", - "chai": "^4.2.0", - "dotenv": "^8.2.0", - "eslint": "^6.7.2", - "esprima": "^4.0.1", - "handlebars": "^4.7.6", - "jsdom": "^21.1.0", - "mocha": "^6.2.3", - "nodemon": "^1.19.4", - "prettier": "3.2.5", - "request": "^2.88.0", - "selenium-webdriver": "^4.3.1", - "uglify-js": "^3.9.4", - "uuid-validate": "0.0.3" - }, - "engines": { - "node": "22.16" - } - }, - "node_modules/@babel/code-frame": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.5.5.tgz", - "integrity": "sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw==", - "dev": true, - "dependencies": { - "@babel/highlight": "^7.0.0" - } - }, - "node_modules/@babel/highlight": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.5.0.tgz", - "integrity": "sha512-7dV4eu9gBxoM0dAnj/BCFDW9LFU0zvTrkq0ugM7pnHEgguOEeOz1so2ZghEdzviYzQEED0r4EAgpsBChKy1TRQ==", - "dev": true, - "dependencies": { - "chalk": "^2.0.0", - "esutils": "^2.0.2", - "js-tokens": "^4.0.0" - } - }, - "node_modules/@tootallnate/once": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", - "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", - "dev": true, - "engines": { - "node": ">= 10" - } - }, - "node_modules/abab": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", - "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==", - "deprecated": "Use your platform's native atob() and btoa() methods instead", - "dev": true - }, - "node_modules/abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", - "dev": true - }, - "node_modules/acorn": { - "version": "8.11.3", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", - "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-globals": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-7.0.1.tgz", - "integrity": "sha512-umOSDSDrfHbTNPuNpC2NSnnA3LUrqpevPb4T9jRx4MagXNS0rs+gwiTcAvqCRmsD6utzsrzNt+ebm00SNWiC3Q==", - "dev": true, - "dependencies": { - "acorn": "^8.1.0", - "acorn-walk": "^8.0.2" - } - }, - "node_modules/acorn-jsx": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.1.0.tgz", - "integrity": "sha512-tMUqwBWfLFbJbizRmEcWSLw6HnFzfdJs2sOJEOwwtVPMoH/0Ay+E703oZz78VSXZiiDcZrQ5XKjPIUQixhmgVw==", - "dev": true - }, - "node_modules/acorn-walk": { - "version": "8.3.4", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", - "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", - "dev": true, - "dependencies": { - "acorn": "^8.11.0" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "dev": true, - "dependencies": { - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/agent-base/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/agent-base/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "node_modules/ajv": { - "version": "6.10.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.2.tgz", - "integrity": "sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^2.0.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "node_modules/ansi-align": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-2.0.0.tgz", - "integrity": "sha1-w2rsy6VjuJzrVW82kPCx2eNUf38=", - "dev": true, - "dependencies": { - "string-width": "^2.0.0" - } - }, - "node_modules/ansi-colors": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.3.tgz", - "integrity": "sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/ansi-escapes": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.0.tgz", - "integrity": "sha512-EiYhwo0v255HUL6eDyuLrXEkTi7WwVCLAw+SeOQ7M7qdun1z1pum4DEm/nuqIVbPvi9RPPc9k9LbyBv6H0DwVg==", - "dev": true, - "dependencies": { - "type-fest": "^0.8.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/anymatch": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", - "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", - "dev": true, - "dependencies": { - "micromatch": "^3.1.4", - "normalize-path": "^2.1.1" - } - }, - "node_modules/anymatch/node_modules/normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "dev": true, - "dependencies": { - "remove-trailing-separator": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/arr-flatten": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/arr-union": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", - "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/asn1": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", - "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", - "dev": true, - "dependencies": { - "safer-buffer": "~2.1.0" - } - }, - "node_modules/assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/assertion-error": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", - "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/assign-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", - "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/astral-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", - "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/async-each": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", - "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==", - "dev": true - }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", - "dev": true - }, - "node_modules/atob": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", - "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", - "dev": true, - "bin": { - "atob": "bin/atob.js" - }, - "engines": { - "node": ">= 4.5.0" - } - }, - "node_modules/aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/aws4": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.9.1.tgz", - "integrity": "sha512-wMHVg2EOHaMRxbzgFJ9gtjOOCrI80OHLG14rxi28XwOW8ux6IiEbRCGGGqCtdAIg4FQCbW20k9RsT4y3gJlFug==", - "dev": true - }, - "node_modules/balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true - }, - "node_modules/base": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", - "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", - "dev": true, - "dependencies": { - "cache-base": "^1.0.1", - "class-utils": "^0.3.5", - "component-emitter": "^1.2.1", - "define-property": "^1.0.0", - "isobject": "^3.0.1", - "mixin-deep": "^1.2.0", - "pascalcase": "^0.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/base/node_modules/define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "dependencies": { - "is-descriptor": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/base/node_modules/is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "dependencies": { - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/base/node_modules/is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "dependencies": { - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/base/node_modules/is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "dependencies": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", - "dev": true, - "dependencies": { - "tweetnacl": "^0.14.3" - } - }, - "node_modules/binary-extensions": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", - "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/bindings": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", - "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", - "dev": true, - "optional": true, - "dependencies": { - "file-uri-to-path": "1.0.0" - } - }, - "node_modules/boxen": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/boxen/-/boxen-1.3.0.tgz", - "integrity": "sha512-TNPjfTr432qx7yOjQyaXm3dSR0MH9vXp7eT1BFSl/C51g+EFnOR9hTg1IreahGBmDNCehscshe45f+C1TBZbLw==", - "dev": true, - "dependencies": { - "ansi-align": "^2.0.0", - "camelcase": "^4.0.0", - "chalk": "^2.0.1", - "cli-boxes": "^1.0.0", - "string-width": "^2.0.0", - "term-size": "^1.2.0", - "widest-line": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, - "dependencies": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/braces/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/browser-stdout": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", - "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", - "dev": true - }, - "node_modules/browserstack-local": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/browserstack-local/-/browserstack-local-1.5.1.tgz", - "integrity": "sha512-T/wxyWDzvBHbDvl7fZKpFU7mYze6nrUkBhNy+d+8bXBqgQX10HTYvajIGO0wb49oGSLCPM0CMZTV/s7e6LF0sA==", - "dev": true, - "dependencies": { - "agent-base": "^6.0.2", - "https-proxy-agent": "^5.0.1", - "is-running": "^2.1.0", - "ps-tree": "=1.2.0", - "temp-fs": "^0.9.9" - } - }, - "node_modules/cache-base": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", - "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", - "dev": true, - "dependencies": { - "collection-visit": "^1.0.0", - "component-emitter": "^1.2.1", - "get-value": "^2.0.6", - "has-value": "^1.0.0", - "isobject": "^3.0.1", - "set-value": "^2.0.0", - "to-object-path": "^0.3.0", - "union-value": "^1.0.0", - "unset-value": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/call-bind-apply-helpers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", - "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", - "dev": true, - "dependencies": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/camelcase": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/capture-stack-trace": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.1.tgz", - "integrity": "sha512-mYQLZnx5Qt1JgB1WEiMCf2647plpGeQ2NMR/5L0HNZzGQo4fuSPnK+wjfPnKZV0aiJDgzmWqqkV/g7JD+DW0qw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", - "dev": true - }, - "node_modules/chai": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/chai/-/chai-4.2.0.tgz", - "integrity": "sha512-XQU3bhBukrOsQCuwZndwGcCVQHyZi53fQ6Ys1Fym7E4olpIqqZZhhoFJoaKVvV17lWQoXYwgWN2nF5crA8J2jw==", - "dev": true, - "dependencies": { - "assertion-error": "^1.1.0", - "check-error": "^1.0.2", - "deep-eql": "^3.0.1", - "get-func-name": "^2.0.0", - "pathval": "^1.1.0", - "type-detect": "^4.0.5" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/chardet": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", - "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", - "dev": true - }, - "node_modules/check-error": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", - "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/chokidar": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", - "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", - "dev": true, - "dependencies": { - "anymatch": "^2.0.0", - "async-each": "^1.0.1", - "braces": "^2.3.2", - "glob-parent": "^3.1.0", - "inherits": "^2.0.3", - "is-binary-path": "^1.0.0", - "is-glob": "^4.0.0", - "normalize-path": "^3.0.0", - "path-is-absolute": "^1.0.0", - "readdirp": "^2.2.1", - "upath": "^1.1.1" - }, - "optionalDependencies": { - "fsevents": "^1.2.7" - } - }, - "node_modules/ci-info": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.6.0.tgz", - "integrity": "sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A==", - "dev": true - }, - "node_modules/class-utils": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", - "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", - "dev": true, - "dependencies": { - "arr-union": "^3.1.0", - "define-property": "^0.2.5", - "isobject": "^3.0.0", - "static-extend": "^0.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/class-utils/node_modules/define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "dependencies": { - "is-descriptor": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/cli-boxes": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-1.0.0.tgz", - "integrity": "sha1-T6kXw+WclKAEzWH47lCdplFocUM=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/cli-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", - "dev": true, - "dependencies": { - "restore-cursor": "^3.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cli-width": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", - "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", - "dev": true - }, - "node_modules/cliui": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", - "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", - "dev": true, - "dependencies": { - "string-width": "^3.1.0", - "strip-ansi": "^5.2.0", - "wrap-ansi": "^5.1.0" - } - }, - "node_modules/cliui/node_modules/ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/cliui/node_modules/emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", - "dev": true - }, - "node_modules/cliui/node_modules/string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "dependencies": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/cliui/node_modules/strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "dependencies": { - "ansi-regex": "^4.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/collection-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", - "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", - "dev": true, - "dependencies": { - "map-visit": "^1.0.0", - "object-visit": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true - }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dev": true, - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true - }, - "node_modules/component-emitter": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", - "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", - "dev": true - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true - }, - "node_modules/configstore": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/configstore/-/configstore-3.1.2.tgz", - "integrity": "sha512-vtv5HtGjcYUgFrXc6Kx747B83MRRVS5R1VTEQoXvuP+kMI+if6uywV0nDGoiydJRy4yk7h9od5Og0kxx4zUXmw==", - "dev": true, - "dependencies": { - "dot-prop": "^4.1.0", - "graceful-fs": "^4.1.2", - "make-dir": "^1.0.0", - "unique-string": "^1.0.0", - "write-file-atomic": "^2.0.0", - "xdg-basedir": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/copy-descriptor": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", - "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true - }, - "node_modules/create-error-class": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/create-error-class/-/create-error-class-3.0.2.tgz", - "integrity": "sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y=", - "dev": true, - "dependencies": { - "capture-stack-trace": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/cross-spawn": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", - "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", - "dev": true, - "dependencies": { - "lru-cache": "^4.0.1", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - }, - "node_modules/crypto-random-string": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz", - "integrity": "sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/cssstyle": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-3.0.0.tgz", - "integrity": "sha512-N4u2ABATi3Qplzf0hWbVCdjenim8F3ojEXpBDF5hBpjzW182MjNGLqfmQ0SkSPeQ+V86ZXgeH8aXj6kayd4jgg==", - "dev": true, - "dependencies": { - "rrweb-cssom": "^0.6.0" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", - "dev": true, - "dependencies": { - "assert-plus": "^1.0.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/data-urls": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-4.0.0.tgz", - "integrity": "sha512-/mMTei/JXPqvFqQtfyTowxmJVwr2PVAeCcDxyFf6LhoOu/09TX2OX3kb2wzi4DMXcfj4OItwDOnhl5oziPnT6g==", - "dev": true, - "dependencies": { - "abab": "^2.0.6", - "whatwg-mimetype": "^3.0.0", - "whatwg-url": "^12.0.0" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "dev": true, - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/debug/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "node_modules/decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/decimal.js": { - "version": "10.5.0", - "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.5.0.tgz", - "integrity": "sha512-8vDa8Qxvr/+d94hSh5P3IJwI5t8/c0KsMp+g8bNw9cY2icONa5aPfvKeieW1WlG0WQYwwhJ7mjui2xtiePQSXw==", - "dev": true - }, - "node_modules/decode-uri-component": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", - "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", - "dev": true, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/deep-eql": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", - "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", - "dev": true, - "dependencies": { - "type-detect": "^4.0.0" - }, - "engines": { - "node": ">=0.12" - } - }, - "node_modules/deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "dev": true, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/deep-is": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", - "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", - "dev": true - }, - "node_modules/define-properties": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", - "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", - "dev": true, - "dependencies": { - "object-keys": "^1.0.12" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/define-property": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", - "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", - "dev": true, - "dependencies": { - "is-descriptor": "^1.0.2", - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/define-property/node_modules/is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "dependencies": { - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/define-property/node_modules/is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "dependencies": { - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/define-property/node_modules/is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "dependencies": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/diff": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", - "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", - "dev": true, - "engines": { - "node": ">=0.3.1" - } - }, - "node_modules/doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/domexception": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/domexception/-/domexception-4.0.0.tgz", - "integrity": "sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw==", - "deprecated": "Use your platform's native DOMException instead", - "dev": true, - "dependencies": { - "webidl-conversions": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/dot-prop": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.0.tgz", - "integrity": "sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ==", - "dev": true, - "dependencies": { - "is-obj": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/dotenv": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.2.0.tgz", - "integrity": "sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/dunder-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", - "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", - "dev": true, - "dependencies": { - "call-bind-apply-helpers": "^1.0.1", - "es-errors": "^1.3.0", - "gopd": "^1.2.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/duplexer": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", - "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", - "dev": true - }, - "node_modules/duplexer3": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", - "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=", - "dev": true - }, - "node_modules/ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", - "dev": true, - "dependencies": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" - } - }, - "node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "node_modules/entities": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.0.tgz", - "integrity": "sha512-aKstq2TDOndCn4diEyp9Uq/Flu2i1GlLkc6XIDQSDMuaFE3OPW5OphLCyQ5SpSJZTb4reN+kTcYru5yIfXoRPw==", - "dev": true, - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/es-abstract": { - "version": "1.17.6", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.6.tgz", - "integrity": "sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw==", - "dev": true, - "dependencies": { - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1", - "is-callable": "^1.2.0", - "is-regex": "^1.1.0", - "object-inspect": "^1.7.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.0", - "string.prototype.trimend": "^1.0.1", - "string.prototype.trimstart": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-define-property": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", - "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", - "dev": true, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-errors": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", - "dev": true, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-object-atoms": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", - "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", - "dev": true, - "dependencies": { - "es-errors": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-set-tostringtag": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", - "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", - "dev": true, - "dependencies": { - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.6", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "dev": true, - "dependencies": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/escodegen": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", - "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", - "dev": true, - "dependencies": { - "esprima": "^4.0.1", - "estraverse": "^5.2.0", - "esutils": "^2.0.2" - }, - "bin": { - "escodegen": "bin/escodegen.js", - "esgenerate": "bin/esgenerate.js" - }, - "engines": { - "node": ">=6.0" - }, - "optionalDependencies": { - "source-map": "~0.6.1" - } - }, - "node_modules/escodegen/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/eslint": { - "version": "6.7.2", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-6.7.2.tgz", - "integrity": "sha512-qMlSWJaCSxDFr8fBPvJM9kJwbazrhNcBU3+DszDW1OlEwKBBRWsJc7NJFelvwQpanHCR14cOLD41x8Eqvo3Nng==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.0.0", - "ajv": "^6.10.0", - "chalk": "^2.1.0", - "cross-spawn": "^6.0.5", - "debug": "^4.0.1", - "doctrine": "^3.0.0", - "eslint-scope": "^5.0.0", - "eslint-utils": "^1.4.3", - "eslint-visitor-keys": "^1.1.0", - "espree": "^6.1.2", - "esquery": "^1.0.1", - "esutils": "^2.0.2", - "file-entry-cache": "^5.0.1", - "functional-red-black-tree": "^1.0.1", - "glob-parent": "^5.0.0", - "globals": "^12.1.0", - "ignore": "^4.0.6", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "inquirer": "^7.0.0", - "is-glob": "^4.0.0", - "js-yaml": "^3.13.1", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.3.0", - "lodash": "^4.17.14", - "minimatch": "^3.0.4", - "mkdirp": "^0.5.1", - "natural-compare": "^1.4.0", - "optionator": "^0.8.3", - "progress": "^2.0.0", - "regexpp": "^2.0.1", - "semver": "^6.1.2", - "strip-ansi": "^5.2.0", - "strip-json-comments": "^3.0.1", - "table": "^5.2.3", - "text-table": "^0.2.0", - "v8-compile-cache": "^2.0.3" - }, - "bin": { - "eslint": "bin/eslint.js" - }, - "engines": { - "node": "^8.10.0 || ^10.13.0 || >=11.10.1" - } - }, - "node_modules/eslint-scope": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.0.0.tgz", - "integrity": "sha512-oYrhJW7S0bxAFDvWqzvMPRm6pcgcnWc4QnofCAqRTRfQC0JcwenzGglTtsLyIuuWFfkqDG9vz67cnttSd53djw==", - "dev": true, - "dependencies": { - "esrecurse": "^4.1.0", - "estraverse": "^4.1.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/eslint-utils": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz", - "integrity": "sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==", - "dev": true, - "dependencies": { - "eslint-visitor-keys": "^1.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/eslint-visitor-keys": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz", - "integrity": "sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/eslint/node_modules/ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/eslint/node_modules/cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "dev": true, - "dependencies": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - }, - "engines": { - "node": ">=4.8" - } - }, - "node_modules/eslint/node_modules/cross-spawn/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true, - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/eslint/node_modules/debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/eslint/node_modules/glob-parent": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.0.tgz", - "integrity": "sha512-qjtRgnIVmOfnKUE3NJAQEdk+lKrxfw8t5ke7SXtfMTHcjsBfOfWXCQfdb30zfDoZQ2IRSIiidmjtbHZPZ++Ihw==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/eslint/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "node_modules/eslint/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/eslint/node_modules/strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "dependencies": { - "ansi-regex": "^4.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/eslint/node_modules/strip-json-comments": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.0.1.tgz", - "integrity": "sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/espree": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/espree/-/espree-6.1.2.tgz", - "integrity": "sha512-2iUPuuPP+yW1PZaMSDM9eyVf8D5P0Hi8h83YtZ5bPc/zHYjII5khoixIUTMO794NOY8F/ThF1Bo8ncZILarUTA==", - "dev": true, - "dependencies": { - "acorn": "^7.1.0", - "acorn-jsx": "^5.1.0", - "eslint-visitor-keys": "^1.1.0" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/espree/node_modules/acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true, - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/esquery": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.1.tgz", - "integrity": "sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA==", - "dev": true, - "dependencies": { - "estraverse": "^4.0.0" - }, - "engines": { - "node": ">=0.6" - } - }, - "node_modules/esrecurse": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", - "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", - "dev": true, - "dependencies": { - "estraverse": "^4.1.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/event-stream": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/event-stream/-/event-stream-3.3.4.tgz", - "integrity": "sha512-QHpkERcGsR0T7Qm3HNJSyXKEEj8AHNxkY3PK8TS2KJvQ7NiSHe3DDpwVKKtoYprL/AreyzFBeIkBIWChAqn60g==", - "dev": true, - "dependencies": { - "duplexer": "~0.1.1", - "from": "~0", - "map-stream": "~0.1.0", - "pause-stream": "0.0.11", - "split": "0.3", - "stream-combiner": "~0.0.4", - "through": "~2.3.1" - } - }, - "node_modules/execa": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", - "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", - "dev": true, - "dependencies": { - "cross-spawn": "^5.0.1", - "get-stream": "^3.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/expand-brackets": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", - "dev": true, - "dependencies": { - "debug": "^2.3.3", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "posix-character-classes": "^0.1.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/expand-brackets/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/expand-brackets/node_modules/define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "dependencies": { - "is-descriptor": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/expand-brackets/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "dev": true - }, - "node_modules/extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "dev": true, - "dependencies": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/extend-shallow/node_modules/is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "dependencies": { - "is-plain-object": "^2.0.4" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/external-editor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", - "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", - "dev": true, - "dependencies": { - "chardet": "^0.7.0", - "iconv-lite": "^0.4.24", - "tmp": "^0.0.33" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", - "dev": true, - "dependencies": { - "array-unique": "^0.3.2", - "define-property": "^1.0.0", - "expand-brackets": "^2.1.4", - "extend-shallow": "^2.0.1", - "fragment-cache": "^0.2.1", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/extglob/node_modules/define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "dependencies": { - "is-descriptor": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/extglob/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/extglob/node_modules/is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "dependencies": { - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/extglob/node_modules/is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "dependencies": { - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/extglob/node_modules/is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "dependencies": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", - "dev": true, - "engines": [ - "node >=0.6.0" - ] - }, - "node_modules/fast-deep-equal": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", - "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", - "dev": true - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", - "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", - "dev": true - }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", - "dev": true - }, - "node_modules/figures": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-3.1.0.tgz", - "integrity": "sha512-ravh8VRXqHuMvZt/d8GblBeqDMkdJMBdv/2KntFH+ra5MXkO7nxNKpzQ3n6QD/2da1kH0aWmNISdvhM7gl2gVg==", - "dev": true, - "dependencies": { - "escape-string-regexp": "^1.0.5" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/file-entry-cache": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", - "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==", - "dev": true, - "dependencies": { - "flat-cache": "^2.0.1" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/file-uri-to-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", - "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", - "dev": true, - "optional": true - }, - "node_modules/fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dev": true, - "dependencies": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/fill-range/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "dependencies": { - "locate-path": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/flat": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/flat/-/flat-4.1.0.tgz", - "integrity": "sha512-Px/TiLIznH7gEDlPXcUD4KnBusa6kR6ayRUVcnEAbreRIuhkqow/mun59BuRXwoYk7ZQOLW1ZM05ilIvK38hFw==", - "dev": true, - "dependencies": { - "is-buffer": "~2.0.3" - }, - "bin": { - "flat": "cli.js" - } - }, - "node_modules/flat-cache": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", - "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", - "dev": true, - "dependencies": { - "flatted": "^2.0.0", - "rimraf": "2.6.3", - "write": "1.0.3" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/flat/node_modules/is-buffer": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.4.tgz", - "integrity": "sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/flatted": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.1.tgz", - "integrity": "sha512-a1hQMktqW9Nmqr5aktAux3JMNqaucxGcjtjWnZLHX7yyPCmlSV3M54nGYbqT8K+0GhF3NBgmJCc3ma+WOgX8Jg==", - "dev": true - }, - "node_modules/for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "dev": true, - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 0.12" - } - }, - "node_modules/fragment-cache": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", - "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", - "dev": true, - "dependencies": { - "map-cache": "^0.2.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/from": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/from/-/from-0.1.7.tgz", - "integrity": "sha512-twe20eF1OxVxp/ML/kq2p1uc6KvFK/+vs8WjEbeKmV2He22MKm7YF2ANIt+EOqhJ5L3K/SuuPhk0hWQDjOM23g==", - "dev": true - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true - }, - "node_modules/fsevents": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", - "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "dependencies": { - "bindings": "^1.5.0", - "nan": "^2.12.1" - }, - "engines": { - "node": ">= 4.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", - "dev": true - }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true, - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/get-func-name": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", - "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/get-intrinsic": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", - "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", - "dev": true, - "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "es-define-property": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.1.1", - "function-bind": "^1.1.2", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "has-symbols": "^1.1.0", - "hasown": "^2.0.2", - "math-intrinsics": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", - "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", - "dev": true, - "dependencies": { - "dunder-proto": "^1.0.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/get-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/get-value": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", - "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", - "dev": true, - "dependencies": { - "assert-plus": "^1.0.0" - } - }, - "node_modules/glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - } - }, - "node_modules/glob-parent": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", - "dev": true, - "dependencies": { - "is-glob": "^3.1.0", - "path-dirname": "^1.0.0" - } - }, - "node_modules/glob-parent/node_modules/is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "dev": true, - "dependencies": { - "is-extglob": "^2.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/global-dirs": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz", - "integrity": "sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU=", - "dev": true, - "dependencies": { - "ini": "^1.3.4" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/globals": { - "version": "12.3.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-12.3.0.tgz", - "integrity": "sha512-wAfjdLgFsPZsklLJvOBUBmzYE8/CwhEqSBEMRXA3qxIiNtyqvjYurAtIfDh6chlEPUfmTY3MnZh5Hfh4q0UlIw==", - "dev": true, - "dependencies": { - "type-fest": "^0.8.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/gopd": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", - "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/got": { - "version": "6.7.1", - "resolved": "https://registry.npmjs.org/got/-/got-6.7.1.tgz", - "integrity": "sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA=", - "dev": true, - "dependencies": { - "create-error-class": "^3.0.0", - "duplexer3": "^0.1.4", - "get-stream": "^3.0.0", - "is-redirect": "^1.0.0", - "is-retry-allowed": "^1.0.0", - "is-stream": "^1.0.0", - "lowercase-keys": "^1.0.0", - "safe-buffer": "^5.0.1", - "timed-out": "^4.0.0", - "unzip-response": "^2.0.1", - "url-parse-lax": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.1.tgz", - "integrity": "sha512-b9usnbDGnD928gJB3LrCmxoibr3VE4U2SMo5PBuBnokWyDADTqDPXg4YpwKF1trpH+UbGp7QLicO3+aWEy0+mw==", - "dev": true - }, - "node_modules/growl": { - "version": "1.10.5", - "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", - "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", - "dev": true, - "engines": { - "node": ">=4.x" - } - }, - "node_modules/handlebars": { - "version": "4.7.6", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.6.tgz", - "integrity": "sha512-1f2BACcBfiwAfStCKZNrUCgqNZkGsAT7UM3kkYtXuLo0KnaVfjKOyf7PRzB6++aK9STyT1Pd2ZCPe3EGOXleXA==", - "dev": true, - "dependencies": { - "minimist": "^1.2.5", - "neo-async": "^2.6.0", - "source-map": "^0.6.1", - "uglify-js": "^3.1.4", - "wordwrap": "^1.0.0" - }, - "bin": { - "handlebars": "bin/handlebars" - }, - "engines": { - "node": ">=0.4.7" - } - }, - "node_modules/har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/har-validator": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", - "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", - "dev": true, - "dependencies": { - "ajv": "^6.5.5", - "har-schema": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.1" - }, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/has-symbols": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", - "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-tostringtag": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", - "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", - "dev": true, - "dependencies": { - "has-symbols": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", - "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", - "dev": true, - "dependencies": { - "get-value": "^2.0.6", - "has-values": "^1.0.0", - "isobject": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/has-values": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", - "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", - "dev": true, - "dependencies": { - "is-number": "^3.0.0", - "kind-of": "^4.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/has-values/node_modules/kind-of": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", - "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", - "dev": true, - "bin": { - "he": "bin/he" - } - }, - "node_modules/html-encoding-sniffer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz", - "integrity": "sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==", - "dev": true, - "dependencies": { - "whatwg-encoding": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/http-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", - "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", - "dev": true, - "dependencies": { - "@tootallnate/once": "2", - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/http-proxy-agent/node_modules/debug": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", - "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", - "dev": true, - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/http-proxy-agent/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true - }, - "node_modules/http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", - "dev": true, - "dependencies": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - }, - "engines": { - "node": ">=0.8", - "npm": ">=1.3.7" - } - }, - "node_modules/https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", - "dev": true, - "dependencies": { - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/https-proxy-agent/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/https-proxy-agent/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/ignore-by-default": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", - "integrity": "sha1-SMptcvbGo68Aqa1K5odr44ieKwk=", - "dev": true - }, - "node_modules/immediate": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", - "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==", - "dev": true - }, - "node_modules/import-fresh": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz", - "integrity": "sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==", - "dev": true, - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/import-lazy": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", - "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true, - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "node_modules/ini": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", - "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/inquirer": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.0.0.tgz", - "integrity": "sha512-rSdC7zelHdRQFkWnhsMu2+2SO41mpv2oF2zy4tMhmiLWkcKbOAs87fWAJhVXttKVwhdZvymvnuM95EyEXg2/tQ==", - "dev": true, - "dependencies": { - "ansi-escapes": "^4.2.1", - "chalk": "^2.4.2", - "cli-cursor": "^3.1.0", - "cli-width": "^2.0.0", - "external-editor": "^3.0.3", - "figures": "^3.0.0", - "lodash": "^4.17.15", - "mute-stream": "0.0.8", - "run-async": "^2.2.0", - "rxjs": "^6.4.0", - "string-width": "^4.1.0", - "strip-ansi": "^5.1.0", - "through": "^2.3.6" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/inquirer/node_modules/ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/inquirer/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/inquirer/node_modules/string-width": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", - "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/inquirer/node_modules/string-width/node_modules/strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/inquirer/node_modules/strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "dependencies": { - "ansi-regex": "^4.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/inquirer/node_modules/strip-ansi/node_modules/ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-accessor-descriptor/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-binary-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", - "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", - "dev": true, - "dependencies": { - "binary-extensions": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, - "node_modules/is-callable": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.0.tgz", - "integrity": "sha512-pyVD9AaGLxtg6srb2Ng6ynWJqkHU9bEM087AKck0w8QwDarTfNcpIYoU8x8Hv2Icm8u6kFJM18Dag8lyqGkviw==", - "dev": true, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/is-ci": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-1.2.1.tgz", - "integrity": "sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg==", - "dev": true, - "dependencies": { - "ci-info": "^1.5.0" - }, - "bin": { - "is-ci": "bin.js" - } - }, - "node_modules/is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-data-descriptor/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-date-object": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", - "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==", - "dev": true, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "dependencies": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-descriptor/node_modules/kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/is-glob": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", - "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", - "dev": true, - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-installed-globally": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.1.0.tgz", - "integrity": "sha1-Df2Y9akRFxbdU13aZJL2e/PSWoA=", - "dev": true, - "dependencies": { - "global-dirs": "^0.1.0", - "is-path-inside": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/is-npm": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-1.0.0.tgz", - "integrity": "sha1-8vtjpl5JBbQGyGBydloaTceTufQ=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-number/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", - "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-path-inside": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", - "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", - "dev": true, - "dependencies": { - "path-is-inside": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "dev": true, - "dependencies": { - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-potential-custom-element-name": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", - "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", - "dev": true - }, - "node_modules/is-promise": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", - "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", - "dev": true - }, - "node_modules/is-redirect": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-redirect/-/is-redirect-1.0.0.tgz", - "integrity": "sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.0.tgz", - "integrity": "sha512-iI97M8KTWID2la5uYXlkbSDQIg4F6o1sYboZKKTDpnDQMLtUL86zxhgDet3Q2SriaYsyGqZ6Mn2SjbRKeLHdqw==", - "dev": true, - "dependencies": { - "has-symbols": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/is-retry-allowed": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz", - "integrity": "sha1-EaBgVotnM5REAz0BJaYaINVk+zQ=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-running": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-running/-/is-running-2.1.0.tgz", - "integrity": "sha512-mjJd3PujZMl7j+D395WTIO5tU5RIDBfVSRtRR4VOJou3H66E38UjbjvDGh3slJzPuolsb+yQFqwHNNdyp5jg3w==", - "dev": true - }, - "node_modules/is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-symbol": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", - "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", - "dev": true, - "dependencies": { - "has-symbols": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", - "dev": true - }, - "node_modules/is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true - }, - "node_modules/isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", - "dev": true - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "node_modules/js-yaml": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", - "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", - "dev": true, - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", - "dev": true - }, - "node_modules/jsdom": { - "version": "21.1.2", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-21.1.2.tgz", - "integrity": "sha512-sCpFmK2jv+1sjff4u7fzft+pUh2KSUbUrEHYHyfSIbGTIcmnjyp83qg6qLwdJ/I3LpTXx33ACxeRL7Lsyc6lGQ==", - "dev": true, - "dependencies": { - "abab": "^2.0.6", - "acorn": "^8.8.2", - "acorn-globals": "^7.0.0", - "cssstyle": "^3.0.0", - "data-urls": "^4.0.0", - "decimal.js": "^10.4.3", - "domexception": "^4.0.0", - "escodegen": "^2.0.0", - "form-data": "^4.0.0", - "html-encoding-sniffer": "^3.0.0", - "http-proxy-agent": "^5.0.0", - "https-proxy-agent": "^5.0.1", - "is-potential-custom-element-name": "^1.0.1", - "nwsapi": "^2.2.4", - "parse5": "^7.1.2", - "rrweb-cssom": "^0.6.0", - "saxes": "^6.0.0", - "symbol-tree": "^3.2.4", - "tough-cookie": "^4.1.2", - "w3c-xmlserializer": "^4.0.0", - "webidl-conversions": "^7.0.0", - "whatwg-encoding": "^2.0.0", - "whatwg-mimetype": "^3.0.0", - "whatwg-url": "^12.0.1", - "ws": "^8.13.0", - "xml-name-validator": "^4.0.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "canvas": "^2.5.0" - }, - "peerDependenciesMeta": { - "canvas": { - "optional": true - } - } - }, - "node_modules/jsdom/node_modules/form-data": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.2.tgz", - "integrity": "sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==", - "dev": true, - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "es-set-tostringtag": "^2.1.0", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/jsdom/node_modules/tough-cookie": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.4.tgz", - "integrity": "sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==", - "dev": true, - "dependencies": { - "psl": "^1.1.33", - "punycode": "^2.1.1", - "universalify": "^0.2.0", - "url-parse": "^1.5.3" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/json-schema": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", - "dev": true - }, - "node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "node_modules/json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", - "dev": true - }, - "node_modules/json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", - "dev": true - }, - "node_modules/jsprim": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", - "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", - "dev": true, - "engines": [ - "node >=0.6.0" - ], - "dependencies": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.2.3", - "verror": "1.10.0" - } - }, - "node_modules/jszip": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.10.0.tgz", - "integrity": "sha512-LDfVtOLtOxb9RXkYOwPyNBTQDL4eUbqahtoY6x07GiDJHwSYvn8sHHIw8wINImV3MqbMNve2gSuM1DDqEKk09Q==", - "dev": true, - "dependencies": { - "lie": "~3.3.0", - "pako": "~1.0.2", - "readable-stream": "~2.3.6", - "setimmediate": "^1.0.5" - } - }, - "node_modules/kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/latest-version": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-3.1.0.tgz", - "integrity": "sha1-ogU4P+oyKzO1rjsYq+4NwvNW7hU=", - "dev": true, - "dependencies": { - "package-json": "^4.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", - "dev": true, - "dependencies": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/lie": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", - "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", - "dev": true, - "dependencies": { - "immediate": "~3.0.5" - } - }, - "node_modules/locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "dependencies": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/lodash": { - "version": "4.17.15", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", - "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", - "dev": true - }, - "node_modules/log-symbols": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", - "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", - "dev": true, - "dependencies": { - "chalk": "^2.0.1" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/lowercase-keys": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", - "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/lru-cache": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", - "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", - "dev": true, - "dependencies": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" - } - }, - "node_modules/make-dir": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", - "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", - "dev": true, - "dependencies": { - "pify": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/map-cache": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", - "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/map-stream": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/map-stream/-/map-stream-0.1.0.tgz", - "integrity": "sha512-CkYQrPYZfWnu/DAmVCpTSX/xHpKZ80eKh2lAkyA6AJTef6bW+6JpbQZN5rofum7da+SyN1bi5ctTm+lTfcCW3g==", - "dev": true - }, - "node_modules/map-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", - "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", - "dev": true, - "dependencies": { - "object-visit": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/math-intrinsics": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", - "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", - "dev": true, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, - "dependencies": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/mime-db": { - "version": "1.43.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.43.0.tgz", - "integrity": "sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.26", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.26.tgz", - "integrity": "sha512-01paPWYgLrkqAyrlDorC1uDwl2p3qZT7yl806vW7DvDoxwXi46jsjFbg+WdwotBIk6/MbEhO/dh5aZ5sNj/dWQ==", - "dev": true, - "dependencies": { - "mime-db": "1.43.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", - "dev": true - }, - "node_modules/mixin-deep": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", - "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", - "dev": true, - "dependencies": { - "for-in": "^1.0.2", - "is-extendable": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/mixin-deep/node_modules/is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "dependencies": { - "is-plain-object": "^2.0.4" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "dev": true, - "dependencies": { - "minimist": "^1.2.5" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, - "node_modules/mocha": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-6.2.3.tgz", - "integrity": "sha512-0R/3FvjIGH3eEuG17ccFPk117XL2rWxatr81a57D+r/x2uTYZRbdZ4oVidEUMh2W2TJDa7MdAb12Lm2/qrKajg==", - "dev": true, - "dependencies": { - "ansi-colors": "3.2.3", - "browser-stdout": "1.3.1", - "debug": "3.2.6", - "diff": "3.5.0", - "escape-string-regexp": "1.0.5", - "find-up": "3.0.0", - "glob": "7.1.3", - "growl": "1.10.5", - "he": "1.2.0", - "js-yaml": "3.13.1", - "log-symbols": "2.2.0", - "minimatch": "3.0.4", - "mkdirp": "0.5.4", - "ms": "2.1.1", - "node-environment-flags": "1.0.5", - "object.assign": "4.1.0", - "strip-json-comments": "2.0.1", - "supports-color": "6.0.0", - "which": "1.3.1", - "wide-align": "1.1.3", - "yargs": "13.3.2", - "yargs-parser": "13.1.2", - "yargs-unparser": "1.6.0" - }, - "bin": { - "_mocha": "bin/_mocha", - "mocha": "bin/mocha" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/mocha/node_modules/glob": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", - "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - } - }, - "node_modules/mocha/node_modules/mkdirp": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.4.tgz", - "integrity": "sha512-iG9AK/dJLtJ0XNgTuDbSyNS3zECqDlAhnQW4CsNxBG3LQJBbHmRX1egw39DmtOdCAqY+dKXV+sgPgilNWUKMVw==", - "dev": true, - "dependencies": { - "minimist": "^1.2.5" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, - "node_modules/mocha/node_modules/ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", - "dev": true - }, - "node_modules/mocha/node_modules/supports-color": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.0.0.tgz", - "integrity": "sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, - "node_modules/mute-stream": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", - "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", - "dev": true - }, - "node_modules/nan": { - "version": "2.14.1", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.1.tgz", - "integrity": "sha512-isWHgVjnFjh2x2yuJ/tj3JbwoHu3UC2dX5G/88Cm24yB6YopVgxvBObDY7n5xW6ExmFhJpSEQqFPvq9zaXc8Jw==", - "dev": true, - "optional": true - }, - "node_modules/nanomatch": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", - "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", - "dev": true, - "dependencies": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "fragment-cache": "^0.2.1", - "is-windows": "^1.0.2", - "kind-of": "^6.0.2", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", - "dev": true - }, - "node_modules/neo-async": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.1.tgz", - "integrity": "sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==", - "dev": true - }, - "node_modules/nice-try": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", - "dev": true - }, - "node_modules/node-environment-flags": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/node-environment-flags/-/node-environment-flags-1.0.5.tgz", - "integrity": "sha512-VNYPRfGfmZLx0Ye20jWzHUjyTW/c+6Wq+iLhDzUI4XmhrDd9l/FozXV3F2xOaXjvp0co0+v1YSR3CMP6g+VvLQ==", - "dev": true, - "dependencies": { - "object.getownpropertydescriptors": "^2.0.3", - "semver": "^5.7.0" - } - }, - "node_modules/nodemon": { - "version": "1.19.4", - "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-1.19.4.tgz", - "integrity": "sha512-VGPaqQBNk193lrJFotBU8nvWZPqEZY2eIzymy2jjY0fJ9qIsxA0sxQ8ATPl0gZC645gijYEc1jtZvpS8QWzJGQ==", - "dev": true, - "hasInstallScript": true, - "dependencies": { - "chokidar": "^2.1.8", - "debug": "^3.2.6", - "ignore-by-default": "^1.0.1", - "minimatch": "^3.0.4", - "pstree.remy": "^1.1.7", - "semver": "^5.7.1", - "supports-color": "^5.5.0", - "touch": "^3.1.0", - "undefsafe": "^2.0.2", - "update-notifier": "^2.5.0" - }, - "bin": { - "nodemon": "bin/nodemon.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/nodemon/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true, - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/nopt": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", - "integrity": "sha1-bd0hvSoxQXuScn3Vhfim83YI6+4=", - "dev": true, - "dependencies": { - "abbrev": "1" - }, - "bin": { - "nopt": "bin/nopt.js" - } - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/npm-run-path": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", - "dev": true, - "dependencies": { - "path-key": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/nwsapi": { - "version": "2.2.20", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.20.tgz", - "integrity": "sha512-/ieB+mDe4MrrKMT8z+mQL8klXydZWGR5Dowt4RAGKbJ3kIGEx3X4ljUo+6V73IXtUPWgfOlU5B9MlGxFO5T+cA==", - "dev": true - }, - "node_modules/oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/object-copy": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", - "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", - "dev": true, - "dependencies": { - "copy-descriptor": "^0.1.0", - "define-property": "^0.2.5", - "kind-of": "^3.0.3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-copy/node_modules/define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "dependencies": { - "is-descriptor": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-copy/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-inspect": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.7.0.tgz", - "integrity": "sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw==", - "dev": true - }, - "node_modules/object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object-visit": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", - "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", - "dev": true, - "dependencies": { - "isobject": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object.assign": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", - "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", - "dev": true, - "dependencies": { - "define-properties": "^1.1.2", - "function-bind": "^1.1.1", - "has-symbols": "^1.0.0", - "object-keys": "^1.0.11" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.getownpropertydescriptors": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.0.tgz", - "integrity": "sha512-Z53Oah9A3TdLoblT7VKJaTDdXdT+lQO+cNpKVnya5JDe9uLvzu1YyY1yFDFrcxrlRgWrEFH0jJtD/IbuwjcEVg==", - "dev": true, - "dependencies": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.0-next.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/object.pick": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", - "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", - "dev": true, - "dependencies": { - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/onetime": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.0.tgz", - "integrity": "sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q==", - "dev": true, - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/optionator": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", - "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", - "dev": true, - "dependencies": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.6", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "word-wrap": "~1.2.3" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/p-limit": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.2.tgz", - "integrity": "sha512-WGR+xHecKTr7EbUEhyLSh5Dube9JtdiG78ufaeLxTgpudf/20KqyMioIUZJAezlTIi6evxuoUs9YXc11cU+yzQ==", - "dev": true, - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "dependencies": { - "p-limit": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/package-json": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/package-json/-/package-json-4.0.1.tgz", - "integrity": "sha1-iGmgQBJTZhxMTKPabCEh7VVfXu0=", - "dev": true, - "dependencies": { - "got": "^6.7.1", - "registry-auth-token": "^3.0.1", - "registry-url": "^3.0.3", - "semver": "^5.1.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/pako": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", - "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", - "dev": true - }, - "node_modules/parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/parse5": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.3.0.tgz", - "integrity": "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==", - "dev": true, - "dependencies": { - "entities": "^6.0.0" - }, - "funding": { - "url": "https://github.com/inikulin/parse5?sponsor=1" - } - }, - "node_modules/pascalcase": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", - "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-dirname": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", - "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", - "dev": true - }, - "node_modules/path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-is-inside": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", - "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", - "dev": true - }, - "node_modules/path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/pathval": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.0.tgz", - "integrity": "sha1-uULm1L3mUwBe9rcTYd74cn0GReA=", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/pause-stream": { - "version": "0.0.11", - "resolved": "https://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz", - "integrity": "sha512-e3FBlXLmN/D1S+zHzanP4E/4Z60oFAa3O051qt1pxa7DEJWKAyil6upYVXCWadEnuoqa4Pkc9oUx9zsxYeRv8A==", - "dev": true, - "dependencies": { - "through": "~2.3" - } - }, - "node_modules/performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", - "dev": true - }, - "node_modules/pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/posix-character-classes": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", - "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", - "dev": true, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/prepend-http": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", - "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/prettier": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.2.5.tgz", - "integrity": "sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==", - "dev": true, - "bin": { - "prettier": "bin/prettier.cjs" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/prettier/prettier?sponsor=1" - } - }, - "node_modules/process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true - }, - "node_modules/progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/ps-tree": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/ps-tree/-/ps-tree-1.2.0.tgz", - "integrity": "sha512-0VnamPPYHl4uaU/nSFeZZpR21QAWRz+sRv4iW9+v/GS/J5U5iZB5BNN6J0RMoOvdx2gWM2+ZFMIm58q24e4UYA==", - "dev": true, - "dependencies": { - "event-stream": "=3.3.4" - }, - "bin": { - "ps-tree": "bin/ps-tree.js" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/pseudomap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", - "dev": true - }, - "node_modules/psl": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.7.0.tgz", - "integrity": "sha512-5NsSEDv8zY70ScRnOTn7bK7eanl2MvFrOrS/R6x+dBt5g1ghnj9Zv90kO8GwT8gxcu2ANyFprnFYB85IogIJOQ==", - "dev": true - }, - "node_modules/pstree.remy": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", - "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==", - "dev": true - }, - "node_modules/punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/qs": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", - "dev": true, - "engines": { - "node": ">=0.6" - } - }, - "node_modules/querystringify": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", - "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", - "dev": true - }, - "node_modules/rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "dev": true, - "dependencies": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "bin": { - "rc": "cli.js" - } - }, - "node_modules/readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/readdirp": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", - "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.1.11", - "micromatch": "^3.1.10", - "readable-stream": "^2.0.2" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/regex-not": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", - "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", - "dev": true, - "dependencies": { - "extend-shallow": "^3.0.2", - "safe-regex": "^1.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/regexpp": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", - "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==", - "dev": true, - "engines": { - "node": ">=6.5.0" - } - }, - "node_modules/registry-auth-token": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.4.0.tgz", - "integrity": "sha512-4LM6Fw8eBQdwMYcES4yTnn2TqIasbXuwDx3um+QRs7S55aMKCBKBxvPXl2RiUjHwuJLTyYfxSpmfSAjQpcuP+A==", - "dev": true, - "dependencies": { - "rc": "^1.1.6", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/registry-url": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-3.1.0.tgz", - "integrity": "sha1-PU74cPc93h138M+aOBQyRE4XSUI=", - "dev": true, - "dependencies": { - "rc": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/remove-trailing-separator": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", - "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", - "dev": true - }, - "node_modules/repeat-element": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", - "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", - "dev": true, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/request": { - "version": "2.88.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", - "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", - "dev": true, - "dependencies": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.0", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.4.3", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - }, - "engines": { - "node": ">= 4" - } - }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", - "dev": true - }, - "node_modules/requires-port": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", - "dev": true - }, - "node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/resolve-url": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", - "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", - "dev": true - }, - "node_modules/restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", - "dev": true, - "dependencies": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/ret": { - "version": "0.1.15", - "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", - "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", - "dev": true, - "engines": { - "node": ">=0.12" - } - }, - "node_modules/rimraf": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", - "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - } - }, - "node_modules/rrweb-cssom": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.6.0.tgz", - "integrity": "sha512-APM0Gt1KoXBz0iIkkdB/kfvGOwC4UuJFeG/c+yV7wSc7q96cG/kJ0HiYCnzivD9SB53cLV1MlHFNfOuPaadYSw==", - "dev": true - }, - "node_modules/run-async": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", - "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", - "dev": true, - "dependencies": { - "is-promise": "^2.1.0" - }, - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/rxjs": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.3.tgz", - "integrity": "sha512-wuYsAYYFdWTAnAaPoKGNhfpWwKZbJW+HgAJ+mImp+Epl7BG8oNWBCTyRM8gba9k4lk8BgWdoYm21Mo/RYhhbgA==", - "dev": true, - "dependencies": { - "tslib": "^1.9.0" - }, - "engines": { - "npm": ">=2.0.0" - } - }, - "node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "node_modules/safe-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", - "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", - "dev": true, - "dependencies": { - "ret": "~0.1.10" - } - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true - }, - "node_modules/saxes": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz", - "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==", - "dev": true, - "dependencies": { - "xmlchars": "^2.2.0" - }, - "engines": { - "node": ">=v12.22.7" - } - }, - "node_modules/selenium-webdriver": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/selenium-webdriver/-/selenium-webdriver-4.3.1.tgz", - "integrity": "sha512-TjH/ls1WKRQoFEHcqtn6UtwcLnA3yvx08v9cSSFYvyhp8hJWRtbe9ae2I8uXPisEZ2EaGKKoxBZ4EHv0BJM15g==", - "dev": true, - "dependencies": { - "jszip": "^3.10.0", - "tmp": "^0.2.1", - "ws": ">=8.7.0" - }, - "engines": { - "node": ">= 10.15.0" - } - }, - "node_modules/selenium-webdriver/node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/selenium-webdriver/node_modules/tmp": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", - "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", - "dev": true, - "dependencies": { - "rimraf": "^3.0.0" - }, - "engines": { - "node": ">=8.17.0" - } - }, - "node_modules/semver": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", - "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", - "dev": true, - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/semver-diff": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-2.1.0.tgz", - "integrity": "sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY=", - "dev": true, - "dependencies": { - "semver": "^5.0.3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", - "dev": true - }, - "node_modules/set-value": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", - "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", - "dev": true, - "dependencies": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.3", - "split-string": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/set-value/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/setimmediate": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", - "dev": true - }, - "node_modules/shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", - "dev": true, - "dependencies": { - "shebang-regex": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/signal-exit": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", - "dev": true - }, - "node_modules/slice-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", - "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.0", - "astral-regex": "^1.0.0", - "is-fullwidth-code-point": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/snapdragon": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", - "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", - "dev": true, - "dependencies": { - "base": "^0.11.1", - "debug": "^2.2.0", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "map-cache": "^0.2.2", - "source-map": "^0.5.6", - "source-map-resolve": "^0.5.0", - "use": "^3.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon-node": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", - "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", - "dev": true, - "dependencies": { - "define-property": "^1.0.0", - "isobject": "^3.0.0", - "snapdragon-util": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon-node/node_modules/define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "dependencies": { - "is-descriptor": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon-node/node_modules/is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "dependencies": { - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon-node/node_modules/is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "dependencies": { - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon-node/node_modules/is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "dependencies": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon-util": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", - "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", - "dev": true, - "dependencies": { - "kind-of": "^3.2.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon-util/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/snapdragon/node_modules/define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "dependencies": { - "is-descriptor": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon/node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-resolve": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", - "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", - "dev": true, - "dependencies": { - "atob": "^2.1.2", - "decode-uri-component": "^0.2.0", - "resolve-url": "^0.2.1", - "source-map-url": "^0.4.0", - "urix": "^0.1.0" - } - }, - "node_modules/source-map-url": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", - "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", - "dev": true - }, - "node_modules/split": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/split/-/split-0.3.3.tgz", - "integrity": "sha512-wD2AeVmxXRBoX44wAycgjVpMhvbwdI2aZjCkvfNcH1YqHQvJVa1duWc73OyVGJUc05fhFaTZeQ/PYsrmyH0JVA==", - "dev": true, - "dependencies": { - "through": "2" - }, - "engines": { - "node": "*" - } - }, - "node_modules/split-string": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", - "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", - "dev": true, - "dependencies": { - "extend-shallow": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", - "dev": true - }, - "node_modules/sshpk": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", - "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", - "dev": true, - "dependencies": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/static-extend": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", - "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", - "dev": true, - "dependencies": { - "define-property": "^0.2.5", - "object-copy": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/static-extend/node_modules/define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "dependencies": { - "is-descriptor": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/stream-combiner": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.0.4.tgz", - "integrity": "sha512-rT00SPnTVyRsaSz5zgSPma/aHSOic5U1prhYdRy5HS2kTZviFpmDgzilbtsJsxiroqACmayynDN/9VzIbX5DOw==", - "dev": true, - "dependencies": { - "duplexer": "~0.1.1" - } - }, - "node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, - "dependencies": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/string.prototype.trimend": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz", - "integrity": "sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g==", - "dev": true, - "dependencies": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.5" - } - }, - "node_modules/string.prototype.trimstart": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz", - "integrity": "sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw==", - "dev": true, - "dependencies": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.5" - } - }, - "node_modules/strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "dependencies": { - "ansi-regex": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/strip-eof": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/symbol-tree": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", - "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", - "dev": true - }, - "node_modules/table": { - "version": "5.4.6", - "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", - "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==", - "dev": true, - "dependencies": { - "ajv": "^6.10.2", - "lodash": "^4.17.14", - "slice-ansi": "^2.1.0", - "string-width": "^3.0.0" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/table/node_modules/ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/table/node_modules/emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", - "dev": true - }, - "node_modules/table/node_modules/string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "dependencies": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/table/node_modules/strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "dependencies": { - "ansi-regex": "^4.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/temp-fs": { - "version": "0.9.9", - "resolved": "https://registry.npmjs.org/temp-fs/-/temp-fs-0.9.9.tgz", - "integrity": "sha512-WfecDCR1xC9b0nsrzSaxPf3ZuWeWLUWblW4vlDQAa1biQaKHiImHnJfeQocQe/hXKMcolRzgkcVX/7kK4zoWbw==", - "dev": true, - "dependencies": { - "rimraf": "~2.5.2" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/temp-fs/node_modules/rimraf": { - "version": "2.5.4", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.5.4.tgz", - "integrity": "sha512-Lw7SHMjssciQb/rRz7JyPIy9+bbUshEucPoLRvWqy09vC5zQixl8Uet+Zl+SROBB/JMWHJRdCk1qdxNWHNMvlQ==", - "dev": true, - "dependencies": { - "glob": "^7.0.5" - }, - "bin": { - "rimraf": "bin.js" - } - }, - "node_modules/term-size": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/term-size/-/term-size-1.2.0.tgz", - "integrity": "sha1-RYuDiH8oj8Vtb/+/rSYuJmOO+mk=", - "dev": true, - "dependencies": { - "execa": "^0.7.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", - "dev": true - }, - "node_modules/through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", - "dev": true - }, - "node_modules/timed-out": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", - "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "dev": true, - "dependencies": { - "os-tmpdir": "~1.0.2" - }, - "engines": { - "node": ">=0.6.0" - } - }, - "node_modules/to-object-path": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", - "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/to-object-path/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/to-regex": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", - "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", - "dev": true, - "dependencies": { - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "regex-not": "^1.0.2", - "safe-regex": "^1.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "dev": true, - "dependencies": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/touch": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz", - "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==", - "dev": true, - "dependencies": { - "nopt": "~1.0.10" - }, - "bin": { - "nodetouch": "bin/nodetouch.js" - } - }, - "node_modules/tough-cookie": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", - "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", - "dev": true, - "dependencies": { - "psl": "^1.1.24", - "punycode": "^1.4.1" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/tough-cookie/node_modules/punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", - "dev": true - }, - "node_modules/tr46": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-4.1.1.tgz", - "integrity": "sha512-2lv/66T7e5yNyhAAC4NaKe5nVavzuGJQVVtRYLyQ2OI8tsJ61PMLlelehb0wi2Hx6+hT/OJUWZcw8MjlSRnxvw==", - "dev": true, - "dependencies": { - "punycode": "^2.3.0" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/tslib": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.10.0.tgz", - "integrity": "sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==", - "dev": true - }, - "node_modules/tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", - "dev": true, - "dependencies": { - "safe-buffer": "^5.0.1" - }, - "engines": { - "node": "*" - } - }, - "node_modules/tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", - "dev": true - }, - "node_modules/type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", - "dev": true, - "dependencies": { - "prelude-ls": "~1.1.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/uglify-js": { - "version": "3.9.4", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.9.4.tgz", - "integrity": "sha512-8RZBJq5smLOa7KslsNsVcSH+KOXf1uDU8yqLeNuVKwmT0T3FA0ZoXlinQfRad7SDcbZZRZE4ov+2v71EnxNyCA==", - "dev": true, - "dependencies": { - "commander": "~2.20.3" - }, - "bin": { - "uglifyjs": "bin/uglifyjs" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/undefsafe": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.3.tgz", - "integrity": "sha512-nrXZwwXrD/T/JXeygJqdCO6NZZ1L66HrxM/Z7mIq2oPanoN0F1nLx3lwJMu6AwJY69hdixaFQOuoYsMjE5/C2A==", - "dev": true, - "dependencies": { - "debug": "^2.2.0" - } - }, - "node_modules/undefsafe/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/union-value": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", - "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", - "dev": true, - "dependencies": { - "arr-union": "^3.1.0", - "get-value": "^2.0.6", - "is-extendable": "^0.1.1", - "set-value": "^2.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/unique-string": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz", - "integrity": "sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo=", - "dev": true, - "dependencies": { - "crypto-random-string": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/universalify": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", - "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", - "dev": true, - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/unset-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", - "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", - "dev": true, - "dependencies": { - "has-value": "^0.3.1", - "isobject": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/unset-value/node_modules/has-value": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", - "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", - "dev": true, - "dependencies": { - "get-value": "^2.0.3", - "has-values": "^0.1.4", - "isobject": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/unset-value/node_modules/has-value/node_modules/isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "dev": true, - "dependencies": { - "isarray": "1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/unset-value/node_modules/has-values": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", - "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/unzip-response": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-2.0.1.tgz", - "integrity": "sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/upath": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", - "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", - "dev": true, - "engines": { - "node": ">=4", - "yarn": "*" - } - }, - "node_modules/update-notifier": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-2.5.0.tgz", - "integrity": "sha512-gwMdhgJHGuj/+wHJJs9e6PcCszpxR1b236igrOkUofGhqJuG+amlIKwApH1IW1WWl7ovZxsX49lMBWLxSdm5Dw==", - "dev": true, - "dependencies": { - "boxen": "^1.2.1", - "chalk": "^2.0.1", - "configstore": "^3.0.0", - "import-lazy": "^2.1.0", - "is-ci": "^1.0.10", - "is-installed-globally": "^0.1.0", - "is-npm": "^1.0.0", - "latest-version": "^3.0.0", - "semver-diff": "^2.0.0", - "xdg-basedir": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/uri-js": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", - "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", - "dev": true, - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/urix": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", - "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", - "dev": true - }, - "node_modules/url-parse": { - "version": "1.5.10", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", - "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", - "dev": true, - "dependencies": { - "querystringify": "^2.1.1", - "requires-port": "^1.0.0" - } - }, - "node_modules/url-parse-lax": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", - "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=", - "dev": true, - "dependencies": { - "prepend-http": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/use": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", - "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true - }, - "node_modules/uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "dev": true, - "bin": { - "uuid": "bin/uuid" - } - }, - "node_modules/uuid-validate": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/uuid-validate/-/uuid-validate-0.0.3.tgz", - "integrity": "sha512-Fykw5U4eZESbq739BeLvEBFRuJODfrlmjx5eJux7W817LjRaq4b7/i4t2zxQmhcX+fAj4nMfRdTzO4tmwLKn0w==", - "dev": true - }, - "node_modules/v8-compile-cache": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.0.tgz", - "integrity": "sha512-usZBT3PW+LOjM25wbqIlZwPeJV+3OSz3M1k1Ws8snlW39dZyYL9lOGC5FgPVHfk0jKmjiDV8Z0mIbVQPiwFs7g==", - "dev": true - }, - "node_modules/verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", - "dev": true, - "engines": [ - "node >=0.6.0" - ], - "dependencies": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - } - }, - "node_modules/w3c-xmlserializer": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-4.0.0.tgz", - "integrity": "sha512-d+BFHzbiCx6zGfz0HyQ6Rg69w9k19nviJspaj4yNscGjrHu94sVP+aRm75yEbCh+r2/yR+7q6hux9LVtbuTGBw==", - "dev": true, - "dependencies": { - "xml-name-validator": "^4.0.0" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/webidl-conversions": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", - "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", - "dev": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/whatwg-encoding": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz", - "integrity": "sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==", - "dev": true, - "dependencies": { - "iconv-lite": "0.6.3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/whatwg-encoding/node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "dev": true, - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/whatwg-mimetype": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz", - "integrity": "sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==", - "dev": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/whatwg-url": { - "version": "12.0.1", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-12.0.1.tgz", - "integrity": "sha512-Ed/LrqB8EPlGxjS+TrsXcpUond1mhccS3pchLhzSgPCnTimUCKj3IZE75pAs5m6heB2U2TMerKFUXheyHY+VDQ==", - "dev": true, - "dependencies": { - "tr46": "^4.1.1", - "webidl-conversions": "^7.0.0" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "which": "bin/which" - } - }, - "node_modules/which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", - "dev": true - }, - "node_modules/wide-align": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", - "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", - "dev": true, - "dependencies": { - "string-width": "^1.0.2 || 2" - } - }, - "node_modules/widest-line": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-2.0.1.tgz", - "integrity": "sha512-Ba5m9/Fa4Xt9eb2ELXt77JxVDV8w7qQrH0zS/TWSJdLyAwQjWoOzpzj5lwVftDz6n/EOu3tNACS84v509qwnJA==", - "dev": true, - "dependencies": { - "string-width": "^2.1.1" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/wordwrap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", - "dev": true - }, - "node_modules/wrap-ansi": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", - "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.0", - "string-width": "^3.0.0", - "strip-ansi": "^5.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/wrap-ansi/node_modules/ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/wrap-ansi/node_modules/emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", - "dev": true - }, - "node_modules/wrap-ansi/node_modules/string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "dependencies": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/wrap-ansi/node_modules/strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "dependencies": { - "ansi-regex": "^4.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true - }, - "node_modules/write": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz", - "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==", - "dev": true, - "dependencies": { - "mkdirp": "^0.5.1" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/write-file-atomic": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.3.tgz", - "integrity": "sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.1.11", - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.2" - } - }, - "node_modules/ws": { - "version": "8.18.2", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.2.tgz", - "integrity": "sha512-DMricUmwGZUVr++AEAe2uiVM7UoO9MAVZMDu05UQOaUII0lp+zOzLLU4Xqh/JvTqklB1T4uELaaPBKyjE1r4fQ==", - "dev": true, - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/xdg-basedir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-3.0.0.tgz", - "integrity": "sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/xml-name-validator": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz", - "integrity": "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==", - "dev": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/xmlchars": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", - "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", - "dev": true - }, - "node_modules/y18n": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", - "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", - "dev": true - }, - "node_modules/yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", - "dev": true - }, - "node_modules/yargs": { - "version": "13.3.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", - "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", - "dev": true, - "dependencies": { - "cliui": "^5.0.0", - "find-up": "^3.0.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^3.0.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^13.1.2" - } - }, - "node_modules/yargs-parser": { - "version": "13.1.2", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", - "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", - "dev": true, - "dependencies": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - }, - "node_modules/yargs-parser/node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/yargs-unparser": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-1.6.0.tgz", - "integrity": "sha512-W9tKgmSn0DpSatfri0nx52Joq5hVXgeLiqR/5G0sZNDoLZFOr/xjBUDcShCOGNsBnEMNo1KAMBkTej1Hm62HTw==", - "dev": true, - "dependencies": { - "flat": "^4.1.0", - "lodash": "^4.17.15", - "yargs": "^13.3.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/yargs/node_modules/ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/yargs/node_modules/emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", - "dev": true - }, - "node_modules/yargs/node_modules/string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "dependencies": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/yargs/node_modules/strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "dependencies": { - "ansi-regex": "^4.1.0" - }, - "engines": { - "node": ">=6" - } - } - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.5.5.tgz", - "integrity": "sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw==", - "dev": true, - "requires": { - "@babel/highlight": "^7.0.0" - } - }, - "@babel/highlight": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.5.0.tgz", - "integrity": "sha512-7dV4eu9gBxoM0dAnj/BCFDW9LFU0zvTrkq0ugM7pnHEgguOEeOz1so2ZghEdzviYzQEED0r4EAgpsBChKy1TRQ==", - "dev": true, - "requires": { - "chalk": "^2.0.0", - "esutils": "^2.0.2", - "js-tokens": "^4.0.0" - } - }, - "@tootallnate/once": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", - "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", - "dev": true - }, - "abab": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", - "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==", - "dev": true - }, - "abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", - "dev": true - }, - "acorn": { - "version": "8.11.3", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", - "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", - "dev": true - }, - "acorn-globals": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-7.0.1.tgz", - "integrity": "sha512-umOSDSDrfHbTNPuNpC2NSnnA3LUrqpevPb4T9jRx4MagXNS0rs+gwiTcAvqCRmsD6utzsrzNt+ebm00SNWiC3Q==", - "dev": true, - "requires": { - "acorn": "^8.1.0", - "acorn-walk": "^8.0.2" - } - }, - "acorn-jsx": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.1.0.tgz", - "integrity": "sha512-tMUqwBWfLFbJbizRmEcWSLw6HnFzfdJs2sOJEOwwtVPMoH/0Ay+E703oZz78VSXZiiDcZrQ5XKjPIUQixhmgVw==", - "dev": true - }, - "acorn-walk": { - "version": "8.3.4", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", - "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", - "dev": true, - "requires": { - "acorn": "^8.11.0" - } - }, - "agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "dev": true, - "requires": { - "debug": "4" - }, - "dependencies": { - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } - } - }, - "ajv": { - "version": "6.10.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.2.tgz", - "integrity": "sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw==", - "dev": true, - "requires": { - "fast-deep-equal": "^2.0.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ansi-align": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-2.0.0.tgz", - "integrity": "sha1-w2rsy6VjuJzrVW82kPCx2eNUf38=", - "dev": true, - "requires": { - "string-width": "^2.0.0" - } - }, - "ansi-colors": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.3.tgz", - "integrity": "sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw==", - "dev": true - }, - "ansi-escapes": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.0.tgz", - "integrity": "sha512-EiYhwo0v255HUL6eDyuLrXEkTi7WwVCLAw+SeOQ7M7qdun1z1pum4DEm/nuqIVbPvi9RPPc9k9LbyBv6H0DwVg==", - "dev": true, - "requires": { - "type-fest": "^0.8.1" - } - }, - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "anymatch": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", - "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", - "dev": true, - "requires": { - "micromatch": "^3.1.4", - "normalize-path": "^2.1.1" - }, - "dependencies": { - "normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "dev": true, - "requires": { - "remove-trailing-separator": "^1.0.1" - } - } - } - }, - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", - "dev": true - }, - "arr-flatten": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", - "dev": true - }, - "arr-union": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", - "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", - "dev": true - }, - "array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", - "dev": true - }, - "asn1": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", - "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", - "dev": true, - "requires": { - "safer-buffer": "~2.1.0" - } - }, - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true - }, - "assertion-error": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", - "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", - "dev": true - }, - "assign-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", - "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", - "dev": true - }, - "astral-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", - "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", - "dev": true - }, - "async-each": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", - "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==", - "dev": true - }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", - "dev": true - }, - "atob": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", - "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", - "dev": true - }, - "aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", - "dev": true - }, - "aws4": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.9.1.tgz", - "integrity": "sha512-wMHVg2EOHaMRxbzgFJ9gtjOOCrI80OHLG14rxi28XwOW8ux6IiEbRCGGGqCtdAIg4FQCbW20k9RsT4y3gJlFug==", - "dev": true - }, - "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true - }, - "base": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", - "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", - "dev": true, - "requires": { - "cache-base": "^1.0.1", - "class-utils": "^0.3.5", - "component-emitter": "^1.2.1", - "define-property": "^1.0.0", - "isobject": "^3.0.1", - "mixin-deep": "^1.2.0", - "pascalcase": "^0.1.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", - "dev": true, - "requires": { - "tweetnacl": "^0.14.3" - } - }, - "binary-extensions": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", - "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", - "dev": true - }, - "bindings": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", - "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", - "dev": true, - "optional": true, - "requires": { - "file-uri-to-path": "1.0.0" - } - }, - "boxen": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/boxen/-/boxen-1.3.0.tgz", - "integrity": "sha512-TNPjfTr432qx7yOjQyaXm3dSR0MH9vXp7eT1BFSl/C51g+EFnOR9hTg1IreahGBmDNCehscshe45f+C1TBZbLw==", - "dev": true, - "requires": { - "ansi-align": "^2.0.0", - "camelcase": "^4.0.0", - "chalk": "^2.0.1", - "cli-boxes": "^1.0.0", - "string-width": "^2.0.0", - "term-size": "^1.2.0", - "widest-line": "^2.0.0" - } - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, - "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "browser-stdout": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", - "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", - "dev": true - }, - "browserstack-local": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/browserstack-local/-/browserstack-local-1.5.1.tgz", - "integrity": "sha512-T/wxyWDzvBHbDvl7fZKpFU7mYze6nrUkBhNy+d+8bXBqgQX10HTYvajIGO0wb49oGSLCPM0CMZTV/s7e6LF0sA==", - "dev": true, - "requires": { - "agent-base": "^6.0.2", - "https-proxy-agent": "^5.0.1", - "is-running": "^2.1.0", - "ps-tree": "=1.2.0", - "temp-fs": "^0.9.9" - } - }, - "cache-base": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", - "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", - "dev": true, - "requires": { - "collection-visit": "^1.0.0", - "component-emitter": "^1.2.1", - "get-value": "^2.0.6", - "has-value": "^1.0.0", - "isobject": "^3.0.1", - "set-value": "^2.0.0", - "to-object-path": "^0.3.0", - "union-value": "^1.0.0", - "unset-value": "^1.0.0" - } - }, - "call-bind-apply-helpers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", - "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", - "dev": true, - "requires": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2" - } - }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true - }, - "camelcase": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", - "dev": true - }, - "capture-stack-trace": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.1.tgz", - "integrity": "sha512-mYQLZnx5Qt1JgB1WEiMCf2647plpGeQ2NMR/5L0HNZzGQo4fuSPnK+wjfPnKZV0aiJDgzmWqqkV/g7JD+DW0qw==", - "dev": true - }, - "caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", - "dev": true - }, - "chai": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/chai/-/chai-4.2.0.tgz", - "integrity": "sha512-XQU3bhBukrOsQCuwZndwGcCVQHyZi53fQ6Ys1Fym7E4olpIqqZZhhoFJoaKVvV17lWQoXYwgWN2nF5crA8J2jw==", - "dev": true, - "requires": { - "assertion-error": "^1.1.0", - "check-error": "^1.0.2", - "deep-eql": "^3.0.1", - "get-func-name": "^2.0.0", - "pathval": "^1.1.0", - "type-detect": "^4.0.5" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "chardet": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", - "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", - "dev": true - }, - "check-error": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", - "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=", - "dev": true - }, - "chokidar": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", - "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", - "dev": true, - "requires": { - "anymatch": "^2.0.0", - "async-each": "^1.0.1", - "braces": "^2.3.2", - "fsevents": "^1.2.7", - "glob-parent": "^3.1.0", - "inherits": "^2.0.3", - "is-binary-path": "^1.0.0", - "is-glob": "^4.0.0", - "normalize-path": "^3.0.0", - "path-is-absolute": "^1.0.0", - "readdirp": "^2.2.1", - "upath": "^1.1.1" - } - }, - "ci-info": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.6.0.tgz", - "integrity": "sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A==", - "dev": true - }, - "class-utils": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", - "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", - "dev": true, - "requires": { - "arr-union": "^3.1.0", - "define-property": "^0.2.5", - "isobject": "^3.0.0", - "static-extend": "^0.1.1" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - } - } - }, - "cli-boxes": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-1.0.0.tgz", - "integrity": "sha1-T6kXw+WclKAEzWH47lCdplFocUM=", - "dev": true - }, - "cli-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", - "dev": true, - "requires": { - "restore-cursor": "^3.1.0" - } - }, - "cli-width": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", - "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", - "dev": true - }, - "cliui": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", - "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", - "dev": true, - "requires": { - "string-width": "^3.1.0", - "strip-ansi": "^5.2.0", - "wrap-ansi": "^5.1.0" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true - }, - "emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", - "dev": true - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - } - } - }, - "collection-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", - "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", - "dev": true, - "requires": { - "map-visit": "^1.0.0", - "object-visit": "^1.0.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true - }, - "combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dev": true, - "requires": { - "delayed-stream": "~1.0.0" - } - }, - "commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true - }, - "component-emitter": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", - "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", - "dev": true - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true - }, - "configstore": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/configstore/-/configstore-3.1.2.tgz", - "integrity": "sha512-vtv5HtGjcYUgFrXc6Kx747B83MRRVS5R1VTEQoXvuP+kMI+if6uywV0nDGoiydJRy4yk7h9od5Og0kxx4zUXmw==", - "dev": true, - "requires": { - "dot-prop": "^4.1.0", - "graceful-fs": "^4.1.2", - "make-dir": "^1.0.0", - "unique-string": "^1.0.0", - "write-file-atomic": "^2.0.0", - "xdg-basedir": "^3.0.0" - } - }, - "copy-descriptor": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", - "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", - "dev": true - }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true - }, - "create-error-class": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/create-error-class/-/create-error-class-3.0.2.tgz", - "integrity": "sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y=", - "dev": true, - "requires": { - "capture-stack-trace": "^1.0.0" - } - }, - "cross-spawn": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", - "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", - "dev": true, - "requires": { - "lru-cache": "^4.0.1", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - }, - "crypto-random-string": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz", - "integrity": "sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4=", - "dev": true - }, - "cssstyle": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-3.0.0.tgz", - "integrity": "sha512-N4u2ABATi3Qplzf0hWbVCdjenim8F3ojEXpBDF5hBpjzW182MjNGLqfmQ0SkSPeQ+V86ZXgeH8aXj6kayd4jgg==", - "dev": true, - "requires": { - "rrweb-cssom": "^0.6.0" - } - }, - "dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0" - } - }, - "data-urls": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-4.0.0.tgz", - "integrity": "sha512-/mMTei/JXPqvFqQtfyTowxmJVwr2PVAeCcDxyFf6LhoOu/09TX2OX3kb2wzi4DMXcfj4OItwDOnhl5oziPnT6g==", - "dev": true, - "requires": { - "abab": "^2.0.6", - "whatwg-mimetype": "^3.0.0", - "whatwg-url": "^12.0.0" - } - }, - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - }, - "dependencies": { - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } - } - }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true - }, - "decimal.js": { - "version": "10.5.0", - "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.5.0.tgz", - "integrity": "sha512-8vDa8Qxvr/+d94hSh5P3IJwI5t8/c0KsMp+g8bNw9cY2icONa5aPfvKeieW1WlG0WQYwwhJ7mjui2xtiePQSXw==", - "dev": true - }, - "decode-uri-component": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", - "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", - "dev": true - }, - "deep-eql": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", - "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", - "dev": true, - "requires": { - "type-detect": "^4.0.0" - } - }, - "deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "dev": true - }, - "deep-is": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", - "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", - "dev": true - }, - "define-properties": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", - "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", - "dev": true, - "requires": { - "object-keys": "^1.0.12" - } - }, - "define-property": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", - "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", - "dev": true, - "requires": { - "is-descriptor": "^1.0.2", - "isobject": "^3.0.1" - }, - "dependencies": { - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", - "dev": true - }, - "diff": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", - "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", - "dev": true - }, - "doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "requires": { - "esutils": "^2.0.2" - } - }, - "domexception": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/domexception/-/domexception-4.0.0.tgz", - "integrity": "sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw==", - "dev": true, - "requires": { - "webidl-conversions": "^7.0.0" - } - }, - "dot-prop": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.0.tgz", - "integrity": "sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ==", - "dev": true, - "requires": { - "is-obj": "^1.0.0" - } - }, - "dotenv": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.2.0.tgz", - "integrity": "sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw==", - "dev": true - }, - "dunder-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", - "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", - "dev": true, - "requires": { - "call-bind-apply-helpers": "^1.0.1", - "es-errors": "^1.3.0", - "gopd": "^1.2.0" - } - }, - "duplexer": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", - "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", - "dev": true - }, - "duplexer3": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", - "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=", - "dev": true - }, - "ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", - "dev": true, - "requires": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" - } - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "entities": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.0.tgz", - "integrity": "sha512-aKstq2TDOndCn4diEyp9Uq/Flu2i1GlLkc6XIDQSDMuaFE3OPW5OphLCyQ5SpSJZTb4reN+kTcYru5yIfXoRPw==", - "dev": true - }, - "es-abstract": { - "version": "1.17.6", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.6.tgz", - "integrity": "sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw==", - "dev": true, - "requires": { - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1", - "is-callable": "^1.2.0", - "is-regex": "^1.1.0", - "object-inspect": "^1.7.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.0", - "string.prototype.trimend": "^1.0.1", - "string.prototype.trimstart": "^1.0.1" - } - }, - "es-define-property": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", - "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", - "dev": true - }, - "es-errors": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", - "dev": true - }, - "es-object-atoms": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", - "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", - "dev": true, - "requires": { - "es-errors": "^1.3.0" - } - }, - "es-set-tostringtag": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", - "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", - "dev": true, - "requires": { - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.6", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.2" - } - }, - "es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "dev": true, - "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - } - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true - }, - "escodegen": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", - "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", - "dev": true, - "requires": { - "esprima": "^4.0.1", - "estraverse": "^5.2.0", - "esutils": "^2.0.2", - "source-map": "~0.6.1" - }, - "dependencies": { - "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true - } - } - }, - "eslint": { - "version": "6.7.2", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-6.7.2.tgz", - "integrity": "sha512-qMlSWJaCSxDFr8fBPvJM9kJwbazrhNcBU3+DszDW1OlEwKBBRWsJc7NJFelvwQpanHCR14cOLD41x8Eqvo3Nng==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "ajv": "^6.10.0", - "chalk": "^2.1.0", - "cross-spawn": "^6.0.5", - "debug": "^4.0.1", - "doctrine": "^3.0.0", - "eslint-scope": "^5.0.0", - "eslint-utils": "^1.4.3", - "eslint-visitor-keys": "^1.1.0", - "espree": "^6.1.2", - "esquery": "^1.0.1", - "esutils": "^2.0.2", - "file-entry-cache": "^5.0.1", - "functional-red-black-tree": "^1.0.1", - "glob-parent": "^5.0.0", - "globals": "^12.1.0", - "ignore": "^4.0.6", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "inquirer": "^7.0.0", - "is-glob": "^4.0.0", - "js-yaml": "^3.13.1", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.3.0", - "lodash": "^4.17.14", - "minimatch": "^3.0.4", - "mkdirp": "^0.5.1", - "natural-compare": "^1.4.0", - "optionator": "^0.8.3", - "progress": "^2.0.0", - "regexpp": "^2.0.1", - "semver": "^6.1.2", - "strip-ansi": "^5.2.0", - "strip-json-comments": "^3.0.1", - "table": "^5.2.3", - "text-table": "^0.2.0", - "v8-compile-cache": "^2.0.3" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true - }, - "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "dev": true, - "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - } - } - }, - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "glob-parent": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.0.tgz", - "integrity": "sha512-qjtRgnIVmOfnKUE3NJAQEdk+lKrxfw8t5ke7SXtfMTHcjsBfOfWXCQfdb30zfDoZQ2IRSIiidmjtbHZPZ++Ihw==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - }, - "strip-json-comments": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.0.1.tgz", - "integrity": "sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw==", - "dev": true - } - } - }, - "eslint-scope": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.0.0.tgz", - "integrity": "sha512-oYrhJW7S0bxAFDvWqzvMPRm6pcgcnWc4QnofCAqRTRfQC0JcwenzGglTtsLyIuuWFfkqDG9vz67cnttSd53djw==", - "dev": true, - "requires": { - "esrecurse": "^4.1.0", - "estraverse": "^4.1.1" - } - }, - "eslint-utils": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz", - "integrity": "sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==", - "dev": true, - "requires": { - "eslint-visitor-keys": "^1.1.0" - } - }, - "eslint-visitor-keys": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz", - "integrity": "sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A==", - "dev": true - }, - "espree": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/espree/-/espree-6.1.2.tgz", - "integrity": "sha512-2iUPuuPP+yW1PZaMSDM9eyVf8D5P0Hi8h83YtZ5bPc/zHYjII5khoixIUTMO794NOY8F/ThF1Bo8ncZILarUTA==", - "dev": true, - "requires": { - "acorn": "^7.1.0", - "acorn-jsx": "^5.1.0", - "eslint-visitor-keys": "^1.1.0" - }, - "dependencies": { - "acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", - "dev": true - } - } - }, - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true - }, - "esquery": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.1.tgz", - "integrity": "sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA==", - "dev": true, - "requires": { - "estraverse": "^4.0.0" - } - }, - "esrecurse": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", - "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", - "dev": true, - "requires": { - "estraverse": "^4.1.0" - } - }, - "estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true - }, - "esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true - }, - "event-stream": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/event-stream/-/event-stream-3.3.4.tgz", - "integrity": "sha512-QHpkERcGsR0T7Qm3HNJSyXKEEj8AHNxkY3PK8TS2KJvQ7NiSHe3DDpwVKKtoYprL/AreyzFBeIkBIWChAqn60g==", - "dev": true, - "requires": { - "duplexer": "~0.1.1", - "from": "~0", - "map-stream": "~0.1.0", - "pause-stream": "0.0.11", - "split": "0.3", - "stream-combiner": "~0.0.4", - "through": "~2.3.1" - } - }, - "execa": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", - "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", - "dev": true, - "requires": { - "cross-spawn": "^5.0.1", - "get-stream": "^3.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - } - }, - "expand-brackets": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", - "dev": true, - "requires": { - "debug": "^2.3.3", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "posix-character-classes": "^0.1.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "dev": true - }, - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "dev": true, - "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, - "external-editor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", - "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", - "dev": true, - "requires": { - "chardet": "^0.7.0", - "iconv-lite": "^0.4.24", - "tmp": "^0.0.33" - } - }, - "extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", - "dev": true, - "requires": { - "array-unique": "^0.3.2", - "define-property": "^1.0.0", - "expand-brackets": "^2.1.4", - "extend-shallow": "^2.0.1", - "fragment-cache": "^0.2.1", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", - "dev": true - }, - "fast-deep-equal": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", - "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", - "dev": true - }, - "fast-json-stable-stringify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", - "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", - "dev": true - }, - "fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", - "dev": true - }, - "figures": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-3.1.0.tgz", - "integrity": "sha512-ravh8VRXqHuMvZt/d8GblBeqDMkdJMBdv/2KntFH+ra5MXkO7nxNKpzQ3n6QD/2da1kH0aWmNISdvhM7gl2gVg==", - "dev": true, - "requires": { - "escape-string-regexp": "^1.0.5" - } - }, - "file-entry-cache": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", - "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==", - "dev": true, - "requires": { - "flat-cache": "^2.0.1" - } - }, - "file-uri-to-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", - "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", - "dev": true, - "optional": true - }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "requires": { - "locate-path": "^3.0.0" - } - }, - "flat": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/flat/-/flat-4.1.0.tgz", - "integrity": "sha512-Px/TiLIznH7gEDlPXcUD4KnBusa6kR6ayRUVcnEAbreRIuhkqow/mun59BuRXwoYk7ZQOLW1ZM05ilIvK38hFw==", - "dev": true, - "requires": { - "is-buffer": "~2.0.3" - }, - "dependencies": { - "is-buffer": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.4.tgz", - "integrity": "sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A==", - "dev": true - } - } - }, - "flat-cache": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", - "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", - "dev": true, - "requires": { - "flatted": "^2.0.0", - "rimraf": "2.6.3", - "write": "1.0.3" - } - }, - "flatted": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.1.tgz", - "integrity": "sha512-a1hQMktqW9Nmqr5aktAux3JMNqaucxGcjtjWnZLHX7yyPCmlSV3M54nGYbqT8K+0GhF3NBgmJCc3ma+WOgX8Jg==", - "dev": true - }, - "for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", - "dev": true - }, - "forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", - "dev": true - }, - "form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "dev": true, - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - } - }, - "fragment-cache": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", - "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", - "dev": true, - "requires": { - "map-cache": "^0.2.2" - } - }, - "from": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/from/-/from-0.1.7.tgz", - "integrity": "sha512-twe20eF1OxVxp/ML/kq2p1uc6KvFK/+vs8WjEbeKmV2He22MKm7YF2ANIt+EOqhJ5L3K/SuuPhk0hWQDjOM23g==", - "dev": true - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true - }, - "fsevents": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", - "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", - "dev": true, - "optional": true, - "requires": { - "bindings": "^1.5.0", - "nan": "^2.12.1" - } - }, - "function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "dev": true - }, - "functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", - "dev": true - }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true - }, - "get-func-name": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", - "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=", - "dev": true - }, - "get-intrinsic": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", - "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", - "dev": true, - "requires": { - "call-bind-apply-helpers": "^1.0.2", - "es-define-property": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.1.1", - "function-bind": "^1.1.2", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "has-symbols": "^1.1.0", - "hasown": "^2.0.2", - "math-intrinsics": "^1.1.0" - } - }, - "get-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", - "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", - "dev": true, - "requires": { - "dunder-proto": "^1.0.1", - "es-object-atoms": "^1.0.0" - } - }, - "get-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", - "dev": true - }, - "get-value": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", - "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", - "dev": true - }, - "getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0" - } - }, - "glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "glob-parent": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", - "dev": true, - "requires": { - "is-glob": "^3.1.0", - "path-dirname": "^1.0.0" - }, - "dependencies": { - "is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "dev": true, - "requires": { - "is-extglob": "^2.1.0" - } - } - } - }, - "global-dirs": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz", - "integrity": "sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU=", - "dev": true, - "requires": { - "ini": "^1.3.4" - } - }, - "globals": { - "version": "12.3.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-12.3.0.tgz", - "integrity": "sha512-wAfjdLgFsPZsklLJvOBUBmzYE8/CwhEqSBEMRXA3qxIiNtyqvjYurAtIfDh6chlEPUfmTY3MnZh5Hfh4q0UlIw==", - "dev": true, - "requires": { - "type-fest": "^0.8.1" - } - }, - "gopd": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", - "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", - "dev": true - }, - "got": { - "version": "6.7.1", - "resolved": "https://registry.npmjs.org/got/-/got-6.7.1.tgz", - "integrity": "sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA=", - "dev": true, - "requires": { - "create-error-class": "^3.0.0", - "duplexer3": "^0.1.4", - "get-stream": "^3.0.0", - "is-redirect": "^1.0.0", - "is-retry-allowed": "^1.0.0", - "is-stream": "^1.0.0", - "lowercase-keys": "^1.0.0", - "safe-buffer": "^5.0.1", - "timed-out": "^4.0.0", - "unzip-response": "^2.0.1", - "url-parse-lax": "^1.0.0" - } - }, - "graceful-fs": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.1.tgz", - "integrity": "sha512-b9usnbDGnD928gJB3LrCmxoibr3VE4U2SMo5PBuBnokWyDADTqDPXg4YpwKF1trpH+UbGp7QLicO3+aWEy0+mw==", - "dev": true - }, - "growl": { - "version": "1.10.5", - "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", - "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", - "dev": true - }, - "handlebars": { - "version": "4.7.6", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.6.tgz", - "integrity": "sha512-1f2BACcBfiwAfStCKZNrUCgqNZkGsAT7UM3kkYtXuLo0KnaVfjKOyf7PRzB6++aK9STyT1Pd2ZCPe3EGOXleXA==", - "dev": true, - "requires": { - "minimist": "^1.2.5", - "neo-async": "^2.6.0", - "source-map": "^0.6.1", - "uglify-js": "^3.1.4", - "wordwrap": "^1.0.0" - } - }, - "har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", - "dev": true - }, - "har-validator": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", - "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", - "dev": true, - "requires": { - "ajv": "^6.5.5", - "har-schema": "^2.0.0" - } - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "requires": { - "function-bind": "^1.1.1" - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "has-symbols": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", - "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", - "dev": true - }, - "has-tostringtag": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", - "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", - "dev": true, - "requires": { - "has-symbols": "^1.0.3" - } - }, - "has-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", - "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", - "dev": true, - "requires": { - "get-value": "^2.0.6", - "has-values": "^1.0.0", - "isobject": "^3.0.0" - } - }, - "has-values": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", - "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", - "dev": true, - "requires": { - "is-number": "^3.0.0", - "kind-of": "^4.0.0" - }, - "dependencies": { - "kind-of": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", - "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "dev": true, - "requires": { - "function-bind": "^1.1.2" - } - }, - "he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", - "dev": true - }, - "html-encoding-sniffer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz", - "integrity": "sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==", - "dev": true, - "requires": { - "whatwg-encoding": "^2.0.0" - } - }, - "http-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", - "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", - "dev": true, - "requires": { - "@tootallnate/once": "2", - "agent-base": "6", - "debug": "4" - }, - "dependencies": { - "debug": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", - "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", - "dev": true, - "requires": { - "ms": "^2.1.3" - } - }, - "ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true - } - } - }, - "http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - } - }, - "https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", - "dev": true, - "requires": { - "agent-base": "6", - "debug": "4" - }, - "dependencies": { - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } - } - }, - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", - "dev": true - }, - "ignore-by-default": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", - "integrity": "sha1-SMptcvbGo68Aqa1K5odr44ieKwk=", - "dev": true - }, - "immediate": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", - "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==", - "dev": true - }, - "import-fresh": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz", - "integrity": "sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==", - "dev": true, - "requires": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - } - }, - "import-lazy": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", - "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=", - "dev": true - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "ini": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", - "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", - "dev": true - }, - "inquirer": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.0.0.tgz", - "integrity": "sha512-rSdC7zelHdRQFkWnhsMu2+2SO41mpv2oF2zy4tMhmiLWkcKbOAs87fWAJhVXttKVwhdZvymvnuM95EyEXg2/tQ==", - "dev": true, - "requires": { - "ansi-escapes": "^4.2.1", - "chalk": "^2.4.2", - "cli-cursor": "^3.1.0", - "cli-width": "^2.0.0", - "external-editor": "^3.0.3", - "figures": "^3.0.0", - "lodash": "^4.17.15", - "mute-stream": "0.0.8", - "run-async": "^2.2.0", - "rxjs": "^6.4.0", - "string-width": "^4.1.0", - "strip-ansi": "^5.1.0", - "through": "^2.3.6" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, - "string-width": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", - "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - }, - "dependencies": { - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.0" - } - } - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true - } - } - } - } - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-binary-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", - "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", - "dev": true, - "requires": { - "binary-extensions": "^1.0.0" - } - }, - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, - "is-callable": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.0.tgz", - "integrity": "sha512-pyVD9AaGLxtg6srb2Ng6ynWJqkHU9bEM087AKck0w8QwDarTfNcpIYoU8x8Hv2Icm8u6kFJM18Dag8lyqGkviw==", - "dev": true - }, - "is-ci": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-1.2.1.tgz", - "integrity": "sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg==", - "dev": true, - "requires": { - "ci-info": "^1.5.0" - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-date-object": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", - "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==", - "dev": true - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "dependencies": { - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } - } - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "is-glob": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", - "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", - "dev": true, - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-installed-globally": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.1.0.tgz", - "integrity": "sha1-Df2Y9akRFxbdU13aZJL2e/PSWoA=", - "dev": true, - "requires": { - "global-dirs": "^0.1.0", - "is-path-inside": "^1.0.0" - } - }, - "is-npm": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-1.0.0.tgz", - "integrity": "sha1-8vtjpl5JBbQGyGBydloaTceTufQ=", - "dev": true - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", - "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", - "dev": true - }, - "is-path-inside": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", - "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", - "dev": true, - "requires": { - "path-is-inside": "^1.0.1" - } - }, - "is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "dev": true, - "requires": { - "isobject": "^3.0.1" - } - }, - "is-potential-custom-element-name": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", - "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", - "dev": true - }, - "is-promise": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", - "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", - "dev": true - }, - "is-redirect": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-redirect/-/is-redirect-1.0.0.tgz", - "integrity": "sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ=", - "dev": true - }, - "is-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.0.tgz", - "integrity": "sha512-iI97M8KTWID2la5uYXlkbSDQIg4F6o1sYboZKKTDpnDQMLtUL86zxhgDet3Q2SriaYsyGqZ6Mn2SjbRKeLHdqw==", - "dev": true, - "requires": { - "has-symbols": "^1.0.1" - } - }, - "is-retry-allowed": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz", - "integrity": "sha1-EaBgVotnM5REAz0BJaYaINVk+zQ=", - "dev": true - }, - "is-running": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-running/-/is-running-2.1.0.tgz", - "integrity": "sha512-mjJd3PujZMl7j+D395WTIO5tU5RIDBfVSRtRR4VOJou3H66E38UjbjvDGh3slJzPuolsb+yQFqwHNNdyp5jg3w==", - "dev": true - }, - "is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", - "dev": true - }, - "is-symbol": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", - "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", - "dev": true, - "requires": { - "has-symbols": "^1.0.1" - } - }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", - "dev": true - }, - "is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", - "dev": true - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - }, - "isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", - "dev": true - }, - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "js-yaml": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", - "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", - "dev": true - }, - "jsdom": { - "version": "21.1.2", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-21.1.2.tgz", - "integrity": "sha512-sCpFmK2jv+1sjff4u7fzft+pUh2KSUbUrEHYHyfSIbGTIcmnjyp83qg6qLwdJ/I3LpTXx33ACxeRL7Lsyc6lGQ==", - "dev": true, - "requires": { - "abab": "^2.0.6", - "acorn": "^8.8.2", - "acorn-globals": "^7.0.0", - "cssstyle": "^3.0.0", - "data-urls": "^4.0.0", - "decimal.js": "^10.4.3", - "domexception": "^4.0.0", - "escodegen": "^2.0.0", - "form-data": "^4.0.0", - "html-encoding-sniffer": "^3.0.0", - "http-proxy-agent": "^5.0.0", - "https-proxy-agent": "^5.0.1", - "is-potential-custom-element-name": "^1.0.1", - "nwsapi": "^2.2.4", - "parse5": "^7.1.2", - "rrweb-cssom": "^0.6.0", - "saxes": "^6.0.0", - "symbol-tree": "^3.2.4", - "tough-cookie": "^4.1.2", - "w3c-xmlserializer": "^4.0.0", - "webidl-conversions": "^7.0.0", - "whatwg-encoding": "^2.0.0", - "whatwg-mimetype": "^3.0.0", - "whatwg-url": "^12.0.1", - "ws": "^8.13.0", - "xml-name-validator": "^4.0.0" - }, - "dependencies": { - "form-data": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.2.tgz", - "integrity": "sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==", - "dev": true, - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "es-set-tostringtag": "^2.1.0", - "mime-types": "^2.1.12" - } - }, - "tough-cookie": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.4.tgz", - "integrity": "sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==", - "dev": true, - "requires": { - "psl": "^1.1.33", - "punycode": "^2.1.1", - "universalify": "^0.2.0", - "url-parse": "^1.5.3" - } - } - } - }, - "json-schema": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", - "dev": true - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", - "dev": true - }, - "json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", - "dev": true - }, - "jsprim": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", - "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", - "dev": true, - "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.2.3", - "verror": "1.10.0" - } - }, - "jszip": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.10.0.tgz", - "integrity": "sha512-LDfVtOLtOxb9RXkYOwPyNBTQDL4eUbqahtoY6x07GiDJHwSYvn8sHHIw8wINImV3MqbMNve2gSuM1DDqEKk09Q==", - "dev": true, - "requires": { - "lie": "~3.3.0", - "pako": "~1.0.2", - "readable-stream": "~2.3.6", - "setimmediate": "^1.0.5" - } - }, - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true - }, - "latest-version": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-3.1.0.tgz", - "integrity": "sha1-ogU4P+oyKzO1rjsYq+4NwvNW7hU=", - "dev": true, - "requires": { - "package-json": "^4.0.0" - } - }, - "levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", - "dev": true, - "requires": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" - } - }, - "lie": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", - "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", - "dev": true, - "requires": { - "immediate": "~3.0.5" - } - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "lodash": { - "version": "4.17.15", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", - "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", - "dev": true - }, - "log-symbols": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", - "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", - "dev": true, - "requires": { - "chalk": "^2.0.1" - } - }, - "lowercase-keys": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", - "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", - "dev": true - }, - "lru-cache": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", - "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", - "dev": true, - "requires": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" - } - }, - "make-dir": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", - "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", - "dev": true, - "requires": { - "pify": "^3.0.0" - } - }, - "map-cache": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", - "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", - "dev": true - }, - "map-stream": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/map-stream/-/map-stream-0.1.0.tgz", - "integrity": "sha512-CkYQrPYZfWnu/DAmVCpTSX/xHpKZ80eKh2lAkyA6AJTef6bW+6JpbQZN5rofum7da+SyN1bi5ctTm+lTfcCW3g==", - "dev": true - }, - "map-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", - "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", - "dev": true, - "requires": { - "object-visit": "^1.0.0" - } - }, - "math-intrinsics": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", - "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", - "dev": true - }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - } - }, - "mime-db": { - "version": "1.43.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.43.0.tgz", - "integrity": "sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ==", - "dev": true - }, - "mime-types": { - "version": "2.1.26", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.26.tgz", - "integrity": "sha512-01paPWYgLrkqAyrlDorC1uDwl2p3qZT7yl806vW7DvDoxwXi46jsjFbg+WdwotBIk6/MbEhO/dh5aZ5sNj/dWQ==", - "dev": true, - "requires": { - "mime-db": "1.43.0" - } - }, - "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true - }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", - "dev": true - }, - "mixin-deep": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", - "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", - "dev": true, - "requires": { - "for-in": "^1.0.2", - "is-extendable": "^1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, - "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } - }, - "mocha": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-6.2.3.tgz", - "integrity": "sha512-0R/3FvjIGH3eEuG17ccFPk117XL2rWxatr81a57D+r/x2uTYZRbdZ4oVidEUMh2W2TJDa7MdAb12Lm2/qrKajg==", - "dev": true, - "requires": { - "ansi-colors": "3.2.3", - "browser-stdout": "1.3.1", - "debug": "3.2.6", - "diff": "3.5.0", - "escape-string-regexp": "1.0.5", - "find-up": "3.0.0", - "glob": "7.1.3", - "growl": "1.10.5", - "he": "1.2.0", - "js-yaml": "3.13.1", - "log-symbols": "2.2.0", - "minimatch": "3.0.4", - "mkdirp": "0.5.4", - "ms": "2.1.1", - "node-environment-flags": "1.0.5", - "object.assign": "4.1.0", - "strip-json-comments": "2.0.1", - "supports-color": "6.0.0", - "which": "1.3.1", - "wide-align": "1.1.3", - "yargs": "13.3.2", - "yargs-parser": "13.1.2", - "yargs-unparser": "1.6.0" - }, - "dependencies": { - "glob": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", - "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "mkdirp": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.4.tgz", - "integrity": "sha512-iG9AK/dJLtJ0XNgTuDbSyNS3zECqDlAhnQW4CsNxBG3LQJBbHmRX1egw39DmtOdCAqY+dKXV+sgPgilNWUKMVw==", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } - }, - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", - "dev": true - }, - "supports-color": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.0.0.tgz", - "integrity": "sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, - "mute-stream": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", - "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", - "dev": true - }, - "nan": { - "version": "2.14.1", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.1.tgz", - "integrity": "sha512-isWHgVjnFjh2x2yuJ/tj3JbwoHu3UC2dX5G/88Cm24yB6YopVgxvBObDY7n5xW6ExmFhJpSEQqFPvq9zaXc8Jw==", - "dev": true, - "optional": true - }, - "nanomatch": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", - "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", - "dev": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "fragment-cache": "^0.2.1", - "is-windows": "^1.0.2", - "kind-of": "^6.0.2", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - } - }, - "natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", - "dev": true - }, - "neo-async": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.1.tgz", - "integrity": "sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==", - "dev": true - }, - "nice-try": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", - "dev": true - }, - "node-environment-flags": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/node-environment-flags/-/node-environment-flags-1.0.5.tgz", - "integrity": "sha512-VNYPRfGfmZLx0Ye20jWzHUjyTW/c+6Wq+iLhDzUI4XmhrDd9l/FozXV3F2xOaXjvp0co0+v1YSR3CMP6g+VvLQ==", - "dev": true, - "requires": { - "object.getownpropertydescriptors": "^2.0.3", - "semver": "^5.7.0" - } - }, - "nodemon": { - "version": "1.19.4", - "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-1.19.4.tgz", - "integrity": "sha512-VGPaqQBNk193lrJFotBU8nvWZPqEZY2eIzymy2jjY0fJ9qIsxA0sxQ8ATPl0gZC645gijYEc1jtZvpS8QWzJGQ==", - "dev": true, - "requires": { - "chokidar": "^2.1.8", - "debug": "^3.2.6", - "ignore-by-default": "^1.0.1", - "minimatch": "^3.0.4", - "pstree.remy": "^1.1.7", - "semver": "^5.7.1", - "supports-color": "^5.5.0", - "touch": "^3.1.0", - "undefsafe": "^2.0.2", - "update-notifier": "^2.5.0" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - } - } - }, - "nopt": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", - "integrity": "sha1-bd0hvSoxQXuScn3Vhfim83YI6+4=", - "dev": true, - "requires": { - "abbrev": "1" - } - }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true - }, - "npm-run-path": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", - "dev": true, - "requires": { - "path-key": "^2.0.0" - } - }, - "nwsapi": { - "version": "2.2.20", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.20.tgz", - "integrity": "sha512-/ieB+mDe4MrrKMT8z+mQL8klXydZWGR5Dowt4RAGKbJ3kIGEx3X4ljUo+6V73IXtUPWgfOlU5B9MlGxFO5T+cA==", - "dev": true - }, - "oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", - "dev": true - }, - "object-copy": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", - "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", - "dev": true, - "requires": { - "copy-descriptor": "^0.1.0", - "define-property": "^0.2.5", - "kind-of": "^3.0.3" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "object-inspect": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.7.0.tgz", - "integrity": "sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw==", - "dev": true - }, - "object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true - }, - "object-visit": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", - "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", - "dev": true, - "requires": { - "isobject": "^3.0.0" - } - }, - "object.assign": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", - "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", - "dev": true, - "requires": { - "define-properties": "^1.1.2", - "function-bind": "^1.1.1", - "has-symbols": "^1.0.0", - "object-keys": "^1.0.11" - } - }, - "object.getownpropertydescriptors": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.0.tgz", - "integrity": "sha512-Z53Oah9A3TdLoblT7VKJaTDdXdT+lQO+cNpKVnya5JDe9uLvzu1YyY1yFDFrcxrlRgWrEFH0jJtD/IbuwjcEVg==", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.0-next.1" - } - }, - "object.pick": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", - "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", - "dev": true, - "requires": { - "isobject": "^3.0.1" - } - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, - "requires": { - "wrappy": "1" - } - }, - "onetime": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.0.tgz", - "integrity": "sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q==", - "dev": true, - "requires": { - "mimic-fn": "^2.1.0" - } - }, - "optionator": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", - "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", - "dev": true, - "requires": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.6", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "word-wrap": "~1.2.3" - } - }, - "os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", - "dev": true - }, - "p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", - "dev": true - }, - "p-limit": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.2.tgz", - "integrity": "sha512-WGR+xHecKTr7EbUEhyLSh5Dube9JtdiG78ufaeLxTgpudf/20KqyMioIUZJAezlTIi6evxuoUs9YXc11cU+yzQ==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "requires": { - "p-limit": "^2.0.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true - }, - "package-json": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/package-json/-/package-json-4.0.1.tgz", - "integrity": "sha1-iGmgQBJTZhxMTKPabCEh7VVfXu0=", - "dev": true, - "requires": { - "got": "^6.7.1", - "registry-auth-token": "^3.0.1", - "registry-url": "^3.0.3", - "semver": "^5.1.0" - } - }, - "pako": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", - "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", - "dev": true - }, - "parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "requires": { - "callsites": "^3.0.0" - } - }, - "parse5": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.3.0.tgz", - "integrity": "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==", - "dev": true, - "requires": { - "entities": "^6.0.0" - } - }, - "pascalcase": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", - "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", - "dev": true - }, - "path-dirname": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", - "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", - "dev": true - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true - }, - "path-is-inside": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", - "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", - "dev": true - }, - "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", - "dev": true - }, - "pathval": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.0.tgz", - "integrity": "sha1-uULm1L3mUwBe9rcTYd74cn0GReA=", - "dev": true - }, - "pause-stream": { - "version": "0.0.11", - "resolved": "https://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz", - "integrity": "sha512-e3FBlXLmN/D1S+zHzanP4E/4Z60oFAa3O051qt1pxa7DEJWKAyil6upYVXCWadEnuoqa4Pkc9oUx9zsxYeRv8A==", - "dev": true, - "requires": { - "through": "~2.3" - } - }, - "performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", - "dev": true - }, - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true - }, - "posix-character-classes": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", - "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", - "dev": true - }, - "prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", - "dev": true - }, - "prepend-http": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", - "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=", - "dev": true - }, - "prettier": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.2.5.tgz", - "integrity": "sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==", - "dev": true - }, - "process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true - }, - "progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "dev": true - }, - "ps-tree": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/ps-tree/-/ps-tree-1.2.0.tgz", - "integrity": "sha512-0VnamPPYHl4uaU/nSFeZZpR21QAWRz+sRv4iW9+v/GS/J5U5iZB5BNN6J0RMoOvdx2gWM2+ZFMIm58q24e4UYA==", - "dev": true, - "requires": { - "event-stream": "=3.3.4" - } - }, - "pseudomap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", - "dev": true - }, - "psl": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.7.0.tgz", - "integrity": "sha512-5NsSEDv8zY70ScRnOTn7bK7eanl2MvFrOrS/R6x+dBt5g1ghnj9Zv90kO8GwT8gxcu2ANyFprnFYB85IogIJOQ==", - "dev": true - }, - "pstree.remy": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", - "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==", - "dev": true - }, - "punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "dev": true - }, - "qs": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", - "dev": true - }, - "querystringify": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", - "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", - "dev": true - }, - "rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "dev": true, - "requires": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - } - }, - "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "readdirp": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", - "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.11", - "micromatch": "^3.1.10", - "readable-stream": "^2.0.2" - } - }, - "regex-not": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", - "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", - "dev": true, - "requires": { - "extend-shallow": "^3.0.2", - "safe-regex": "^1.1.0" - } - }, - "regexpp": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", - "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==", - "dev": true - }, - "registry-auth-token": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.4.0.tgz", - "integrity": "sha512-4LM6Fw8eBQdwMYcES4yTnn2TqIasbXuwDx3um+QRs7S55aMKCBKBxvPXl2RiUjHwuJLTyYfxSpmfSAjQpcuP+A==", - "dev": true, - "requires": { - "rc": "^1.1.6", - "safe-buffer": "^5.0.1" - } - }, - "registry-url": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-3.1.0.tgz", - "integrity": "sha1-PU74cPc93h138M+aOBQyRE4XSUI=", - "dev": true, - "requires": { - "rc": "^1.0.1" - } - }, - "remove-trailing-separator": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", - "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", - "dev": true - }, - "repeat-element": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", - "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", - "dev": true - }, - "repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", - "dev": true - }, - "request": { - "version": "2.88.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", - "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", - "dev": true, - "requires": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.0", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.4.3", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - } - }, - "require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", - "dev": true - }, - "require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", - "dev": true - }, - "requires-port": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", - "dev": true - }, - "resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true - }, - "resolve-url": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", - "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", - "dev": true - }, - "restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", - "dev": true, - "requires": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - } - }, - "ret": { - "version": "0.1.15", - "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", - "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", - "dev": true - }, - "rimraf": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", - "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "rrweb-cssom": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.6.0.tgz", - "integrity": "sha512-APM0Gt1KoXBz0iIkkdB/kfvGOwC4UuJFeG/c+yV7wSc7q96cG/kJ0HiYCnzivD9SB53cLV1MlHFNfOuPaadYSw==", - "dev": true - }, - "run-async": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", - "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", - "dev": true, - "requires": { - "is-promise": "^2.1.0" - } - }, - "rxjs": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.3.tgz", - "integrity": "sha512-wuYsAYYFdWTAnAaPoKGNhfpWwKZbJW+HgAJ+mImp+Epl7BG8oNWBCTyRM8gba9k4lk8BgWdoYm21Mo/RYhhbgA==", - "dev": true, - "requires": { - "tslib": "^1.9.0" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "safe-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", - "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", - "dev": true, - "requires": { - "ret": "~0.1.10" - } - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true - }, - "saxes": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz", - "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==", - "dev": true, - "requires": { - "xmlchars": "^2.2.0" - } - }, - "selenium-webdriver": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/selenium-webdriver/-/selenium-webdriver-4.3.1.tgz", - "integrity": "sha512-TjH/ls1WKRQoFEHcqtn6UtwcLnA3yvx08v9cSSFYvyhp8hJWRtbe9ae2I8uXPisEZ2EaGKKoxBZ4EHv0BJM15g==", - "dev": true, - "requires": { - "jszip": "^3.10.0", - "tmp": "^0.2.1", - "ws": ">=8.7.0" - }, - "dependencies": { - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "tmp": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", - "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", - "dev": true, - "requires": { - "rimraf": "^3.0.0" - } - } - } - }, - "semver": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", - "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", - "dev": true - }, - "semver-diff": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-2.1.0.tgz", - "integrity": "sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY=", - "dev": true, - "requires": { - "semver": "^5.0.3" - } - }, - "set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", - "dev": true - }, - "set-value": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", - "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.3", - "split-string": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "setimmediate": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", - "dev": true - }, - "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", - "dev": true, - "requires": { - "shebang-regex": "^1.0.0" - } - }, - "shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", - "dev": true - }, - "signal-exit": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", - "dev": true - }, - "slice-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", - "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.0", - "astral-regex": "^1.0.0", - "is-fullwidth-code-point": "^2.0.0" - } - }, - "snapdragon": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", - "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", - "dev": true, - "requires": { - "base": "^0.11.1", - "debug": "^2.2.0", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "map-cache": "^0.2.2", - "source-map": "^0.5.6", - "source-map-resolve": "^0.5.0", - "use": "^3.1.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - } - } - }, - "snapdragon-node": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", - "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", - "dev": true, - "requires": { - "define-property": "^1.0.0", - "isobject": "^3.0.0", - "snapdragon-util": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "snapdragon-util": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", - "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", - "dev": true, - "requires": { - "kind-of": "^3.2.0" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "source-map-resolve": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", - "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", - "dev": true, - "requires": { - "atob": "^2.1.2", - "decode-uri-component": "^0.2.0", - "resolve-url": "^0.2.1", - "source-map-url": "^0.4.0", - "urix": "^0.1.0" - } - }, - "source-map-url": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", - "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", - "dev": true - }, - "split": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/split/-/split-0.3.3.tgz", - "integrity": "sha512-wD2AeVmxXRBoX44wAycgjVpMhvbwdI2aZjCkvfNcH1YqHQvJVa1duWc73OyVGJUc05fhFaTZeQ/PYsrmyH0JVA==", - "dev": true, - "requires": { - "through": "2" - } - }, - "split-string": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", - "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", - "dev": true, - "requires": { - "extend-shallow": "^3.0.0" - } - }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", - "dev": true - }, - "sshpk": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", - "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", - "dev": true, - "requires": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" - } - }, - "static-extend": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", - "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", - "dev": true, - "requires": { - "define-property": "^0.2.5", - "object-copy": "^0.1.0" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - } - } - }, - "stream-combiner": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.0.4.tgz", - "integrity": "sha512-rT00SPnTVyRsaSz5zgSPma/aHSOic5U1prhYdRy5HS2kTZviFpmDgzilbtsJsxiroqACmayynDN/9VzIbX5DOw==", - "dev": true, - "requires": { - "duplexer": "~0.1.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, - "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - } - }, - "string.prototype.trimend": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz", - "integrity": "sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g==", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.5" - } - }, - "string.prototype.trimstart": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz", - "integrity": "sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw==", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.5" - } - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - } - }, - "strip-eof": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", - "dev": true - }, - "strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "symbol-tree": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", - "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", - "dev": true - }, - "table": { - "version": "5.4.6", - "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", - "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==", - "dev": true, - "requires": { - "ajv": "^6.10.2", - "lodash": "^4.17.14", - "slice-ansi": "^2.1.0", - "string-width": "^3.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true - }, - "emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", - "dev": true - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - } - } - }, - "temp-fs": { - "version": "0.9.9", - "resolved": "https://registry.npmjs.org/temp-fs/-/temp-fs-0.9.9.tgz", - "integrity": "sha512-WfecDCR1xC9b0nsrzSaxPf3ZuWeWLUWblW4vlDQAa1biQaKHiImHnJfeQocQe/hXKMcolRzgkcVX/7kK4zoWbw==", - "dev": true, - "requires": { - "rimraf": "~2.5.2" - }, - "dependencies": { - "rimraf": { - "version": "2.5.4", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.5.4.tgz", - "integrity": "sha512-Lw7SHMjssciQb/rRz7JyPIy9+bbUshEucPoLRvWqy09vC5zQixl8Uet+Zl+SROBB/JMWHJRdCk1qdxNWHNMvlQ==", - "dev": true, - "requires": { - "glob": "^7.0.5" - } - } - } - }, - "term-size": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/term-size/-/term-size-1.2.0.tgz", - "integrity": "sha1-RYuDiH8oj8Vtb/+/rSYuJmOO+mk=", - "dev": true, - "requires": { - "execa": "^0.7.0" - } - }, - "text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", - "dev": true - }, - "through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", - "dev": true - }, - "timed-out": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", - "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=", - "dev": true - }, - "tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "dev": true, - "requires": { - "os-tmpdir": "~1.0.2" - } - }, - "to-object-path": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", - "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "to-regex": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", - "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", - "dev": true, - "requires": { - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "regex-not": "^1.0.2", - "safe-regex": "^1.1.0" - } - }, - "to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "dev": true, - "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - } - }, - "touch": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz", - "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==", - "dev": true, - "requires": { - "nopt": "~1.0.10" - } - }, - "tough-cookie": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", - "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", - "dev": true, - "requires": { - "psl": "^1.1.24", - "punycode": "^1.4.1" - }, - "dependencies": { - "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", - "dev": true - } - } - }, - "tr46": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-4.1.1.tgz", - "integrity": "sha512-2lv/66T7e5yNyhAAC4NaKe5nVavzuGJQVVtRYLyQ2OI8tsJ61PMLlelehb0wi2Hx6+hT/OJUWZcw8MjlSRnxvw==", - "dev": true, - "requires": { - "punycode": "^2.3.0" - } - }, - "tslib": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.10.0.tgz", - "integrity": "sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==", - "dev": true - }, - "tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", - "dev": true, - "requires": { - "safe-buffer": "^5.0.1" - } - }, - "tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", - "dev": true - }, - "type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", - "dev": true, - "requires": { - "prelude-ls": "~1.1.2" - } - }, - "type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "dev": true - }, - "type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "dev": true - }, - "uglify-js": { - "version": "3.9.4", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.9.4.tgz", - "integrity": "sha512-8RZBJq5smLOa7KslsNsVcSH+KOXf1uDU8yqLeNuVKwmT0T3FA0ZoXlinQfRad7SDcbZZRZE4ov+2v71EnxNyCA==", - "dev": true, - "requires": { - "commander": "~2.20.3" - } - }, - "undefsafe": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.3.tgz", - "integrity": "sha512-nrXZwwXrD/T/JXeygJqdCO6NZZ1L66HrxM/Z7mIq2oPanoN0F1nLx3lwJMu6AwJY69hdixaFQOuoYsMjE5/C2A==", - "dev": true, - "requires": { - "debug": "^2.2.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - } - } - }, - "union-value": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", - "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", - "dev": true, - "requires": { - "arr-union": "^3.1.0", - "get-value": "^2.0.6", - "is-extendable": "^0.1.1", - "set-value": "^2.0.1" - } - }, - "unique-string": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz", - "integrity": "sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo=", - "dev": true, - "requires": { - "crypto-random-string": "^1.0.0" - } - }, - "universalify": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", - "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", - "dev": true - }, - "unset-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", - "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", - "dev": true, - "requires": { - "has-value": "^0.3.1", - "isobject": "^3.0.0" - }, - "dependencies": { - "has-value": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", - "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", - "dev": true, - "requires": { - "get-value": "^2.0.3", - "has-values": "^0.1.4", - "isobject": "^2.0.0" - }, - "dependencies": { - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "dev": true, - "requires": { - "isarray": "1.0.0" - } - } - } - }, - "has-values": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", - "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", - "dev": true - } - } - }, - "unzip-response": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-2.0.1.tgz", - "integrity": "sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c=", - "dev": true - }, - "upath": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", - "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", - "dev": true - }, - "update-notifier": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-2.5.0.tgz", - "integrity": "sha512-gwMdhgJHGuj/+wHJJs9e6PcCszpxR1b236igrOkUofGhqJuG+amlIKwApH1IW1WWl7ovZxsX49lMBWLxSdm5Dw==", - "dev": true, - "requires": { - "boxen": "^1.2.1", - "chalk": "^2.0.1", - "configstore": "^3.0.0", - "import-lazy": "^2.1.0", - "is-ci": "^1.0.10", - "is-installed-globally": "^0.1.0", - "is-npm": "^1.0.0", - "latest-version": "^3.0.0", - "semver-diff": "^2.0.0", - "xdg-basedir": "^3.0.0" - } - }, - "uri-js": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", - "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", - "dev": true, - "requires": { - "punycode": "^2.1.0" - } - }, - "urix": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", - "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", - "dev": true - }, - "url-parse": { - "version": "1.5.10", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", - "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", - "dev": true, - "requires": { - "querystringify": "^2.1.1", - "requires-port": "^1.0.0" - } - }, - "url-parse-lax": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", - "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=", - "dev": true, - "requires": { - "prepend-http": "^1.0.1" - } - }, - "use": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", - "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", - "dev": true - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true - }, - "uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "dev": true - }, - "uuid-validate": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/uuid-validate/-/uuid-validate-0.0.3.tgz", - "integrity": "sha512-Fykw5U4eZESbq739BeLvEBFRuJODfrlmjx5eJux7W817LjRaq4b7/i4t2zxQmhcX+fAj4nMfRdTzO4tmwLKn0w==", - "dev": true - }, - "v8-compile-cache": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.0.tgz", - "integrity": "sha512-usZBT3PW+LOjM25wbqIlZwPeJV+3OSz3M1k1Ws8snlW39dZyYL9lOGC5FgPVHfk0jKmjiDV8Z0mIbVQPiwFs7g==", - "dev": true - }, - "verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - } - }, - "w3c-xmlserializer": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-4.0.0.tgz", - "integrity": "sha512-d+BFHzbiCx6zGfz0HyQ6Rg69w9k19nviJspaj4yNscGjrHu94sVP+aRm75yEbCh+r2/yR+7q6hux9LVtbuTGBw==", - "dev": true, - "requires": { - "xml-name-validator": "^4.0.0" - } - }, - "webidl-conversions": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", - "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", - "dev": true - }, - "whatwg-encoding": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz", - "integrity": "sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==", - "dev": true, - "requires": { - "iconv-lite": "0.6.3" - }, - "dependencies": { - "iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "dev": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - } - } - } - }, - "whatwg-mimetype": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz", - "integrity": "sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==", - "dev": true - }, - "whatwg-url": { - "version": "12.0.1", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-12.0.1.tgz", - "integrity": "sha512-Ed/LrqB8EPlGxjS+TrsXcpUond1mhccS3pchLhzSgPCnTimUCKj3IZE75pAs5m6heB2U2TMerKFUXheyHY+VDQ==", - "dev": true, - "requires": { - "tr46": "^4.1.1", - "webidl-conversions": "^7.0.0" - } - }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - }, - "which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", - "dev": true - }, - "wide-align": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", - "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", - "dev": true, - "requires": { - "string-width": "^1.0.2 || 2" - } - }, - "widest-line": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-2.0.1.tgz", - "integrity": "sha512-Ba5m9/Fa4Xt9eb2ELXt77JxVDV8w7qQrH0zS/TWSJdLyAwQjWoOzpzj5lwVftDz6n/EOu3tNACS84v509qwnJA==", - "dev": true, - "requires": { - "string-width": "^2.1.1" - } - }, - "word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", - "dev": true - }, - "wordwrap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", - "dev": true - }, - "wrap-ansi": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", - "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.0", - "string-width": "^3.0.0", - "strip-ansi": "^5.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true - }, - "emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", - "dev": true - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - } - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true - }, - "write": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz", - "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==", - "dev": true, - "requires": { - "mkdirp": "^0.5.1" - } - }, - "write-file-atomic": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.3.tgz", - "integrity": "sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.11", - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.2" - } - }, - "ws": { - "version": "8.18.2", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.2.tgz", - "integrity": "sha512-DMricUmwGZUVr++AEAe2uiVM7UoO9MAVZMDu05UQOaUII0lp+zOzLLU4Xqh/JvTqklB1T4uELaaPBKyjE1r4fQ==", - "dev": true, - "requires": {} - }, - "xdg-basedir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-3.0.0.tgz", - "integrity": "sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ=", - "dev": true - }, - "xml-name-validator": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz", - "integrity": "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==", - "dev": true - }, - "xmlchars": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", - "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", - "dev": true - }, - "y18n": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", - "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", - "dev": true - }, - "yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", - "dev": true - }, - "yargs": { - "version": "13.3.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", - "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", - "dev": true, - "requires": { - "cliui": "^5.0.0", - "find-up": "^3.0.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^3.0.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^13.1.2" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true - }, - "emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", - "dev": true - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - } - } - }, - "yargs-parser": { - "version": "13.1.2", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", - "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - }, - "dependencies": { - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true - } - } - }, - "yargs-unparser": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-1.6.0.tgz", - "integrity": "sha512-W9tKgmSn0DpSatfri0nx52Joq5hVXgeLiqR/5G0sZNDoLZFOr/xjBUDcShCOGNsBnEMNo1KAMBkTej1Hm62HTw==", - "dev": true, - "requires": { - "flat": "^4.1.0", - "lodash": "^4.17.15", - "yargs": "^13.3.0" - } - } - } -} diff --git a/package.json b/package.json index 312bb129..5405eb66 100644 --- a/package.json +++ b/package.json @@ -1,22 +1,26 @@ { "name": "scripts", "version": "9.0.0", + "private": true, "description": "Simple Analytics visitor facing scripts", "main": "compile.js", + "packageManager": "pnpm@11.17.0", "engines": { - "node": "22.16" + "node": ">=24.12.0 <25", + "pnpm": ">=11.17.0 <12" }, "scripts": { "playground": "./playground.sh", - "watch": "node_modules/.bin/nodemon compile.js --ignore dist", + "watch": "nodemon compile.js --ignore dist", "build": "node compile.js", - "lint": "./node_modules/.bin/eslint --ext .js .", - "pretest": "npm run build -- testing", + "build:testing": "node compile.js testing", + "deploy": "node --env-file-if-exists=.env deploy.mts", + "pretest": "pnpm run build:testing", "test": "node -r dotenv/config ./test/index.js", "test:matrix": "mocha test/helpers/get-browsers.test.js", - "posttest": "npm run build", - "prettier": "prettier --check .", - "test:unit": "npm run build -- testing && mocha ./test/unit && git checkout dist" + "test:deploy": "node --test test/deploy.test.mts", + "posttest": "pnpm run build", + "typecheck": "tsc --noEmit" }, "repository": { "type": "git", @@ -29,8 +33,11 @@ "url": "https://github.com/simpleanalytics/scripts/issues" }, "homepage": "https://github.com/simpleanalytics/scripts#readme", + "dependencies": { + "@clack/prompts": "1.7.0" + }, "devDependencies": { - "acorn": "^8.11.3", + "@types/node": "24.13.3", "browserstack-local": "^1.5.1", "chai": "^4.2.0", "dotenv": "^8.2.0", @@ -39,11 +46,10 @@ "handlebars": "^4.7.6", "mocha": "^6.2.3", "nodemon": "^1.19.4", - "prettier": "3.2.5", "request": "^2.88.0", "selenium-webdriver": "^4.3.1", + "typescript": "7.0.2", "uglify-js": "^3.9.4", - "uuid-validate": "0.0.3", - "jsdom": "^21.1.0" + "uuid-validate": "0.0.3" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml new file mode 100644 index 00000000..cd32086a --- /dev/null +++ b/pnpm-lock.yaml @@ -0,0 +1,3655 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + dependencies: + '@clack/prompts': + specifier: 1.7.0 + version: 1.7.0 + devDependencies: + '@types/node': + specifier: 24.13.3 + version: 24.13.3 + browserstack-local: + specifier: ^1.5.1 + version: 1.5.1(supports-color@5.5.0) + chai: + specifier: ^4.2.0 + version: 4.2.0 + dotenv: + specifier: ^8.2.0 + version: 8.2.0 + eslint: + specifier: ^6.7.2 + version: 6.7.2(supports-color@5.5.0) + esprima: + specifier: ^4.0.1 + version: 4.0.1 + handlebars: + specifier: ^4.7.6 + version: 4.7.6 + mocha: + specifier: ^6.2.3 + version: 6.2.3 + nodemon: + specifier: ^1.19.4 + version: 1.19.4 + request: + specifier: ^2.88.0 + version: 2.88.0 + selenium-webdriver: + specifier: ^4.3.1 + version: 4.3.1 + typescript: + specifier: 7.0.2 + version: 7.0.2 + uglify-js: + specifier: ^3.9.4 + version: 3.9.4 + uuid-validate: + specifier: 0.0.3 + version: 0.0.3 + +packages: + + '@babel/code-frame@7.5.5': + resolution: {integrity: sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw==} + + '@babel/highlight@7.5.0': + resolution: {integrity: sha512-7dV4eu9gBxoM0dAnj/BCFDW9LFU0zvTrkq0ugM7pnHEgguOEeOz1so2ZghEdzviYzQEED0r4EAgpsBChKy1TRQ==} + + '@clack/core@1.4.3': + resolution: {integrity: sha512-/kr3UWNtdJfxZtPgDqUOmG2pvwlmcLGheex5yiZKdwbzZJxhV+HMNR9QNmyY5cGwTNV6LrR7Jtp+KjhUAP1qBQ==} + engines: {node: '>= 20.12.0'} + + '@clack/prompts@1.7.0': + resolution: {integrity: sha512-y7/yvZ2TPAnR9+jnc00klvNNLkJiXFFrQA/hlLCcxA9a2A4zQIOimyFQ9XfwYKiGD1fb5GY8vbKIIgO8d5Tb2A==} + engines: {node: '>= 20.12.0'} + + '@types/keyv@3.1.4': + resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==} + + '@types/node@24.13.3': + resolution: {integrity: sha512-Dh8vAsV36ig5wa9OX4pXvMc9D3Veibfw2wix0CUwYODLD8nkj9UsLjASr49nPg+2eKzxhBV+v7L8pXvT4e639Q==} + + '@types/responselike@1.0.3': + resolution: {integrity: sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==} + + '@typescript/typescript-aix-ppc64@7.0.2': + resolution: {integrity: sha512-MTKKkWB7p/0E9xi1d1tHtZ5PiLkGEMIq88pK2CubZjOsLtYTLqhgIgi6zepFa+9GHZ6h05NMCkQxGKiPXMxXtQ==} + engines: {node: '>=16.20.0'} + cpu: [ppc64] + os: [aix] + + '@typescript/typescript-darwin-arm64@7.0.2': + resolution: {integrity: sha512-gowzar9MwS/aRWp6f3a4KUqzRjAZjOsmGNCM6LcTgXum+dBfgsBVMN+AgvOCCbguXyick6LJhpBszxMebJ8syA==} + engines: {node: '>=16.20.0'} + cpu: [arm64] + os: [darwin] + + '@typescript/typescript-darwin-x64@7.0.2': + resolution: {integrity: sha512-SZ9xZInqApNlNGc9s0W1VSsktYSOe9cFqNOIqmN1Gs8SmkjKZYFt017G4VwPxASInODuAdbTW7sXiFUf893RgA==} + engines: {node: '>=16.20.0'} + cpu: [x64] + os: [darwin] + + '@typescript/typescript-freebsd-arm64@7.0.2': + resolution: {integrity: sha512-W5NH4y/J0plIIS5b2xvTEkU7JFxyqdMAOgf+Ilhl0vHQXKO5dZoxd+C/jEtq56c4F3wk71RB4BMRQ2XdI+bwYQ==} + engines: {node: '>=16.20.0'} + cpu: [arm64] + os: [freebsd] + + '@typescript/typescript-freebsd-x64@7.0.2': + resolution: {integrity: sha512-UMGDx5sTpzNw3WiPebH7l90IWfJggEd+egHt/q6p7/Cm3zqoV7VxkGXt+3DxPIw8CcmvAB0j3sVVfbhX+M4Tpw==} + engines: {node: '>=16.20.0'} + cpu: [x64] + os: [freebsd] + + '@typescript/typescript-linux-arm64@7.0.2': + resolution: {integrity: sha512-Qh4eU4/y3yDjnfjjyPYihMj5/ODIlmt+Bzu17OI+fiSRDW57QmU5SiN63exPRNJPKUzcc1INa1NXdrJ+MqHjUQ==} + engines: {node: '>=16.20.0'} + cpu: [arm64] + os: [linux] + + '@typescript/typescript-linux-arm@7.0.2': + resolution: {integrity: sha512-gffT3xPz9sR7j/YJExkyPntrI0P2EP9XbOyWzth2/Gs0RstK+90RBcO0ncXoXy/beYll1SXw846Nf2zdnEz0QQ==} + engines: {node: '>=16.20.0'} + cpu: [arm] + os: [linux] + + '@typescript/typescript-linux-loong64@7.0.2': + resolution: {integrity: sha512-uEHck9i8hoAzXPiYRib1O7miOnz23SxIeVl6F4LXox+qov1K35jHcEW6VHKvZI+pyvl7fZEP4MCU5LYvIq1GuQ==} + engines: {node: '>=16.20.0'} + cpu: [loong64] + os: [linux] + + '@typescript/typescript-linux-mips64el@7.0.2': + resolution: {integrity: sha512-R4KvAMnE43W5Qeqb0Ly56O3mWMWIAgsMyz36DCaycd5nbg/9kzm0liw3JocfRqyJY0KPmzFjbswozXyW0DnIYA==} + engines: {node: '>=16.20.0'} + cpu: [mips64el] + os: [linux] + + '@typescript/typescript-linux-ppc64@7.0.2': + resolution: {integrity: sha512-DORx5b3sd/4S7eayxm4FQv+A7CrkUIGRaHiwI8oiHTAI1fAPWhF4J0vAlkC8biAlHSVVwxMQ3tjZ2/DVbnQiiA==} + engines: {node: '>=16.20.0'} + cpu: [ppc64] + os: [linux] + + '@typescript/typescript-linux-riscv64@7.0.2': + resolution: {integrity: sha512-wf0jqEDOjrPRnKwYRyyJDRo11KMbvMFrU+q4zqKyChODBzvlkbhNQfKvLxQCcwTpdDaXSHZTVuh0JoCrKCUMHQ==} + engines: {node: '>=16.20.0'} + cpu: [riscv64] + os: [linux] + + '@typescript/typescript-linux-s390x@7.0.2': + resolution: {integrity: sha512-IkwJc3L7yhytWd/ewjyxNDfOmswCm9GWMJT/ue/dU4aZNbwZeYAetq42VyLmsmSjvoX7z74X6ZaYCtzAr0EuGw==} + engines: {node: '>=16.20.0'} + cpu: [s390x] + os: [linux] + + '@typescript/typescript-linux-x64@7.0.2': + resolution: {integrity: sha512-EYdf2cNg7rgCWJnxCdJ+F3V39O8ihb37eHAu1LK8oAFizgTQbPOK7zHHXbPt8rX24COqODXeI3sIf0fCXG7H/A==} + engines: {node: '>=16.20.0'} + cpu: [x64] + os: [linux] + + '@typescript/typescript-netbsd-arm64@7.0.2': + resolution: {integrity: sha512-+polYF4MF04aPpO5FTkHran9yUQDSXqy5GiSDKpsll5jy3l3+g9QLhpf39T+ePtefhXLOGrLl0QIjkQP6VnelA==} + engines: {node: '>=16.20.0'} + cpu: [arm64] + os: [netbsd] + + '@typescript/typescript-netbsd-x64@7.0.2': + resolution: {integrity: sha512-8YIT0EHM/3dq10ZOVF/A7pc/YSMtbcecct4rWtexrnSCHOPcpC2KTLXfTCR6vDpnSiY12heNb1GiN/wu+T/FyA==} + engines: {node: '>=16.20.0'} + cpu: [x64] + os: [netbsd] + + '@typescript/typescript-openbsd-arm64@7.0.2': + resolution: {integrity: sha512-APT8+ClYnuYm1u9+kgGXoMj2VzWzcymwh2gNSQVySHfkRDGOTVkoWLjCmOQSaO+PoqQ57B0flRp9SA+7GnnkzQ==} + engines: {node: '>=16.20.0'} + cpu: [arm64] + os: [openbsd] + + '@typescript/typescript-openbsd-x64@7.0.2': + resolution: {integrity: sha512-yX7s+Q0Dln0Dt9tEzZsAjXXR/+ytBM7AlglaqyeMPxQszJ1JhlJdZ6jLA+IzldHtflX81em7lDao1xXu+aRRkg==} + engines: {node: '>=16.20.0'} + cpu: [x64] + os: [openbsd] + + '@typescript/typescript-sunos-x64@7.0.2': + resolution: {integrity: sha512-dLJDGaLZ1D4HPQn62u1n8mBDkJREwMsAkCdkwd4Ieqw+x3TUyTsqY0YiBCtE6H6OzzgGk3iuZ3vFWRS+E8/d1g==} + engines: {node: '>=16.20.0'} + cpu: [x64] + os: [sunos] + + '@typescript/typescript-win32-arm64@7.0.2': + resolution: {integrity: sha512-Gyl1Vy6OsWesLzmq+EP0Fb7b4Nid5232AvcA2SFcdYreldpNtYFFofPjnt62y9hQy7VTaZp65ICJjuAQRaVcIQ==} + engines: {node: '>=16.20.0'} + cpu: [arm64] + os: [win32] + + '@typescript/typescript-win32-x64@7.0.2': + resolution: {integrity: sha512-0BQ3HkAHHlKLSp1qRvf3SUhGpGsDuhB/jgFw75guyqbxJqEaS0Cw/VFO8i2nHglJUzQCRtMMR/IBAKE3ETMC4g==} + engines: {node: '>=16.20.0'} + cpu: [x64] + os: [win32] + + abbrev@1.1.1: + resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} + + acorn-jsx@5.1.0: + resolution: {integrity: sha512-tMUqwBWfLFbJbizRmEcWSLw6HnFzfdJs2sOJEOwwtVPMoH/0Ay+E703oZz78VSXZiiDcZrQ5XKjPIUQixhmgVw==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 + + acorn@7.1.1: + resolution: {integrity: sha512-add7dgA5ppRPxCFJoAGfMDi7PIBXq1RtGo7BhbLaxwrXPOmw8gq48Y9ozT01hUKy9byMjlR20EJhu5zlkErEkg==} + engines: {node: '>=0.4.0'} + hasBin: true + + agent-base@6.0.2: + resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} + engines: {node: '>= 6.0.0'} + + ajv@6.10.2: + resolution: {integrity: sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw==} + + ansi-align@2.0.0: + resolution: {integrity: sha512-TdlOggdA/zURfMYa7ABC66j+oqfMew58KpJMbUlH3bcZP1b+cBHIHDDn5uH9INsxrHBPjsqM0tDB4jPTF/vgJA==} + + ansi-colors@3.2.3: + resolution: {integrity: sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw==} + engines: {node: '>=6'} + + ansi-escapes@4.3.0: + resolution: {integrity: sha512-EiYhwo0v255HUL6eDyuLrXEkTi7WwVCLAw+SeOQ7M7qdun1z1pum4DEm/nuqIVbPvi9RPPc9k9LbyBv6H0DwVg==} + engines: {node: '>=8'} + + ansi-regex@3.0.0: + resolution: {integrity: sha512-wFUFA5bg5dviipbQQ32yOQhl6gcJaJXiHE7dvR8VYPG97+J/GNC5FKGepKdEDUFeXRzDxPF1X/Btc8L+v7oqIQ==} + engines: {node: '>=4'} + + ansi-regex@4.1.0: + resolution: {integrity: sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==} + engines: {node: '>=6'} + + ansi-regex@5.0.0: + resolution: {integrity: sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==} + engines: {node: '>=8'} + + ansi-styles@3.2.1: + resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} + engines: {node: '>=4'} + + anymatch@2.0.0: + resolution: {integrity: sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==} + + argparse@1.0.10: + resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} + + arr-diff@4.0.0: + resolution: {integrity: sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA==} + engines: {node: '>=0.10.0'} + + arr-flatten@1.1.0: + resolution: {integrity: sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==} + engines: {node: '>=0.10.0'} + + arr-union@3.1.0: + resolution: {integrity: sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q==} + engines: {node: '>=0.10.0'} + + array-unique@0.3.2: + resolution: {integrity: sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ==} + engines: {node: '>=0.10.0'} + + asn1@0.2.4: + resolution: {integrity: sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==} + + assert-plus@1.0.0: + resolution: {integrity: sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==} + engines: {node: '>=0.8'} + + assertion-error@1.1.0: + resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} + + assign-symbols@1.0.0: + resolution: {integrity: sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw==} + engines: {node: '>=0.10.0'} + + astral-regex@1.0.0: + resolution: {integrity: sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==} + engines: {node: '>=4'} + + async-each@1.0.3: + resolution: {integrity: sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==} + + asynckit@0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + + atob@2.1.2: + resolution: {integrity: sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==} + engines: {node: '>= 4.5.0'} + hasBin: true + + aws-sign2@0.7.0: + resolution: {integrity: sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==} + + aws4@1.9.1: + resolution: {integrity: sha512-wMHVg2EOHaMRxbzgFJ9gtjOOCrI80OHLG14rxi28XwOW8ux6IiEbRCGGGqCtdAIg4FQCbW20k9RsT4y3gJlFug==} + + balanced-match@1.0.0: + resolution: {integrity: sha512-9Y0g0Q8rmSt+H33DfKv7FOc3v+iRI+o1lbzt8jGcIosYW37IIW/2XVYq5NPdmaD5NQ59Nk26Kl/vZbwW9Fr8vg==} + + base@0.11.2: + resolution: {integrity: sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==} + engines: {node: '>=0.10.0'} + + bcrypt-pbkdf@1.0.2: + resolution: {integrity: sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==} + + binary-extensions@1.13.1: + resolution: {integrity: sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==} + engines: {node: '>=0.10.0'} + + bindings@1.5.0: + resolution: {integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==} + + boxen@1.3.0: + resolution: {integrity: sha512-TNPjfTr432qx7yOjQyaXm3dSR0MH9vXp7eT1BFSl/C51g+EFnOR9hTg1IreahGBmDNCehscshe45f+C1TBZbLw==} + engines: {node: '>=4'} + + brace-expansion@1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + + braces@2.3.2: + resolution: {integrity: sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==} + engines: {node: '>=0.10.0'} + + browser-stdout@1.3.1: + resolution: {integrity: sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==} + + browserstack-local@1.5.1: + resolution: {integrity: sha512-T/wxyWDzvBHbDvl7fZKpFU7mYze6nrUkBhNy+d+8bXBqgQX10HTYvajIGO0wb49oGSLCPM0CMZTV/s7e6LF0sA==} + + cache-base@1.0.1: + resolution: {integrity: sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==} + engines: {node: '>=0.10.0'} + + callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + + camelcase@4.1.0: + resolution: {integrity: sha512-FxAv7HpHrXbh3aPo4o2qxHay2lkLY3x5Mw3KeE4KQE8ysVfziWeRZDwcjauvwBSGEC/nXUPzZy8zeh4HokqOnw==} + engines: {node: '>=4'} + + camelcase@5.3.1: + resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} + engines: {node: '>=6'} + + capture-stack-trace@1.0.1: + resolution: {integrity: sha512-mYQLZnx5Qt1JgB1WEiMCf2647plpGeQ2NMR/5L0HNZzGQo4fuSPnK+wjfPnKZV0aiJDgzmWqqkV/g7JD+DW0qw==} + engines: {node: '>=0.10.0'} + + caseless@0.12.0: + resolution: {integrity: sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==} + + chai@4.2.0: + resolution: {integrity: sha512-XQU3bhBukrOsQCuwZndwGcCVQHyZi53fQ6Ys1Fym7E4olpIqqZZhhoFJoaKVvV17lWQoXYwgWN2nF5crA8J2jw==} + engines: {node: '>=4'} + + chalk@2.4.2: + resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} + engines: {node: '>=4'} + + chardet@0.7.0: + resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} + + check-error@1.0.2: + resolution: {integrity: sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==} + + chokidar@2.1.8: + resolution: {integrity: sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==} + + ci-info@1.6.0: + resolution: {integrity: sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A==} + + class-utils@0.3.6: + resolution: {integrity: sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==} + engines: {node: '>=0.10.0'} + + cli-boxes@1.0.0: + resolution: {integrity: sha512-3Fo5wu8Ytle8q9iCzS4D2MWVL2X7JVWRiS1BnXbTFDhS9c/REkM9vd1AmabsoZoY5/dGi5TT9iKL8Kb6DeBRQg==} + engines: {node: '>=0.10.0'} + + cli-cursor@3.1.0: + resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} + engines: {node: '>=8'} + + cli-width@2.2.0: + resolution: {integrity: sha512-EJLbKSuvHTrVRynOXCYFTbQKZOFXWNe3/6DN1yrEH3TuuZT1x4dMQnCHnfCrBUUiGjO63enEIfaB17VaRl2d4A==} + + cliui@5.0.0: + resolution: {integrity: sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==} + + collection-visit@1.0.0: + resolution: {integrity: sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw==} + engines: {node: '>=0.10.0'} + + color-convert@1.9.3: + resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + + color-name@1.1.3: + resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} + + combined-stream@1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + + commander@2.20.3: + resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} + + component-emitter@1.3.0: + resolution: {integrity: sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==} + + concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + + configstore@3.1.2: + resolution: {integrity: sha512-vtv5HtGjcYUgFrXc6Kx747B83MRRVS5R1VTEQoXvuP+kMI+if6uywV0nDGoiydJRy4yk7h9od5Og0kxx4zUXmw==} + engines: {node: '>=4'} + + copy-descriptor@0.1.1: + resolution: {integrity: sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw==} + engines: {node: '>=0.10.0'} + + core-util-is@1.0.2: + resolution: {integrity: sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==} + + create-error-class@3.0.2: + resolution: {integrity: sha512-gYTKKexFO3kh200H1Nit76sRwRtOY32vQd3jpAQKpLtZqyNsSQNfI4N7o3eP2wUjV35pTWKRYqFUDBvUha/Pkw==} + engines: {node: '>=0.10.0'} + + cross-spawn@5.1.0: + resolution: {integrity: sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A==} + + cross-spawn@6.0.5: + resolution: {integrity: sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==} + engines: {node: '>=4.8'} + + crypto-random-string@1.0.0: + resolution: {integrity: sha512-GsVpkFPlycH7/fRR7Dhcmnoii54gV1nz7y4CWyeFS14N+JVBBhY+r8amRHE4BwSYal7BPTDp8isvAlCxyFt3Hg==} + engines: {node: '>=4'} + + dashdash@1.14.1: + resolution: {integrity: sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==} + engines: {node: '>=0.10'} + + debug@2.6.9: + resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + debug@3.2.6: + resolution: {integrity: sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==} + deprecated: Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797) + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + debug@4.3.4: + resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + decamelize@1.2.0: + resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} + engines: {node: '>=0.10.0'} + + decode-uri-component@0.2.0: + resolution: {integrity: sha512-hjf+xovcEn31w/EUYdTXQh/8smFL/dzYjohQGEIgjyNavaJfBY2p5F527Bo1VPATxv0VYTUC2bOcXvqFwk78Og==} + engines: {node: '>=0.10'} + + deep-eql@3.0.1: + resolution: {integrity: sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==} + engines: {node: '>=0.12'} + + deep-extend@0.6.0: + resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} + engines: {node: '>=4.0.0'} + + deep-is@0.1.3: + resolution: {integrity: sha512-GtxAN4HvBachZzm4OnWqc45ESpUCMwkYcsjnsPs23FwJbsO+k4t0k9bQCgOmzIlpHO28+WPK/KRbRk0DDHuuDw==} + + define-properties@1.1.3: + resolution: {integrity: sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==} + engines: {node: '>= 0.4'} + + define-property@0.2.5: + resolution: {integrity: sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==} + engines: {node: '>=0.10.0'} + + define-property@1.0.0: + resolution: {integrity: sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==} + engines: {node: '>=0.10.0'} + + define-property@2.0.2: + resolution: {integrity: sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==} + engines: {node: '>=0.10.0'} + + delayed-stream@1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} + + diff@3.5.0: + resolution: {integrity: sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==} + engines: {node: '>=0.3.1'} + + doctrine@3.0.0: + resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} + engines: {node: '>=6.0.0'} + + dot-prop@4.2.0: + resolution: {integrity: sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ==} + engines: {node: '>=4'} + + dotenv@8.2.0: + resolution: {integrity: sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw==} + engines: {node: '>=8'} + + duplexer3@0.1.4: + resolution: {integrity: sha512-CEj8FwwNA4cVH2uFCoHUrmojhYh1vmCdOaneKJXwkeY1i9jnlslVo9dx+hQ5Hl9GnH/Bwy/IjxAyOePyPKYnzA==} + + duplexer@0.1.2: + resolution: {integrity: sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==} + + ecc-jsbn@0.1.2: + resolution: {integrity: sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==} + + emoji-regex@7.0.3: + resolution: {integrity: sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==} + + emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + es-abstract@1.17.6: + resolution: {integrity: sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw==} + engines: {node: '>= 0.4'} + + es-to-primitive@1.2.1: + resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} + engines: {node: '>= 0.4'} + + escape-string-regexp@1.0.5: + resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} + engines: {node: '>=0.8.0'} + + eslint-scope@5.0.0: + resolution: {integrity: sha512-oYrhJW7S0bxAFDvWqzvMPRm6pcgcnWc4QnofCAqRTRfQC0JcwenzGglTtsLyIuuWFfkqDG9vz67cnttSd53djw==} + engines: {node: '>=8.0.0'} + + eslint-utils@1.4.3: + resolution: {integrity: sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==} + engines: {node: '>=6'} + + eslint-visitor-keys@1.1.0: + resolution: {integrity: sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A==} + engines: {node: '>=4'} + + eslint@6.7.2: + resolution: {integrity: sha512-qMlSWJaCSxDFr8fBPvJM9kJwbazrhNcBU3+DszDW1OlEwKBBRWsJc7NJFelvwQpanHCR14cOLD41x8Eqvo3Nng==} + engines: {node: ^8.10.0 || ^10.13.0 || >=11.10.1} + deprecated: This version is no longer supported. Please see https://eslint.org/version-support for other options. + hasBin: true + + espree@6.1.2: + resolution: {integrity: sha512-2iUPuuPP+yW1PZaMSDM9eyVf8D5P0Hi8h83YtZ5bPc/zHYjII5khoixIUTMO794NOY8F/ThF1Bo8ncZILarUTA==} + engines: {node: '>=6.0.0'} + + esprima@4.0.1: + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} + engines: {node: '>=4'} + hasBin: true + + esquery@1.0.1: + resolution: {integrity: sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA==} + engines: {node: '>=0.6'} + + esrecurse@4.2.1: + resolution: {integrity: sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==} + engines: {node: '>=4.0'} + + estraverse@4.3.0: + resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} + engines: {node: '>=4.0'} + + esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + + event-stream@3.3.4: + resolution: {integrity: sha512-QHpkERcGsR0T7Qm3HNJSyXKEEj8AHNxkY3PK8TS2KJvQ7NiSHe3DDpwVKKtoYprL/AreyzFBeIkBIWChAqn60g==} + + execa@0.7.0: + resolution: {integrity: sha512-RztN09XglpYI7aBBrJCPW95jEH7YF1UEPOoX9yDhUTPdp7mK+CQvnLTuD10BNXZ3byLTu2uehZ8EcKT/4CGiFw==} + engines: {node: '>=4'} + + expand-brackets@2.1.4: + resolution: {integrity: sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA==} + engines: {node: '>=0.10.0'} + + extend-shallow@2.0.1: + resolution: {integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==} + engines: {node: '>=0.10.0'} + + extend-shallow@3.0.2: + resolution: {integrity: sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==} + engines: {node: '>=0.10.0'} + + extend@3.0.2: + resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} + + external-editor@3.1.0: + resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==} + engines: {node: '>=4'} + + extglob@2.0.4: + resolution: {integrity: sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==} + engines: {node: '>=0.10.0'} + + extsprintf@1.3.0: + resolution: {integrity: sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==} + engines: {'0': node >=0.6.0} + + fast-deep-equal@2.0.1: + resolution: {integrity: sha512-bCK/2Z4zLidyB4ReuIsvALH6w31YfAQDmXMqMx6FyfHqvBxtjC0eRumeSu4Bs3XtXwpyIywtSTrVT99BxY1f9w==} + + fast-json-stable-stringify@2.0.0: + resolution: {integrity: sha512-eIgZvM9C3P05kg0qxfqaVU6Tma4QedCPIByQOcemV0vju8ot3cS2DpHi4m2G2JvbSMI152rjfLX0p1pkSdyPlQ==} + + fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + + fast-string-truncated-width@3.0.3: + resolution: {integrity: sha512-0jjjIEL6+0jag3l2XWWizO64/aZVtpiGE3t0Zgqxv0DPuxiMjvB3M24fCyhZUO4KomJQPj3LTSUnDP3GpdwC0g==} + + fast-string-width@3.0.2: + resolution: {integrity: sha512-gX8LrtNEI5hq8DVUfRQMbr5lpaS4nMIWV+7XEbXk2b8kiQIizgnlr12B4dA3ZEx3308ze0O4Q1R+cHts8kyUJg==} + + fast-wrap-ansi@0.2.2: + resolution: {integrity: sha512-7F2Fl+TjRSenLqlU3UjSH0iyqopqoZIu7eZVpEirP2g1GtWa2G/ecEmBdgz31+Mxr+ELclgg6sokpSFIQiZ02Q==} + + figures@3.1.0: + resolution: {integrity: sha512-ravh8VRXqHuMvZt/d8GblBeqDMkdJMBdv/2KntFH+ra5MXkO7nxNKpzQ3n6QD/2da1kH0aWmNISdvhM7gl2gVg==} + engines: {node: '>=8'} + + file-entry-cache@5.0.1: + resolution: {integrity: sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==} + engines: {node: '>=4'} + + file-uri-to-path@1.0.0: + resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==} + + fill-range@4.0.0: + resolution: {integrity: sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==} + engines: {node: '>=0.10.0'} + + find-up@3.0.0: + resolution: {integrity: sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==} + engines: {node: '>=6'} + + flat-cache@2.0.1: + resolution: {integrity: sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==} + engines: {node: '>=4'} + + flat@4.1.0: + resolution: {integrity: sha512-Px/TiLIznH7gEDlPXcUD4KnBusa6kR6ayRUVcnEAbreRIuhkqow/mun59BuRXwoYk7ZQOLW1ZM05ilIvK38hFw==} + deprecated: Fixed a prototype pollution security issue in 4.1.0, please upgrade to ^4.1.1 or ^5.0.1. + hasBin: true + + flatted@2.0.1: + resolution: {integrity: sha512-a1hQMktqW9Nmqr5aktAux3JMNqaucxGcjtjWnZLHX7yyPCmlSV3M54nGYbqT8K+0GhF3NBgmJCc3ma+WOgX8Jg==} + + for-in@1.0.2: + resolution: {integrity: sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==} + engines: {node: '>=0.10.0'} + + forever-agent@0.6.1: + resolution: {integrity: sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==} + + form-data@2.3.3: + resolution: {integrity: sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==} + engines: {node: '>= 0.12'} + + fragment-cache@0.2.1: + resolution: {integrity: sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA==} + engines: {node: '>=0.10.0'} + + from@0.1.7: + resolution: {integrity: sha512-twe20eF1OxVxp/ML/kq2p1uc6KvFK/+vs8WjEbeKmV2He22MKm7YF2ANIt+EOqhJ5L3K/SuuPhk0hWQDjOM23g==} + + fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + + fsevents@1.2.13: + resolution: {integrity: sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==} + engines: {node: '>= 4.0'} + os: [darwin] + deprecated: Upgrade to fsevents v2 to mitigate potential security issues + + function-bind@1.1.1: + resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} + + functional-red-black-tree@1.0.1: + resolution: {integrity: sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==} + + get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + + get-func-name@2.0.0: + resolution: {integrity: sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig==} + + get-stream@3.0.0: + resolution: {integrity: sha512-GlhdIUuVakc8SJ6kK0zAFbiGzRFzNnY4jUuEbV9UROo4Y+0Ny4fjvcZFVTeDA4odpFyOQzaw6hXukJSq/f28sQ==} + engines: {node: '>=4'} + + get-value@2.0.6: + resolution: {integrity: sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA==} + engines: {node: '>=0.10.0'} + + getpass@0.1.7: + resolution: {integrity: sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==} + + glob-parent@3.1.0: + resolution: {integrity: sha512-E8Ak/2+dZY6fnzlR7+ueWvhsH1SjHr4jjss4YS/h4py44jY9MhK/VFdaZJAWDz6BbL21KeteKxFSFpq8OS5gVA==} + + glob-parent@5.1.0: + resolution: {integrity: sha512-qjtRgnIVmOfnKUE3NJAQEdk+lKrxfw8t5ke7SXtfMTHcjsBfOfWXCQfdb30zfDoZQ2IRSIiidmjtbHZPZ++Ihw==} + engines: {node: '>= 6'} + + glob@7.1.3: + resolution: {integrity: sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==} + deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me + + glob@7.1.6: + resolution: {integrity: sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==} + deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me + + global-dirs@0.1.1: + resolution: {integrity: sha512-NknMLn7F2J7aflwFOlGdNIuCDpN3VGoSoB+aap3KABFWbHVn1TCgFC+np23J8W2BiZbjfEw3BFBycSMv1AFblg==} + engines: {node: '>=4'} + + globals@12.3.0: + resolution: {integrity: sha512-wAfjdLgFsPZsklLJvOBUBmzYE8/CwhEqSBEMRXA3qxIiNtyqvjYurAtIfDh6chlEPUfmTY3MnZh5Hfh4q0UlIw==} + engines: {node: '>=8'} + + got@6.7.1: + resolution: {integrity: sha512-Y/K3EDuiQN9rTZhBvPRWMLXIKdeD1Rj0nzunfoi0Yyn5WBEbzxXKU9Ub2X41oZBagVWOBU3MuDonFMgPWQFnwg==} + engines: {node: '>=4'} + + graceful-fs@4.2.1: + resolution: {integrity: sha512-b9usnbDGnD928gJB3LrCmxoibr3VE4U2SMo5PBuBnokWyDADTqDPXg4YpwKF1trpH+UbGp7QLicO3+aWEy0+mw==} + + growl@1.10.5: + resolution: {integrity: sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==} + engines: {node: '>=4.x'} + + handlebars@4.7.6: + resolution: {integrity: sha512-1f2BACcBfiwAfStCKZNrUCgqNZkGsAT7UM3kkYtXuLo0KnaVfjKOyf7PRzB6++aK9STyT1Pd2ZCPe3EGOXleXA==} + engines: {node: '>=0.4.7'} + hasBin: true + + har-schema@2.0.0: + resolution: {integrity: sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==} + engines: {node: '>=4'} + + har-validator@5.1.3: + resolution: {integrity: sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==} + engines: {node: '>=6'} + deprecated: this library is no longer supported + + has-flag@3.0.0: + resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} + engines: {node: '>=4'} + + has-symbols@1.0.1: + resolution: {integrity: sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==} + engines: {node: '>= 0.4'} + + has-value@0.3.1: + resolution: {integrity: sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q==} + engines: {node: '>=0.10.0'} + + has-value@1.0.0: + resolution: {integrity: sha512-IBXk4GTsLYdQ7Rvt+GRBrFSVEkmuOUy4re0Xjd9kJSUQpnTrWR4/y9RpfexN9vkAPMFuQoeWKwqzPozRTlasGw==} + engines: {node: '>=0.10.0'} + + has-values@0.1.4: + resolution: {integrity: sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ==} + engines: {node: '>=0.10.0'} + + has-values@1.0.0: + resolution: {integrity: sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ==} + engines: {node: '>=0.10.0'} + + has@1.0.3: + resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} + engines: {node: '>= 0.4.0'} + + he@1.2.0: + resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} + hasBin: true + + http-signature@1.2.0: + resolution: {integrity: sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==} + engines: {node: '>=0.8', npm: '>=1.3.7'} + + https-proxy-agent@5.0.1: + resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} + engines: {node: '>= 6'} + + iconv-lite@0.4.24: + resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} + engines: {node: '>=0.10.0'} + + ignore-by-default@1.0.1: + resolution: {integrity: sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==} + + ignore@4.0.6: + resolution: {integrity: sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==} + engines: {node: '>= 4'} + + immediate@3.0.6: + resolution: {integrity: sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==} + + import-fresh@3.2.1: + resolution: {integrity: sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==} + engines: {node: '>=6'} + + import-lazy@2.1.0: + resolution: {integrity: sha512-m7ZEHgtw69qOGw+jwxXkHlrlIPdTGkyh66zXZ1ajZbxkDBNjSY/LGbmjc7h0s2ELsUDTAhFr55TrPSSqJGPG0A==} + engines: {node: '>=4'} + + imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + + inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. + + inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + ini@1.3.5: + resolution: {integrity: sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==} + deprecated: Please update to ini >=1.3.6 to avoid a prototype pollution issue + + inquirer@7.0.0: + resolution: {integrity: sha512-rSdC7zelHdRQFkWnhsMu2+2SO41mpv2oF2zy4tMhmiLWkcKbOAs87fWAJhVXttKVwhdZvymvnuM95EyEXg2/tQ==} + engines: {node: '>=6.0.0'} + + is-accessor-descriptor@0.1.6: + resolution: {integrity: sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==} + engines: {node: '>=0.10.0'} + deprecated: Please upgrade to v0.1.7 + + is-accessor-descriptor@1.0.0: + resolution: {integrity: sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==} + engines: {node: '>=0.10.0'} + deprecated: Please upgrade to v1.0.1 + + is-binary-path@1.0.1: + resolution: {integrity: sha512-9fRVlXc0uCxEDj1nQzaWONSpbTfx0FmJfzHF7pwlI8DkWGoHBBea4Pg5Ky0ojwwxQmnSifgbKkI06Qv0Ljgj+Q==} + engines: {node: '>=0.10.0'} + + is-buffer@1.1.6: + resolution: {integrity: sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==} + + is-buffer@2.0.4: + resolution: {integrity: sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A==} + engines: {node: '>=4'} + + is-callable@1.2.0: + resolution: {integrity: sha512-pyVD9AaGLxtg6srb2Ng6ynWJqkHU9bEM087AKck0w8QwDarTfNcpIYoU8x8Hv2Icm8u6kFJM18Dag8lyqGkviw==} + engines: {node: '>= 0.4'} + + is-ci@1.2.1: + resolution: {integrity: sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg==} + hasBin: true + + is-data-descriptor@0.1.4: + resolution: {integrity: sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==} + engines: {node: '>=0.10.0'} + deprecated: Please upgrade to v0.1.5 + + is-data-descriptor@1.0.0: + resolution: {integrity: sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==} + engines: {node: '>=0.10.0'} + deprecated: Please upgrade to v1.0.1 + + is-date-object@1.0.2: + resolution: {integrity: sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==} + engines: {node: '>= 0.4'} + + is-descriptor@0.1.6: + resolution: {integrity: sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==} + engines: {node: '>=0.10.0'} + + is-descriptor@1.0.2: + resolution: {integrity: sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==} + engines: {node: '>=0.10.0'} + + is-extendable@0.1.1: + resolution: {integrity: sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==} + engines: {node: '>=0.10.0'} + + is-extendable@1.0.1: + resolution: {integrity: sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==} + engines: {node: '>=0.10.0'} + + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + is-fullwidth-code-point@2.0.0: + resolution: {integrity: sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==} + engines: {node: '>=4'} + + is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + is-glob@3.1.0: + resolution: {integrity: sha512-UFpDDrPgM6qpnFNI+rh/p3bUaq9hKLZN8bMUWzxmcnZVS3omf4IPK+BrewlnWjO1WmUsMYuSjKh4UJuV4+Lqmw==} + engines: {node: '>=0.10.0'} + + is-glob@4.0.1: + resolution: {integrity: sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==} + engines: {node: '>=0.10.0'} + + is-installed-globally@0.1.0: + resolution: {integrity: sha512-ERNhMg+i/XgDwPIPF3u24qpajVreaiSuvpb1Uu0jugw7KKcxGyCX8cgp8P5fwTmAuXku6beDHHECdKArjlg7tw==} + engines: {node: '>=4'} + + is-npm@1.0.0: + resolution: {integrity: sha512-9r39FIr3d+KD9SbX0sfMsHzb5PP3uimOiwr3YupUaUFG4W0l1U57Rx3utpttV7qz5U3jmrO5auUa04LU9pyHsg==} + engines: {node: '>=0.10.0'} + + is-number@3.0.0: + resolution: {integrity: sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==} + engines: {node: '>=0.10.0'} + + is-obj@1.0.1: + resolution: {integrity: sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==} + engines: {node: '>=0.10.0'} + + is-path-inside@1.0.1: + resolution: {integrity: sha512-qhsCR/Esx4U4hg/9I19OVUAJkGWtjRYHMRgUMZE2TDdj+Ag+kttZanLupfddNyglzz50cUlmWzUaI37GDfNx/g==} + engines: {node: '>=0.10.0'} + + is-plain-object@2.0.4: + resolution: {integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==} + engines: {node: '>=0.10.0'} + + is-promise@2.1.0: + resolution: {integrity: sha512-NECAi6wp6CgMesHuVUEK8JwjCvm/tvnn5pCbB42JOHp3mgUizN0nagXu4HEqQZBkieGEQ+jVcMKWqoVd6CDbLQ==} + + is-redirect@1.0.0: + resolution: {integrity: sha512-cr/SlUEe5zOGmzvj9bUyC4LVvkNVAXu4GytXLNMr1pny+a65MpQ9IJzFHD5vi7FyJgb4qt27+eS3TuQnqB+RQw==} + engines: {node: '>=0.10.0'} + + is-regex@1.1.0: + resolution: {integrity: sha512-iI97M8KTWID2la5uYXlkbSDQIg4F6o1sYboZKKTDpnDQMLtUL86zxhgDet3Q2SriaYsyGqZ6Mn2SjbRKeLHdqw==} + engines: {node: '>= 0.4'} + + is-retry-allowed@1.1.0: + resolution: {integrity: sha512-leC1bcIRBHjXtaZSM2gAXNeZsIOdDMgq/kHKAVKQ05JTwvb7hnvrHBEm6mnnMRyE7yu+ljNlcG8YUmALCevSxg==} + engines: {node: '>=0.10.0'} + + is-running@2.1.0: + resolution: {integrity: sha512-mjJd3PujZMl7j+D395WTIO5tU5RIDBfVSRtRR4VOJou3H66E38UjbjvDGh3slJzPuolsb+yQFqwHNNdyp5jg3w==} + + is-stream@1.1.0: + resolution: {integrity: sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==} + engines: {node: '>=0.10.0'} + + is-symbol@1.0.3: + resolution: {integrity: sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==} + engines: {node: '>= 0.4'} + + is-typedarray@1.0.0: + resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==} + + is-windows@1.0.2: + resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} + engines: {node: '>=0.10.0'} + + isarray@1.0.0: + resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} + + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + isobject@2.1.0: + resolution: {integrity: sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==} + engines: {node: '>=0.10.0'} + + isobject@3.0.1: + resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==} + engines: {node: '>=0.10.0'} + + isstream@0.1.2: + resolution: {integrity: sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==} + + js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + js-yaml@3.13.1: + resolution: {integrity: sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==} + hasBin: true + + jsbn@0.1.1: + resolution: {integrity: sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==} + + json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + + json-schema@0.2.3: + resolution: {integrity: sha512-a3xHnILGMtk+hDOqNwHzF6e2fNbiMrXZvxKQiEv2MlgQP+pjIOzqAmKYD2mDpXYE/44M7g+n9p2bKkYWDUcXCQ==} + + json-stable-stringify-without-jsonify@1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + + json-stringify-safe@5.0.1: + resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} + + jsprim@1.4.1: + resolution: {integrity: sha512-4Dj8Rf+fQ+/Pn7C5qeEX02op1WfOss3PKTE9Nsop3Dx+6UPxlm1dr/og7o2cRa5hNN07CACr4NFzRLtj/rjWog==} + engines: {'0': node >=0.6.0} + + jszip@3.10.0: + resolution: {integrity: sha512-LDfVtOLtOxb9RXkYOwPyNBTQDL4eUbqahtoY6x07GiDJHwSYvn8sHHIw8wINImV3MqbMNve2gSuM1DDqEKk09Q==} + + kind-of@3.2.2: + resolution: {integrity: sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==} + engines: {node: '>=0.10.0'} + + kind-of@4.0.0: + resolution: {integrity: sha512-24XsCxmEbRwEDbz/qz3stgin8TTzZ1ESR56OMCN0ujYg+vRutNSiOj9bHH9u85DKgXguraugV5sFuvbD4FW/hw==} + engines: {node: '>=0.10.0'} + + kind-of@5.1.0: + resolution: {integrity: sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==} + engines: {node: '>=0.10.0'} + + kind-of@6.0.3: + resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} + engines: {node: '>=0.10.0'} + + latest-version@3.1.0: + resolution: {integrity: sha512-Be1YRHWWlZaSsrz2U+VInk+tO0EwLIyV+23RhWLINJYwg/UIikxjlj3MhH37/6/EDCAusjajvMkMMUXRaMWl/w==} + engines: {node: '>=4'} + + levn@0.3.0: + resolution: {integrity: sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==} + engines: {node: '>= 0.8.0'} + + lie@3.3.0: + resolution: {integrity: sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==} + + locate-path@3.0.0: + resolution: {integrity: sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==} + engines: {node: '>=6'} + + lodash@4.17.15: + resolution: {integrity: sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==} + + log-symbols@2.2.0: + resolution: {integrity: sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==} + engines: {node: '>=4'} + + lowercase-keys@1.0.1: + resolution: {integrity: sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==} + engines: {node: '>=0.10.0'} + + lru-cache@4.1.5: + resolution: {integrity: sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==} + + make-dir@1.3.0: + resolution: {integrity: sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==} + engines: {node: '>=4'} + + map-cache@0.2.2: + resolution: {integrity: sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==} + engines: {node: '>=0.10.0'} + + map-stream@0.1.0: + resolution: {integrity: sha512-CkYQrPYZfWnu/DAmVCpTSX/xHpKZ80eKh2lAkyA6AJTef6bW+6JpbQZN5rofum7da+SyN1bi5ctTm+lTfcCW3g==} + + map-visit@1.0.0: + resolution: {integrity: sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w==} + engines: {node: '>=0.10.0'} + + micromatch@3.1.10: + resolution: {integrity: sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==} + engines: {node: '>=0.10.0'} + + mime-db@1.43.0: + resolution: {integrity: sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ==} + engines: {node: '>= 0.6'} + + mime-types@2.1.26: + resolution: {integrity: sha512-01paPWYgLrkqAyrlDorC1uDwl2p3qZT7yl806vW7DvDoxwXi46jsjFbg+WdwotBIk6/MbEhO/dh5aZ5sNj/dWQ==} + engines: {node: '>= 0.6'} + + mimic-fn@2.1.0: + resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} + engines: {node: '>=6'} + + minimatch@3.0.4: + resolution: {integrity: sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==} + + minimist@1.2.5: + resolution: {integrity: sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==} + + mixin-deep@1.3.2: + resolution: {integrity: sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==} + engines: {node: '>=0.10.0'} + + mkdirp@0.5.4: + resolution: {integrity: sha512-iG9AK/dJLtJ0XNgTuDbSyNS3zECqDlAhnQW4CsNxBG3LQJBbHmRX1egw39DmtOdCAqY+dKXV+sgPgilNWUKMVw==} + deprecated: Legacy versions of mkdirp are no longer supported. Please update to mkdirp 1.x. (Note that the API surface has changed to use Promises in 1.x.) + hasBin: true + + mkdirp@0.5.5: + resolution: {integrity: sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==} + hasBin: true + + mocha@6.2.3: + resolution: {integrity: sha512-0R/3FvjIGH3eEuG17ccFPk117XL2rWxatr81a57D+r/x2uTYZRbdZ4oVidEUMh2W2TJDa7MdAb12Lm2/qrKajg==} + engines: {node: '>= 6.0.0'} + hasBin: true + + ms@2.0.0: + resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} + + ms@2.1.1: + resolution: {integrity: sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==} + + ms@2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + + mute-stream@0.0.8: + resolution: {integrity: sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==} + + nan@2.14.1: + resolution: {integrity: sha512-isWHgVjnFjh2x2yuJ/tj3JbwoHu3UC2dX5G/88Cm24yB6YopVgxvBObDY7n5xW6ExmFhJpSEQqFPvq9zaXc8Jw==} + + nanomatch@1.2.13: + resolution: {integrity: sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==} + engines: {node: '>=0.10.0'} + + natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + + neo-async@2.6.1: + resolution: {integrity: sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==} + + nice-try@1.0.5: + resolution: {integrity: sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==} + + node-environment-flags@1.0.5: + resolution: {integrity: sha512-VNYPRfGfmZLx0Ye20jWzHUjyTW/c+6Wq+iLhDzUI4XmhrDd9l/FozXV3F2xOaXjvp0co0+v1YSR3CMP6g+VvLQ==} + + nodemon@1.19.4: + resolution: {integrity: sha512-VGPaqQBNk193lrJFotBU8nvWZPqEZY2eIzymy2jjY0fJ9qIsxA0sxQ8ATPl0gZC645gijYEc1jtZvpS8QWzJGQ==} + engines: {node: '>=4'} + hasBin: true + + nopt@1.0.10: + resolution: {integrity: sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==} + hasBin: true + + normalize-path@2.1.1: + resolution: {integrity: sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==} + engines: {node: '>=0.10.0'} + + normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + + npm-run-path@2.0.2: + resolution: {integrity: sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==} + engines: {node: '>=4'} + + oauth-sign@0.9.0: + resolution: {integrity: sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==} + + object-copy@0.1.0: + resolution: {integrity: sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ==} + engines: {node: '>=0.10.0'} + + object-inspect@1.7.0: + resolution: {integrity: sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw==} + + object-keys@1.1.1: + resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} + engines: {node: '>= 0.4'} + + object-visit@1.0.1: + resolution: {integrity: sha512-GBaMwwAVK9qbQN3Scdo0OyvgPW7l3lnaVMj84uTOZlswkX0KpF6fyDBJhtTthf7pymztoN36/KEr1DyhF96zEA==} + engines: {node: '>=0.10.0'} + + object.assign@4.1.0: + resolution: {integrity: sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==} + engines: {node: '>= 0.4'} + + object.getownpropertydescriptors@2.1.0: + resolution: {integrity: sha512-Z53Oah9A3TdLoblT7VKJaTDdXdT+lQO+cNpKVnya5JDe9uLvzu1YyY1yFDFrcxrlRgWrEFH0jJtD/IbuwjcEVg==} + engines: {node: '>= 0.8'} + + object.pick@1.3.0: + resolution: {integrity: sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==} + engines: {node: '>=0.10.0'} + + once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + + onetime@5.1.0: + resolution: {integrity: sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q==} + engines: {node: '>=6'} + + optionator@0.8.3: + resolution: {integrity: sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==} + engines: {node: '>= 0.8.0'} + + os-tmpdir@1.0.2: + resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} + engines: {node: '>=0.10.0'} + + p-finally@1.0.0: + resolution: {integrity: sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==} + engines: {node: '>=4'} + + p-limit@2.2.2: + resolution: {integrity: sha512-WGR+xHecKTr7EbUEhyLSh5Dube9JtdiG78ufaeLxTgpudf/20KqyMioIUZJAezlTIi6evxuoUs9YXc11cU+yzQ==} + engines: {node: '>=6'} + + p-locate@3.0.0: + resolution: {integrity: sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==} + engines: {node: '>=6'} + + p-try@2.2.0: + resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} + engines: {node: '>=6'} + + package-json@4.0.1: + resolution: {integrity: sha512-q/R5GrMek0vzgoomq6rm9OX+3PQve8sLwTirmK30YB3Cu0Bbt9OX9M/SIUnroN5BGJkzwGsFwDaRGD9EwBOlCA==} + engines: {node: '>=4'} + + pako@1.0.11: + resolution: {integrity: sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==} + + parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + + pascalcase@0.1.1: + resolution: {integrity: sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw==} + engines: {node: '>=0.10.0'} + + path-dirname@1.0.2: + resolution: {integrity: sha512-ALzNPpyNq9AqXMBjeymIjFDAkAFH06mHJH/cSBHAgU0s4vfpBn6b2nf8tiRLvagKD8RbTpq2FKTBg7cl9l3c7Q==} + + path-exists@3.0.0: + resolution: {integrity: sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==} + engines: {node: '>=4'} + + path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + + path-is-inside@1.0.2: + resolution: {integrity: sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==} + + path-key@2.0.1: + resolution: {integrity: sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==} + engines: {node: '>=4'} + + pathval@1.1.0: + resolution: {integrity: sha512-qZ181q3ICkag/+lv1X6frDUF84pqCm30qild3LGbD84n0AC75CYwnWsQRDlpz7zDkU5NVcmhHh4LjXK0goLYZA==} + + pause-stream@0.0.11: + resolution: {integrity: sha512-e3FBlXLmN/D1S+zHzanP4E/4Z60oFAa3O051qt1pxa7DEJWKAyil6upYVXCWadEnuoqa4Pkc9oUx9zsxYeRv8A==} + + performance-now@2.1.0: + resolution: {integrity: sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==} + + pify@3.0.0: + resolution: {integrity: sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==} + engines: {node: '>=4'} + + posix-character-classes@0.1.1: + resolution: {integrity: sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg==} + engines: {node: '>=0.10.0'} + + prelude-ls@1.1.2: + resolution: {integrity: sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==} + engines: {node: '>= 0.8.0'} + + prepend-http@1.0.4: + resolution: {integrity: sha512-PhmXi5XmoyKw1Un4E+opM2KcsJInDvKyuOumcjjw3waw86ZNjHwVUOOWLc4bCzLdcKNaWBH9e99sbWzDQsVaYg==} + engines: {node: '>=0.10.0'} + + process-nextick-args@2.0.1: + resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + + progress@2.0.3: + resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==} + engines: {node: '>=0.4.0'} + + ps-tree@1.2.0: + resolution: {integrity: sha512-0VnamPPYHl4uaU/nSFeZZpR21QAWRz+sRv4iW9+v/GS/J5U5iZB5BNN6J0RMoOvdx2gWM2+ZFMIm58q24e4UYA==} + engines: {node: '>= 0.10'} + hasBin: true + + pseudomap@1.0.2: + resolution: {integrity: sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==} + + psl@1.7.0: + resolution: {integrity: sha512-5NsSEDv8zY70ScRnOTn7bK7eanl2MvFrOrS/R6x+dBt5g1ghnj9Zv90kO8GwT8gxcu2ANyFprnFYB85IogIJOQ==} + + pstree.remy@1.1.8: + resolution: {integrity: sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==} + + punycode@1.4.1: + resolution: {integrity: sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==} + + punycode@2.1.1: + resolution: {integrity: sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==} + engines: {node: '>=6'} + + qs@6.5.2: + resolution: {integrity: sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==} + engines: {node: '>=0.6'} + + rc@1.2.8: + resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} + hasBin: true + + readable-stream@2.3.6: + resolution: {integrity: sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==} + + readdirp@2.2.1: + resolution: {integrity: sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==} + engines: {node: '>=0.10'} + + regex-not@1.0.2: + resolution: {integrity: sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==} + engines: {node: '>=0.10.0'} + + regexpp@2.0.1: + resolution: {integrity: sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==} + engines: {node: '>=6.5.0'} + + registry-auth-token@3.4.0: + resolution: {integrity: sha512-4LM6Fw8eBQdwMYcES4yTnn2TqIasbXuwDx3um+QRs7S55aMKCBKBxvPXl2RiUjHwuJLTyYfxSpmfSAjQpcuP+A==} + + registry-url@3.1.0: + resolution: {integrity: sha512-ZbgR5aZEdf4UKZVBPYIgaglBmSF2Hi94s2PcIHhRGFjKYu+chjJdYfHn4rt3hB6eCKLJ8giVIIfgMa1ehDfZKA==} + engines: {node: '>=0.10.0'} + + remove-trailing-separator@1.1.0: + resolution: {integrity: sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==} + + repeat-element@1.1.3: + resolution: {integrity: sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==} + engines: {node: '>=0.10.0'} + + repeat-string@1.6.1: + resolution: {integrity: sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==} + engines: {node: '>=0.10'} + + request@2.88.0: + resolution: {integrity: sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==} + engines: {node: '>= 4'} + deprecated: request has been deprecated, see https://github.com/request/request/issues/3142 + + require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + + require-main-filename@2.0.0: + resolution: {integrity: sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==} + + resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + + resolve-url@0.2.1: + resolution: {integrity: sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg==} + deprecated: https://github.com/lydell/resolve-url#deprecated + + restore-cursor@3.1.0: + resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} + engines: {node: '>=8'} + + ret@0.1.15: + resolution: {integrity: sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==} + engines: {node: '>=0.12'} + + rimraf@2.5.4: + resolution: {integrity: sha512-Lw7SHMjssciQb/rRz7JyPIy9+bbUshEucPoLRvWqy09vC5zQixl8Uet+Zl+SROBB/JMWHJRdCk1qdxNWHNMvlQ==} + deprecated: Rimraf versions prior to v4 are no longer supported + hasBin: true + + rimraf@2.6.3: + resolution: {integrity: sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==} + deprecated: Rimraf versions prior to v4 are no longer supported + hasBin: true + + rimraf@3.0.2: + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + deprecated: Rimraf versions prior to v4 are no longer supported + hasBin: true + + run-async@2.3.0: + resolution: {integrity: sha512-Fx+QT3fGtS0jk8OvKyKgAB2YHPsrmqBRcMeTC5AZ+lp4vzXKPPrFSY3iLdgvjA3HVBkIvJeM6J80LRjx8bQwhA==} + engines: {node: '>=0.12.0'} + + rxjs@6.5.3: + resolution: {integrity: sha512-wuYsAYYFdWTAnAaPoKGNhfpWwKZbJW+HgAJ+mImp+Epl7BG8oNWBCTyRM8gba9k4lk8BgWdoYm21Mo/RYhhbgA==} + engines: {npm: '>=2.0.0'} + + safe-buffer@5.1.2: + resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + + safe-regex@1.1.0: + resolution: {integrity: sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg==} + + safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + + selenium-webdriver@4.3.1: + resolution: {integrity: sha512-TjH/ls1WKRQoFEHcqtn6UtwcLnA3yvx08v9cSSFYvyhp8hJWRtbe9ae2I8uXPisEZ2EaGKKoxBZ4EHv0BJM15g==} + engines: {node: '>= 10.15.0'} + + semver-diff@2.1.0: + resolution: {integrity: sha512-gL8F8L4ORwsS0+iQ34yCYv///jsOq0ZL7WP55d1HnJ32o7tyFYEFQZQA22mrLIacZdU6xecaBBZ+uEiffGNyXw==} + engines: {node: '>=0.10.0'} + + semver@5.7.1: + resolution: {integrity: sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==} + hasBin: true + + semver@6.3.0: + resolution: {integrity: sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==} + hasBin: true + + set-blocking@2.0.0: + resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} + + set-value@2.0.1: + resolution: {integrity: sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==} + engines: {node: '>=0.10.0'} + + setimmediate@1.0.5: + resolution: {integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==} + + shebang-command@1.2.0: + resolution: {integrity: sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==} + engines: {node: '>=0.10.0'} + + shebang-regex@1.0.0: + resolution: {integrity: sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==} + engines: {node: '>=0.10.0'} + + signal-exit@3.0.2: + resolution: {integrity: sha512-meQNNykwecVxdu1RlYMKpQx4+wefIYpmxi6gexo/KAbwquJrBUrBmKYJrE8KFkVQAAVWEnwNdu21PgrD77J3xA==} + + sisteransi@1.0.5: + resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} + + slice-ansi@2.1.0: + resolution: {integrity: sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==} + engines: {node: '>=6'} + + snapdragon-node@2.1.1: + resolution: {integrity: sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==} + engines: {node: '>=0.10.0'} + + snapdragon-util@3.0.1: + resolution: {integrity: sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==} + engines: {node: '>=0.10.0'} + + snapdragon@0.8.2: + resolution: {integrity: sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==} + engines: {node: '>=0.10.0'} + + source-map-resolve@0.5.3: + resolution: {integrity: sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==} + deprecated: See https://github.com/lydell/source-map-resolve#deprecated + + source-map-url@0.4.0: + resolution: {integrity: sha512-liJwHPI9x9d9w5WSIjM58MqGmmb7XzNqwdUA3kSBQ4lmDngexlKwawGzK3J1mKXi6+sysoMDlpVyZh9sv5vRfw==} + deprecated: See https://github.com/lydell/source-map-url#deprecated + + source-map@0.5.7: + resolution: {integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==} + engines: {node: '>=0.10.0'} + + source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + + split-string@3.1.0: + resolution: {integrity: sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==} + engines: {node: '>=0.10.0'} + + split@0.3.3: + resolution: {integrity: sha512-wD2AeVmxXRBoX44wAycgjVpMhvbwdI2aZjCkvfNcH1YqHQvJVa1duWc73OyVGJUc05fhFaTZeQ/PYsrmyH0JVA==} + + sprintf-js@1.0.3: + resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + + sshpk@1.16.1: + resolution: {integrity: sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==} + engines: {node: '>=0.10.0'} + hasBin: true + + static-extend@0.1.2: + resolution: {integrity: sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g==} + engines: {node: '>=0.10.0'} + + stream-combiner@0.0.4: + resolution: {integrity: sha512-rT00SPnTVyRsaSz5zgSPma/aHSOic5U1prhYdRy5HS2kTZviFpmDgzilbtsJsxiroqACmayynDN/9VzIbX5DOw==} + + string-width@2.1.1: + resolution: {integrity: sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==} + engines: {node: '>=4'} + + string-width@3.1.0: + resolution: {integrity: sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==} + engines: {node: '>=6'} + + string-width@4.2.0: + resolution: {integrity: sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==} + engines: {node: '>=8'} + + string.prototype.trimend@1.0.1: + resolution: {integrity: sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g==} + + string.prototype.trimstart@1.0.1: + resolution: {integrity: sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw==} + + string_decoder@1.1.1: + resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} + + strip-ansi@4.0.0: + resolution: {integrity: sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==} + engines: {node: '>=4'} + + strip-ansi@5.2.0: + resolution: {integrity: sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==} + engines: {node: '>=6'} + + strip-ansi@6.0.0: + resolution: {integrity: sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==} + engines: {node: '>=8'} + + strip-eof@1.0.0: + resolution: {integrity: sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==} + engines: {node: '>=0.10.0'} + + strip-json-comments@2.0.1: + resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} + engines: {node: '>=0.10.0'} + + strip-json-comments@3.0.1: + resolution: {integrity: sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw==} + engines: {node: '>=8'} + + supports-color@5.5.0: + resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} + engines: {node: '>=4'} + + supports-color@6.0.0: + resolution: {integrity: sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg==} + engines: {node: '>=6'} + + table@5.4.6: + resolution: {integrity: sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==} + engines: {node: '>=6.0.0'} + + temp-fs@0.9.9: + resolution: {integrity: sha512-WfecDCR1xC9b0nsrzSaxPf3ZuWeWLUWblW4vlDQAa1biQaKHiImHnJfeQocQe/hXKMcolRzgkcVX/7kK4zoWbw==} + engines: {node: '>=0.8.0'} + + term-size@1.2.0: + resolution: {integrity: sha512-7dPUZQGy/+m3/wjVz3ZW5dobSoD/02NxJpoXUX0WIyjfVS3l0c+b/+9phIDFA7FHzkYtwtMFgeGZ/Y8jVTeqQQ==} + engines: {node: '>=4'} + + text-table@0.2.0: + resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} + + through@2.3.8: + resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} + + timed-out@4.0.1: + resolution: {integrity: sha512-G7r3AhovYtr5YKOWQkta8RKAPb+J9IsO4uVmzjl8AZwfhs8UcUwTiD6gcJYSgOtzyjvQKrKYn41syHbUWMkafA==} + engines: {node: '>=0.10.0'} + + tmp@0.0.33: + resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} + engines: {node: '>=0.6.0'} + + tmp@0.2.1: + resolution: {integrity: sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==} + engines: {node: '>=8.17.0'} + + to-object-path@0.3.0: + resolution: {integrity: sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg==} + engines: {node: '>=0.10.0'} + + to-regex-range@2.1.1: + resolution: {integrity: sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==} + engines: {node: '>=0.10.0'} + + to-regex@3.0.2: + resolution: {integrity: sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==} + engines: {node: '>=0.10.0'} + + touch@3.1.0: + resolution: {integrity: sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==} + hasBin: true + + tough-cookie@2.4.3: + resolution: {integrity: sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==} + engines: {node: '>=0.8'} + + tslib@1.10.0: + resolution: {integrity: sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==} + + tunnel-agent@0.6.0: + resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} + + tweetnacl@0.14.5: + resolution: {integrity: sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==} + + type-check@0.3.2: + resolution: {integrity: sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==} + engines: {node: '>= 0.8.0'} + + type-detect@4.0.8: + resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} + engines: {node: '>=4'} + + type-fest@0.8.1: + resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==} + engines: {node: '>=8'} + + typescript@7.0.2: + resolution: {integrity: sha512-8FYau96o3NKOhbjKi/qNvG/W5jhzxkbdm5sj9AbZ/5T5sWqn3hJgLfGx27sRKZWTvyzCP8dLRBTf5tBTSRVUNA==} + engines: {node: '>=16.20.0'} + hasBin: true + + uglify-js@3.9.4: + resolution: {integrity: sha512-8RZBJq5smLOa7KslsNsVcSH+KOXf1uDU8yqLeNuVKwmT0T3FA0ZoXlinQfRad7SDcbZZRZE4ov+2v71EnxNyCA==} + engines: {node: '>=0.8.0'} + hasBin: true + + undefsafe@2.0.3: + resolution: {integrity: sha512-nrXZwwXrD/T/JXeygJqdCO6NZZ1L66HrxM/Z7mIq2oPanoN0F1nLx3lwJMu6AwJY69hdixaFQOuoYsMjE5/C2A==} + + undici-types@7.18.2: + resolution: {integrity: sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==} + + union-value@1.0.1: + resolution: {integrity: sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==} + engines: {node: '>=0.10.0'} + + unique-string@1.0.0: + resolution: {integrity: sha512-ODgiYu03y5g76A1I9Gt0/chLCzQjvzDy7DsZGsLOE/1MrF6wriEskSncj1+/C58Xk/kPZDppSctDybCwOSaGAg==} + engines: {node: '>=4'} + + unset-value@1.0.0: + resolution: {integrity: sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ==} + engines: {node: '>=0.10.0'} + + unzip-response@2.0.1: + resolution: {integrity: sha512-N0XH6lqDtFH84JxptQoZYmloF4nzrQqqrAymNj+/gW60AO2AZgOcf4O/nUXJcYfyQkqvMo9lSupBZmmgvuVXlw==} + engines: {node: '>=4'} + + upath@1.2.0: + resolution: {integrity: sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==} + engines: {node: '>=4'} + + update-notifier@2.5.0: + resolution: {integrity: sha512-gwMdhgJHGuj/+wHJJs9e6PcCszpxR1b236igrOkUofGhqJuG+amlIKwApH1IW1WWl7ovZxsX49lMBWLxSdm5Dw==} + engines: {node: '>=4'} + + uri-js@4.2.2: + resolution: {integrity: sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==} + + urix@0.1.0: + resolution: {integrity: sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg==} + deprecated: Please see https://github.com/lydell/urix#deprecated + + url-parse-lax@1.0.0: + resolution: {integrity: sha512-BVA4lR5PIviy2PMseNd2jbFQ+jwSwQGdJejf5ctd1rEXt0Ypd7yanUK9+lYechVlN5VaTJGsu2U/3MDDu6KgBA==} + engines: {node: '>=0.10.0'} + + use@3.1.1: + resolution: {integrity: sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==} + engines: {node: '>=0.10.0'} + + util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + + uuid-validate@0.0.3: + resolution: {integrity: sha512-Fykw5U4eZESbq739BeLvEBFRuJODfrlmjx5eJux7W817LjRaq4b7/i4t2zxQmhcX+fAj4nMfRdTzO4tmwLKn0w==} + + uuid@3.4.0: + resolution: {integrity: sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==} + deprecated: uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028). + hasBin: true + + v8-compile-cache@2.1.0: + resolution: {integrity: sha512-usZBT3PW+LOjM25wbqIlZwPeJV+3OSz3M1k1Ws8snlW39dZyYL9lOGC5FgPVHfk0jKmjiDV8Z0mIbVQPiwFs7g==} + + verror@1.10.0: + resolution: {integrity: sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==} + engines: {'0': node >=0.6.0} + + which-module@2.0.0: + resolution: {integrity: sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q==} + + which@1.3.1: + resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} + hasBin: true + + wide-align@1.1.3: + resolution: {integrity: sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==} + + widest-line@2.0.1: + resolution: {integrity: sha512-Ba5m9/Fa4Xt9eb2ELXt77JxVDV8w7qQrH0zS/TWSJdLyAwQjWoOzpzj5lwVftDz6n/EOu3tNACS84v509qwnJA==} + engines: {node: '>=4'} + + word-wrap@1.2.3: + resolution: {integrity: sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==} + engines: {node: '>=0.10.0'} + + wordwrap@1.0.0: + resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==} + + wrap-ansi@5.1.0: + resolution: {integrity: sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==} + engines: {node: '>=6'} + + wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + + write-file-atomic@2.4.3: + resolution: {integrity: sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==} + + write@1.0.3: + resolution: {integrity: sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==} + engines: {node: '>=4'} + + ws@8.8.1: + resolution: {integrity: sha512-bGy2JzvzkPowEJV++hF07hAD6niYSr0JzBNo/J29WsB57A2r7Wlc1UFcTR9IzrPvuNVO4B8LGqF8qcpsVOhJCA==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ^5.0.2 + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + xdg-basedir@3.0.0: + resolution: {integrity: sha512-1Dly4xqlulvPD3fZUQJLY+FUIeqN3N2MM3uqe4rCJftAvOjFa3jFGfctOgluGx4ahPbUCsZkmJILiP0Vi4T6lQ==} + engines: {node: '>=4'} + + y18n@4.0.0: + resolution: {integrity: sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==} + + yallist@2.1.2: + resolution: {integrity: sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==} + + yargs-parser@13.1.2: + resolution: {integrity: sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==} + + yargs-unparser@1.6.0: + resolution: {integrity: sha512-W9tKgmSn0DpSatfri0nx52Joq5hVXgeLiqR/5G0sZNDoLZFOr/xjBUDcShCOGNsBnEMNo1KAMBkTej1Hm62HTw==} + engines: {node: '>=6'} + + yargs@13.3.2: + resolution: {integrity: sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==} + +snapshots: + + '@babel/code-frame@7.5.5': + dependencies: + '@babel/highlight': 7.5.0 + + '@babel/highlight@7.5.0': + dependencies: + chalk: 2.4.2 + esutils: 2.0.3 + js-tokens: 4.0.0 + + '@clack/core@1.4.3': + dependencies: + fast-wrap-ansi: 0.2.2 + sisteransi: 1.0.5 + + '@clack/prompts@1.7.0': + dependencies: + '@clack/core': 1.4.3 + fast-string-width: 3.0.2 + fast-wrap-ansi: 0.2.2 + sisteransi: 1.0.5 + + '@types/keyv@3.1.4': + dependencies: + '@types/node': 24.13.3 + + '@types/node@24.13.3': + dependencies: + undici-types: 7.18.2 + + '@types/responselike@1.0.3': + dependencies: + '@types/node': 24.13.3 + + '@typescript/typescript-aix-ppc64@7.0.2': + optional: true + + '@typescript/typescript-darwin-arm64@7.0.2': + optional: true + + '@typescript/typescript-darwin-x64@7.0.2': + optional: true + + '@typescript/typescript-freebsd-arm64@7.0.2': + optional: true + + '@typescript/typescript-freebsd-x64@7.0.2': + optional: true + + '@typescript/typescript-linux-arm64@7.0.2': + optional: true + + '@typescript/typescript-linux-arm@7.0.2': + optional: true + + '@typescript/typescript-linux-loong64@7.0.2': + optional: true + + '@typescript/typescript-linux-mips64el@7.0.2': + optional: true + + '@typescript/typescript-linux-ppc64@7.0.2': + optional: true + + '@typescript/typescript-linux-riscv64@7.0.2': + optional: true + + '@typescript/typescript-linux-s390x@7.0.2': + optional: true + + '@typescript/typescript-linux-x64@7.0.2': + optional: true + + '@typescript/typescript-netbsd-arm64@7.0.2': + optional: true + + '@typescript/typescript-netbsd-x64@7.0.2': + optional: true + + '@typescript/typescript-openbsd-arm64@7.0.2': + optional: true + + '@typescript/typescript-openbsd-x64@7.0.2': + optional: true + + '@typescript/typescript-sunos-x64@7.0.2': + optional: true + + '@typescript/typescript-win32-arm64@7.0.2': + optional: true + + '@typescript/typescript-win32-x64@7.0.2': + optional: true + + abbrev@1.1.1: {} + + acorn-jsx@5.1.0(acorn@7.1.1): + dependencies: + acorn: 7.1.1 + + acorn@7.1.1: {} + + agent-base@6.0.2(supports-color@5.5.0): + dependencies: + debug: 4.3.4(supports-color@5.5.0) + transitivePeerDependencies: + - supports-color + + ajv@6.10.2: + dependencies: + fast-deep-equal: 2.0.1 + fast-json-stable-stringify: 2.0.0 + json-schema-traverse: 0.4.1 + uri-js: 4.2.2 + + ansi-align@2.0.0: + dependencies: + string-width: 2.1.1 + + ansi-colors@3.2.3: {} + + ansi-escapes@4.3.0: + dependencies: + type-fest: 0.8.1 + + ansi-regex@3.0.0: {} + + ansi-regex@4.1.0: {} + + ansi-regex@5.0.0: {} + + ansi-styles@3.2.1: + dependencies: + color-convert: 1.9.3 + + anymatch@2.0.0(supports-color@5.5.0): + dependencies: + micromatch: 3.1.10(supports-color@5.5.0) + normalize-path: 2.1.1 + transitivePeerDependencies: + - supports-color + + argparse@1.0.10: + dependencies: + sprintf-js: 1.0.3 + + arr-diff@4.0.0: {} + + arr-flatten@1.1.0: {} + + arr-union@3.1.0: {} + + array-unique@0.3.2: {} + + asn1@0.2.4: + dependencies: + safer-buffer: 2.1.2 + + assert-plus@1.0.0: {} + + assertion-error@1.1.0: {} + + assign-symbols@1.0.0: {} + + astral-regex@1.0.0: {} + + async-each@1.0.3: {} + + asynckit@0.4.0: {} + + atob@2.1.2: {} + + aws-sign2@0.7.0: {} + + aws4@1.9.1: {} + + balanced-match@1.0.0: {} + + base@0.11.2: + dependencies: + cache-base: 1.0.1 + class-utils: 0.3.6 + component-emitter: 1.3.0 + define-property: 1.0.0 + isobject: 3.0.1 + mixin-deep: 1.3.2 + pascalcase: 0.1.1 + + bcrypt-pbkdf@1.0.2: + dependencies: + tweetnacl: 0.14.5 + + binary-extensions@1.13.1: {} + + bindings@1.5.0: + dependencies: + file-uri-to-path: 1.0.0 + optional: true + + boxen@1.3.0: + dependencies: + ansi-align: 2.0.0 + camelcase: 4.1.0 + chalk: 2.4.2 + cli-boxes: 1.0.0 + string-width: 2.1.1 + term-size: 1.2.0 + widest-line: 2.0.1 + + brace-expansion@1.1.11: + dependencies: + balanced-match: 1.0.0 + concat-map: 0.0.1 + + braces@2.3.2(supports-color@5.5.0): + dependencies: + arr-flatten: 1.1.0 + array-unique: 0.3.2 + extend-shallow: 2.0.1 + fill-range: 4.0.0 + isobject: 3.0.1 + repeat-element: 1.1.3 + snapdragon: 0.8.2(supports-color@5.5.0) + snapdragon-node: 2.1.1 + split-string: 3.1.0 + to-regex: 3.0.2 + transitivePeerDependencies: + - supports-color + + browser-stdout@1.3.1: {} + + browserstack-local@1.5.1(supports-color@5.5.0): + dependencies: + agent-base: 6.0.2(supports-color@5.5.0) + https-proxy-agent: 5.0.1(supports-color@5.5.0) + is-running: 2.1.0 + ps-tree: 1.2.0 + temp-fs: 0.9.9 + transitivePeerDependencies: + - supports-color + + cache-base@1.0.1: + dependencies: + collection-visit: 1.0.0 + component-emitter: 1.3.0 + get-value: 2.0.6 + has-value: 1.0.0 + isobject: 3.0.1 + set-value: 2.0.1 + to-object-path: 0.3.0 + union-value: 1.0.1 + unset-value: 1.0.0 + + callsites@3.1.0: {} + + camelcase@4.1.0: {} + + camelcase@5.3.1: {} + + capture-stack-trace@1.0.1: {} + + caseless@0.12.0: {} + + chai@4.2.0: + dependencies: + assertion-error: 1.1.0 + check-error: 1.0.2 + deep-eql: 3.0.1 + get-func-name: 2.0.0 + pathval: 1.1.0 + type-detect: 4.0.8 + + chalk@2.4.2: + dependencies: + ansi-styles: 3.2.1 + escape-string-regexp: 1.0.5 + supports-color: 5.5.0 + + chardet@0.7.0: {} + + check-error@1.0.2: {} + + chokidar@2.1.8(supports-color@5.5.0): + dependencies: + anymatch: 2.0.0(supports-color@5.5.0) + async-each: 1.0.3 + braces: 2.3.2(supports-color@5.5.0) + glob-parent: 3.1.0 + inherits: 2.0.4 + is-binary-path: 1.0.1 + is-glob: 4.0.1 + normalize-path: 3.0.0 + path-is-absolute: 1.0.1 + readdirp: 2.2.1(supports-color@5.5.0) + upath: 1.2.0 + optionalDependencies: + fsevents: 1.2.13 + transitivePeerDependencies: + - supports-color + + ci-info@1.6.0: {} + + class-utils@0.3.6: + dependencies: + arr-union: 3.1.0 + define-property: 0.2.5 + isobject: 3.0.1 + static-extend: 0.1.2 + + cli-boxes@1.0.0: {} + + cli-cursor@3.1.0: + dependencies: + restore-cursor: 3.1.0 + + cli-width@2.2.0: {} + + cliui@5.0.0: + dependencies: + string-width: 3.1.0 + strip-ansi: 5.2.0 + wrap-ansi: 5.1.0 + + collection-visit@1.0.0: + dependencies: + map-visit: 1.0.0 + object-visit: 1.0.1 + + color-convert@1.9.3: + dependencies: + color-name: 1.1.3 + + color-name@1.1.3: {} + + combined-stream@1.0.8: + dependencies: + delayed-stream: 1.0.0 + + commander@2.20.3: {} + + component-emitter@1.3.0: {} + + concat-map@0.0.1: {} + + configstore@3.1.2: + dependencies: + dot-prop: 4.2.0 + graceful-fs: 4.2.1 + make-dir: 1.3.0 + unique-string: 1.0.0 + write-file-atomic: 2.4.3 + xdg-basedir: 3.0.0 + + copy-descriptor@0.1.1: {} + + core-util-is@1.0.2: {} + + create-error-class@3.0.2: + dependencies: + capture-stack-trace: 1.0.1 + + cross-spawn@5.1.0: + dependencies: + lru-cache: 4.1.5 + shebang-command: 1.2.0 + which: 1.3.1 + + cross-spawn@6.0.5: + dependencies: + nice-try: 1.0.5 + path-key: 2.0.1 + semver: 5.7.1 + shebang-command: 1.2.0 + which: 1.3.1 + + crypto-random-string@1.0.0: {} + + dashdash@1.14.1: + dependencies: + assert-plus: 1.0.0 + + debug@2.6.9(supports-color@5.5.0): + dependencies: + ms: 2.0.0 + optionalDependencies: + supports-color: 5.5.0 + + debug@3.2.6(supports-color@5.5.0): + dependencies: + ms: 2.1.2 + optionalDependencies: + supports-color: 5.5.0 + + debug@3.2.6(supports-color@6.0.0): + dependencies: + ms: 2.1.2 + optionalDependencies: + supports-color: 6.0.0 + + debug@4.3.4(supports-color@5.5.0): + dependencies: + ms: 2.1.2 + optionalDependencies: + supports-color: 5.5.0 + + decamelize@1.2.0: {} + + decode-uri-component@0.2.0: {} + + deep-eql@3.0.1: + dependencies: + type-detect: 4.0.8 + + deep-extend@0.6.0: {} + + deep-is@0.1.3: {} + + define-properties@1.1.3: + dependencies: + object-keys: 1.1.1 + + define-property@0.2.5: + dependencies: + is-descriptor: 0.1.6 + + define-property@1.0.0: + dependencies: + is-descriptor: 1.0.2 + + define-property@2.0.2: + dependencies: + is-descriptor: 1.0.2 + isobject: 3.0.1 + + delayed-stream@1.0.0: {} + + diff@3.5.0: {} + + doctrine@3.0.0: + dependencies: + esutils: 2.0.3 + + dot-prop@4.2.0: + dependencies: + is-obj: 1.0.1 + + dotenv@8.2.0: {} + + duplexer3@0.1.4: {} + + duplexer@0.1.2: {} + + ecc-jsbn@0.1.2: + dependencies: + jsbn: 0.1.1 + safer-buffer: 2.1.2 + + emoji-regex@7.0.3: {} + + emoji-regex@8.0.0: {} + + es-abstract@1.17.6: + dependencies: + es-to-primitive: 1.2.1 + function-bind: 1.1.1 + has: 1.0.3 + has-symbols: 1.0.1 + is-callable: 1.2.0 + is-regex: 1.1.0 + object-inspect: 1.7.0 + object-keys: 1.1.1 + object.assign: 4.1.0 + string.prototype.trimend: 1.0.1 + string.prototype.trimstart: 1.0.1 + + es-to-primitive@1.2.1: + dependencies: + is-callable: 1.2.0 + is-date-object: 1.0.2 + is-symbol: 1.0.3 + + escape-string-regexp@1.0.5: {} + + eslint-scope@5.0.0: + dependencies: + esrecurse: 4.2.1 + estraverse: 4.3.0 + + eslint-utils@1.4.3: + dependencies: + eslint-visitor-keys: 1.1.0 + + eslint-visitor-keys@1.1.0: {} + + eslint@6.7.2(supports-color@5.5.0): + dependencies: + '@babel/code-frame': 7.5.5 + ajv: 6.10.2 + chalk: 2.4.2 + cross-spawn: 6.0.5 + debug: 4.3.4(supports-color@5.5.0) + doctrine: 3.0.0 + eslint-scope: 5.0.0 + eslint-utils: 1.4.3 + eslint-visitor-keys: 1.1.0 + espree: 6.1.2 + esquery: 1.0.1 + esutils: 2.0.3 + file-entry-cache: 5.0.1 + functional-red-black-tree: 1.0.1 + glob-parent: 5.1.0 + globals: 12.3.0 + ignore: 4.0.6 + import-fresh: 3.2.1 + imurmurhash: 0.1.4 + inquirer: 7.0.0 + is-glob: 4.0.1 + js-yaml: 3.13.1 + json-stable-stringify-without-jsonify: 1.0.1 + levn: 0.3.0 + lodash: 4.17.15 + minimatch: 3.0.4 + mkdirp: 0.5.5 + natural-compare: 1.4.0 + optionator: 0.8.3 + progress: 2.0.3 + regexpp: 2.0.1 + semver: 6.3.0 + strip-ansi: 5.2.0 + strip-json-comments: 3.0.1 + table: 5.4.6 + text-table: 0.2.0 + v8-compile-cache: 2.1.0 + transitivePeerDependencies: + - supports-color + + espree@6.1.2: + dependencies: + acorn: 7.1.1 + acorn-jsx: 5.1.0(acorn@7.1.1) + eslint-visitor-keys: 1.1.0 + + esprima@4.0.1: {} + + esquery@1.0.1: + dependencies: + estraverse: 4.3.0 + + esrecurse@4.2.1: + dependencies: + estraverse: 4.3.0 + + estraverse@4.3.0: {} + + esutils@2.0.3: {} + + event-stream@3.3.4: + dependencies: + duplexer: 0.1.2 + from: 0.1.7 + map-stream: 0.1.0 + pause-stream: 0.0.11 + split: 0.3.3 + stream-combiner: 0.0.4 + through: 2.3.8 + + execa@0.7.0: + dependencies: + cross-spawn: 5.1.0 + get-stream: 3.0.0 + is-stream: 1.1.0 + npm-run-path: 2.0.2 + p-finally: 1.0.0 + signal-exit: 3.0.2 + strip-eof: 1.0.0 + + expand-brackets@2.1.4(supports-color@5.5.0): + dependencies: + debug: 2.6.9(supports-color@5.5.0) + define-property: 0.2.5 + extend-shallow: 2.0.1 + posix-character-classes: 0.1.1 + regex-not: 1.0.2 + snapdragon: 0.8.2(supports-color@5.5.0) + to-regex: 3.0.2 + transitivePeerDependencies: + - supports-color + + extend-shallow@2.0.1: + dependencies: + is-extendable: 0.1.1 + + extend-shallow@3.0.2: + dependencies: + assign-symbols: 1.0.0 + is-extendable: 1.0.1 + + extend@3.0.2: {} + + external-editor@3.1.0: + dependencies: + chardet: 0.7.0 + iconv-lite: 0.4.24 + tmp: 0.0.33 + + extglob@2.0.4(supports-color@5.5.0): + dependencies: + array-unique: 0.3.2 + define-property: 1.0.0 + expand-brackets: 2.1.4(supports-color@5.5.0) + extend-shallow: 2.0.1 + fragment-cache: 0.2.1 + regex-not: 1.0.2 + snapdragon: 0.8.2(supports-color@5.5.0) + to-regex: 3.0.2 + transitivePeerDependencies: + - supports-color + + extsprintf@1.3.0: {} + + fast-deep-equal@2.0.1: {} + + fast-json-stable-stringify@2.0.0: {} + + fast-levenshtein@2.0.6: {} + + fast-string-truncated-width@3.0.3: {} + + fast-string-width@3.0.2: + dependencies: + fast-string-truncated-width: 3.0.3 + + fast-wrap-ansi@0.2.2: + dependencies: + fast-string-width: 3.0.2 + + figures@3.1.0: + dependencies: + escape-string-regexp: 1.0.5 + + file-entry-cache@5.0.1: + dependencies: + flat-cache: 2.0.1 + + file-uri-to-path@1.0.0: + optional: true + + fill-range@4.0.0: + dependencies: + extend-shallow: 2.0.1 + is-number: 3.0.0 + repeat-string: 1.6.1 + to-regex-range: 2.1.1 + + find-up@3.0.0: + dependencies: + locate-path: 3.0.0 + + flat-cache@2.0.1: + dependencies: + flatted: 2.0.1 + rimraf: 2.6.3 + write: 1.0.3 + + flat@4.1.0: + dependencies: + is-buffer: 2.0.4 + + flatted@2.0.1: {} + + for-in@1.0.2: {} + + forever-agent@0.6.1: {} + + form-data@2.3.3: + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + mime-types: 2.1.26 + + fragment-cache@0.2.1: + dependencies: + map-cache: 0.2.2 + + from@0.1.7: {} + + fs.realpath@1.0.0: {} + + fsevents@1.2.13: + dependencies: + bindings: 1.5.0 + nan: 2.14.1 + optional: true + + function-bind@1.1.1: {} + + functional-red-black-tree@1.0.1: {} + + get-caller-file@2.0.5: {} + + get-func-name@2.0.0: {} + + get-stream@3.0.0: {} + + get-value@2.0.6: {} + + getpass@0.1.7: + dependencies: + assert-plus: 1.0.0 + + glob-parent@3.1.0: + dependencies: + is-glob: 3.1.0 + path-dirname: 1.0.2 + + glob-parent@5.1.0: + dependencies: + is-glob: 4.0.1 + + glob@7.1.3: + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.0.4 + once: 1.4.0 + path-is-absolute: 1.0.1 + + glob@7.1.6: + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.0.4 + once: 1.4.0 + path-is-absolute: 1.0.1 + + global-dirs@0.1.1: + dependencies: + ini: 1.3.5 + + globals@12.3.0: + dependencies: + type-fest: 0.8.1 + + got@6.7.1: + dependencies: + '@types/keyv': 3.1.4 + '@types/responselike': 1.0.3 + create-error-class: 3.0.2 + duplexer3: 0.1.4 + get-stream: 3.0.0 + is-redirect: 1.0.0 + is-retry-allowed: 1.1.0 + is-stream: 1.1.0 + lowercase-keys: 1.0.1 + safe-buffer: 5.1.2 + timed-out: 4.0.1 + unzip-response: 2.0.1 + url-parse-lax: 1.0.0 + + graceful-fs@4.2.1: {} + + growl@1.10.5: {} + + handlebars@4.7.6: + dependencies: + minimist: 1.2.5 + neo-async: 2.6.1 + source-map: 0.6.1 + wordwrap: 1.0.0 + optionalDependencies: + uglify-js: 3.9.4 + + har-schema@2.0.0: {} + + har-validator@5.1.3: + dependencies: + ajv: 6.10.2 + har-schema: 2.0.0 + + has-flag@3.0.0: {} + + has-symbols@1.0.1: {} + + has-value@0.3.1: + dependencies: + get-value: 2.0.6 + has-values: 0.1.4 + isobject: 2.1.0 + + has-value@1.0.0: + dependencies: + get-value: 2.0.6 + has-values: 1.0.0 + isobject: 3.0.1 + + has-values@0.1.4: {} + + has-values@1.0.0: + dependencies: + is-number: 3.0.0 + kind-of: 4.0.0 + + has@1.0.3: + dependencies: + function-bind: 1.1.1 + + he@1.2.0: {} + + http-signature@1.2.0: + dependencies: + assert-plus: 1.0.0 + jsprim: 1.4.1 + sshpk: 1.16.1 + + https-proxy-agent@5.0.1(supports-color@5.5.0): + dependencies: + agent-base: 6.0.2(supports-color@5.5.0) + debug: 4.3.4(supports-color@5.5.0) + transitivePeerDependencies: + - supports-color + + iconv-lite@0.4.24: + dependencies: + safer-buffer: 2.1.2 + + ignore-by-default@1.0.1: {} + + ignore@4.0.6: {} + + immediate@3.0.6: {} + + import-fresh@3.2.1: + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + + import-lazy@2.1.0: {} + + imurmurhash@0.1.4: {} + + inflight@1.0.6: + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + + inherits@2.0.4: {} + + ini@1.3.5: {} + + inquirer@7.0.0: + dependencies: + ansi-escapes: 4.3.0 + chalk: 2.4.2 + cli-cursor: 3.1.0 + cli-width: 2.2.0 + external-editor: 3.1.0 + figures: 3.1.0 + lodash: 4.17.15 + mute-stream: 0.0.8 + run-async: 2.3.0 + rxjs: 6.5.3 + string-width: 4.2.0 + strip-ansi: 5.2.0 + through: 2.3.8 + + is-accessor-descriptor@0.1.6: + dependencies: + kind-of: 3.2.2 + + is-accessor-descriptor@1.0.0: + dependencies: + kind-of: 6.0.3 + + is-binary-path@1.0.1: + dependencies: + binary-extensions: 1.13.1 + + is-buffer@1.1.6: {} + + is-buffer@2.0.4: {} + + is-callable@1.2.0: {} + + is-ci@1.2.1: + dependencies: + ci-info: 1.6.0 + + is-data-descriptor@0.1.4: + dependencies: + kind-of: 3.2.2 + + is-data-descriptor@1.0.0: + dependencies: + kind-of: 6.0.3 + + is-date-object@1.0.2: {} + + is-descriptor@0.1.6: + dependencies: + is-accessor-descriptor: 0.1.6 + is-data-descriptor: 0.1.4 + kind-of: 5.1.0 + + is-descriptor@1.0.2: + dependencies: + is-accessor-descriptor: 1.0.0 + is-data-descriptor: 1.0.0 + kind-of: 6.0.3 + + is-extendable@0.1.1: {} + + is-extendable@1.0.1: + dependencies: + is-plain-object: 2.0.4 + + is-extglob@2.1.1: {} + + is-fullwidth-code-point@2.0.0: {} + + is-fullwidth-code-point@3.0.0: {} + + is-glob@3.1.0: + dependencies: + is-extglob: 2.1.1 + + is-glob@4.0.1: + dependencies: + is-extglob: 2.1.1 + + is-installed-globally@0.1.0: + dependencies: + global-dirs: 0.1.1 + is-path-inside: 1.0.1 + + is-npm@1.0.0: {} + + is-number@3.0.0: + dependencies: + kind-of: 3.2.2 + + is-obj@1.0.1: {} + + is-path-inside@1.0.1: + dependencies: + path-is-inside: 1.0.2 + + is-plain-object@2.0.4: + dependencies: + isobject: 3.0.1 + + is-promise@2.1.0: {} + + is-redirect@1.0.0: {} + + is-regex@1.1.0: + dependencies: + has-symbols: 1.0.1 + + is-retry-allowed@1.1.0: {} + + is-running@2.1.0: {} + + is-stream@1.1.0: {} + + is-symbol@1.0.3: + dependencies: + has-symbols: 1.0.1 + + is-typedarray@1.0.0: {} + + is-windows@1.0.2: {} + + isarray@1.0.0: {} + + isexe@2.0.0: {} + + isobject@2.1.0: + dependencies: + isarray: 1.0.0 + + isobject@3.0.1: {} + + isstream@0.1.2: {} + + js-tokens@4.0.0: {} + + js-yaml@3.13.1: + dependencies: + argparse: 1.0.10 + esprima: 4.0.1 + + jsbn@0.1.1: {} + + json-schema-traverse@0.4.1: {} + + json-schema@0.2.3: {} + + json-stable-stringify-without-jsonify@1.0.1: {} + + json-stringify-safe@5.0.1: {} + + jsprim@1.4.1: + dependencies: + assert-plus: 1.0.0 + extsprintf: 1.3.0 + json-schema: 0.2.3 + verror: 1.10.0 + + jszip@3.10.0: + dependencies: + lie: 3.3.0 + pako: 1.0.11 + readable-stream: 2.3.6 + setimmediate: 1.0.5 + + kind-of@3.2.2: + dependencies: + is-buffer: 1.1.6 + + kind-of@4.0.0: + dependencies: + is-buffer: 1.1.6 + + kind-of@5.1.0: {} + + kind-of@6.0.3: {} + + latest-version@3.1.0: + dependencies: + package-json: 4.0.1 + + levn@0.3.0: + dependencies: + prelude-ls: 1.1.2 + type-check: 0.3.2 + + lie@3.3.0: + dependencies: + immediate: 3.0.6 + + locate-path@3.0.0: + dependencies: + p-locate: 3.0.0 + path-exists: 3.0.0 + + lodash@4.17.15: {} + + log-symbols@2.2.0: + dependencies: + chalk: 2.4.2 + + lowercase-keys@1.0.1: {} + + lru-cache@4.1.5: + dependencies: + pseudomap: 1.0.2 + yallist: 2.1.2 + + make-dir@1.3.0: + dependencies: + pify: 3.0.0 + + map-cache@0.2.2: {} + + map-stream@0.1.0: {} + + map-visit@1.0.0: + dependencies: + object-visit: 1.0.1 + + micromatch@3.1.10(supports-color@5.5.0): + dependencies: + arr-diff: 4.0.0 + array-unique: 0.3.2 + braces: 2.3.2(supports-color@5.5.0) + define-property: 2.0.2 + extend-shallow: 3.0.2 + extglob: 2.0.4(supports-color@5.5.0) + fragment-cache: 0.2.1 + kind-of: 6.0.3 + nanomatch: 1.2.13(supports-color@5.5.0) + object.pick: 1.3.0 + regex-not: 1.0.2 + snapdragon: 0.8.2(supports-color@5.5.0) + to-regex: 3.0.2 + transitivePeerDependencies: + - supports-color + + mime-db@1.43.0: {} + + mime-types@2.1.26: + dependencies: + mime-db: 1.43.0 + + mimic-fn@2.1.0: {} + + minimatch@3.0.4: + dependencies: + brace-expansion: 1.1.11 + + minimist@1.2.5: {} + + mixin-deep@1.3.2: + dependencies: + for-in: 1.0.2 + is-extendable: 1.0.1 + + mkdirp@0.5.4: + dependencies: + minimist: 1.2.5 + + mkdirp@0.5.5: + dependencies: + minimist: 1.2.5 + + mocha@6.2.3: + dependencies: + ansi-colors: 3.2.3 + browser-stdout: 1.3.1 + debug: 3.2.6(supports-color@6.0.0) + diff: 3.5.0 + escape-string-regexp: 1.0.5 + find-up: 3.0.0 + glob: 7.1.3 + growl: 1.10.5 + he: 1.2.0 + js-yaml: 3.13.1 + log-symbols: 2.2.0 + minimatch: 3.0.4 + mkdirp: 0.5.4 + ms: 2.1.1 + node-environment-flags: 1.0.5 + object.assign: 4.1.0 + strip-json-comments: 2.0.1 + supports-color: 6.0.0 + which: 1.3.1 + wide-align: 1.1.3 + yargs: 13.3.2 + yargs-parser: 13.1.2 + yargs-unparser: 1.6.0 + + ms@2.0.0: {} + + ms@2.1.1: {} + + ms@2.1.2: {} + + mute-stream@0.0.8: {} + + nan@2.14.1: + optional: true + + nanomatch@1.2.13(supports-color@5.5.0): + dependencies: + arr-diff: 4.0.0 + array-unique: 0.3.2 + define-property: 2.0.2 + extend-shallow: 3.0.2 + fragment-cache: 0.2.1 + is-windows: 1.0.2 + kind-of: 6.0.3 + object.pick: 1.3.0 + regex-not: 1.0.2 + snapdragon: 0.8.2(supports-color@5.5.0) + to-regex: 3.0.2 + transitivePeerDependencies: + - supports-color + + natural-compare@1.4.0: {} + + neo-async@2.6.1: {} + + nice-try@1.0.5: {} + + node-environment-flags@1.0.5: + dependencies: + object.getownpropertydescriptors: 2.1.0 + semver: 5.7.1 + + nodemon@1.19.4: + dependencies: + chokidar: 2.1.8(supports-color@5.5.0) + debug: 3.2.6(supports-color@5.5.0) + ignore-by-default: 1.0.1 + minimatch: 3.0.4 + pstree.remy: 1.1.8 + semver: 5.7.1 + supports-color: 5.5.0 + touch: 3.1.0 + undefsafe: 2.0.3(supports-color@5.5.0) + update-notifier: 2.5.0 + + nopt@1.0.10: + dependencies: + abbrev: 1.1.1 + + normalize-path@2.1.1: + dependencies: + remove-trailing-separator: 1.1.0 + + normalize-path@3.0.0: {} + + npm-run-path@2.0.2: + dependencies: + path-key: 2.0.1 + + oauth-sign@0.9.0: {} + + object-copy@0.1.0: + dependencies: + copy-descriptor: 0.1.1 + define-property: 0.2.5 + kind-of: 3.2.2 + + object-inspect@1.7.0: {} + + object-keys@1.1.1: {} + + object-visit@1.0.1: + dependencies: + isobject: 3.0.1 + + object.assign@4.1.0: + dependencies: + define-properties: 1.1.3 + function-bind: 1.1.1 + has-symbols: 1.0.1 + object-keys: 1.1.1 + + object.getownpropertydescriptors@2.1.0: + dependencies: + define-properties: 1.1.3 + es-abstract: 1.17.6 + + object.pick@1.3.0: + dependencies: + isobject: 3.0.1 + + once@1.4.0: + dependencies: + wrappy: 1.0.2 + + onetime@5.1.0: + dependencies: + mimic-fn: 2.1.0 + + optionator@0.8.3: + dependencies: + deep-is: 0.1.3 + fast-levenshtein: 2.0.6 + levn: 0.3.0 + prelude-ls: 1.1.2 + type-check: 0.3.2 + word-wrap: 1.2.3 + + os-tmpdir@1.0.2: {} + + p-finally@1.0.0: {} + + p-limit@2.2.2: + dependencies: + p-try: 2.2.0 + + p-locate@3.0.0: + dependencies: + p-limit: 2.2.2 + + p-try@2.2.0: {} + + package-json@4.0.1: + dependencies: + got: 6.7.1 + registry-auth-token: 3.4.0 + registry-url: 3.1.0 + semver: 5.7.1 + + pako@1.0.11: {} + + parent-module@1.0.1: + dependencies: + callsites: 3.1.0 + + pascalcase@0.1.1: {} + + path-dirname@1.0.2: {} + + path-exists@3.0.0: {} + + path-is-absolute@1.0.1: {} + + path-is-inside@1.0.2: {} + + path-key@2.0.1: {} + + pathval@1.1.0: {} + + pause-stream@0.0.11: + dependencies: + through: 2.3.8 + + performance-now@2.1.0: {} + + pify@3.0.0: {} + + posix-character-classes@0.1.1: {} + + prelude-ls@1.1.2: {} + + prepend-http@1.0.4: {} + + process-nextick-args@2.0.1: {} + + progress@2.0.3: {} + + ps-tree@1.2.0: + dependencies: + event-stream: 3.3.4 + + pseudomap@1.0.2: {} + + psl@1.7.0: {} + + pstree.remy@1.1.8: {} + + punycode@1.4.1: {} + + punycode@2.1.1: {} + + qs@6.5.2: {} + + rc@1.2.8: + dependencies: + deep-extend: 0.6.0 + ini: 1.3.5 + minimist: 1.2.5 + strip-json-comments: 2.0.1 + + readable-stream@2.3.6: + dependencies: + core-util-is: 1.0.2 + inherits: 2.0.4 + isarray: 1.0.0 + process-nextick-args: 2.0.1 + safe-buffer: 5.1.2 + string_decoder: 1.1.1 + util-deprecate: 1.0.2 + + readdirp@2.2.1(supports-color@5.5.0): + dependencies: + graceful-fs: 4.2.1 + micromatch: 3.1.10(supports-color@5.5.0) + readable-stream: 2.3.6 + transitivePeerDependencies: + - supports-color + + regex-not@1.0.2: + dependencies: + extend-shallow: 3.0.2 + safe-regex: 1.1.0 + + regexpp@2.0.1: {} + + registry-auth-token@3.4.0: + dependencies: + rc: 1.2.8 + safe-buffer: 5.1.2 + + registry-url@3.1.0: + dependencies: + rc: 1.2.8 + + remove-trailing-separator@1.1.0: {} + + repeat-element@1.1.3: {} + + repeat-string@1.6.1: {} + + request@2.88.0: + dependencies: + aws-sign2: 0.7.0 + aws4: 1.9.1 + caseless: 0.12.0 + combined-stream: 1.0.8 + extend: 3.0.2 + forever-agent: 0.6.1 + form-data: 2.3.3 + har-validator: 5.1.3 + http-signature: 1.2.0 + is-typedarray: 1.0.0 + isstream: 0.1.2 + json-stringify-safe: 5.0.1 + mime-types: 2.1.26 + oauth-sign: 0.9.0 + performance-now: 2.1.0 + qs: 6.5.2 + safe-buffer: 5.1.2 + tough-cookie: 2.4.3 + tunnel-agent: 0.6.0 + uuid: 3.4.0 + + require-directory@2.1.1: {} + + require-main-filename@2.0.0: {} + + resolve-from@4.0.0: {} + + resolve-url@0.2.1: {} + + restore-cursor@3.1.0: + dependencies: + onetime: 5.1.0 + signal-exit: 3.0.2 + + ret@0.1.15: {} + + rimraf@2.5.4: + dependencies: + glob: 7.1.6 + + rimraf@2.6.3: + dependencies: + glob: 7.1.6 + + rimraf@3.0.2: + dependencies: + glob: 7.1.6 + + run-async@2.3.0: + dependencies: + is-promise: 2.1.0 + + rxjs@6.5.3: + dependencies: + tslib: 1.10.0 + + safe-buffer@5.1.2: {} + + safe-regex@1.1.0: + dependencies: + ret: 0.1.15 + + safer-buffer@2.1.2: {} + + selenium-webdriver@4.3.1: + dependencies: + jszip: 3.10.0 + tmp: 0.2.1 + ws: 8.8.1 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + semver-diff@2.1.0: + dependencies: + semver: 5.7.1 + + semver@5.7.1: {} + + semver@6.3.0: {} + + set-blocking@2.0.0: {} + + set-value@2.0.1: + dependencies: + extend-shallow: 2.0.1 + is-extendable: 0.1.1 + is-plain-object: 2.0.4 + split-string: 3.1.0 + + setimmediate@1.0.5: {} + + shebang-command@1.2.0: + dependencies: + shebang-regex: 1.0.0 + + shebang-regex@1.0.0: {} + + signal-exit@3.0.2: {} + + sisteransi@1.0.5: {} + + slice-ansi@2.1.0: + dependencies: + ansi-styles: 3.2.1 + astral-regex: 1.0.0 + is-fullwidth-code-point: 2.0.0 + + snapdragon-node@2.1.1: + dependencies: + define-property: 1.0.0 + isobject: 3.0.1 + snapdragon-util: 3.0.1 + + snapdragon-util@3.0.1: + dependencies: + kind-of: 3.2.2 + + snapdragon@0.8.2(supports-color@5.5.0): + dependencies: + base: 0.11.2 + debug: 2.6.9(supports-color@5.5.0) + define-property: 0.2.5 + extend-shallow: 2.0.1 + map-cache: 0.2.2 + source-map: 0.5.7 + source-map-resolve: 0.5.3 + use: 3.1.1 + transitivePeerDependencies: + - supports-color + + source-map-resolve@0.5.3: + dependencies: + atob: 2.1.2 + decode-uri-component: 0.2.0 + resolve-url: 0.2.1 + source-map-url: 0.4.0 + urix: 0.1.0 + + source-map-url@0.4.0: {} + + source-map@0.5.7: {} + + source-map@0.6.1: {} + + split-string@3.1.0: + dependencies: + extend-shallow: 3.0.2 + + split@0.3.3: + dependencies: + through: 2.3.8 + + sprintf-js@1.0.3: {} + + sshpk@1.16.1: + dependencies: + asn1: 0.2.4 + assert-plus: 1.0.0 + bcrypt-pbkdf: 1.0.2 + dashdash: 1.14.1 + ecc-jsbn: 0.1.2 + getpass: 0.1.7 + jsbn: 0.1.1 + safer-buffer: 2.1.2 + tweetnacl: 0.14.5 + + static-extend@0.1.2: + dependencies: + define-property: 0.2.5 + object-copy: 0.1.0 + + stream-combiner@0.0.4: + dependencies: + duplexer: 0.1.2 + + string-width@2.1.1: + dependencies: + is-fullwidth-code-point: 2.0.0 + strip-ansi: 4.0.0 + + string-width@3.1.0: + dependencies: + emoji-regex: 7.0.3 + is-fullwidth-code-point: 2.0.0 + strip-ansi: 5.2.0 + + string-width@4.2.0: + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.0 + + string.prototype.trimend@1.0.1: + dependencies: + define-properties: 1.1.3 + es-abstract: 1.17.6 + + string.prototype.trimstart@1.0.1: + dependencies: + define-properties: 1.1.3 + es-abstract: 1.17.6 + + string_decoder@1.1.1: + dependencies: + safe-buffer: 5.1.2 + + strip-ansi@4.0.0: + dependencies: + ansi-regex: 3.0.0 + + strip-ansi@5.2.0: + dependencies: + ansi-regex: 4.1.0 + + strip-ansi@6.0.0: + dependencies: + ansi-regex: 5.0.0 + + strip-eof@1.0.0: {} + + strip-json-comments@2.0.1: {} + + strip-json-comments@3.0.1: {} + + supports-color@5.5.0: + dependencies: + has-flag: 3.0.0 + + supports-color@6.0.0: + dependencies: + has-flag: 3.0.0 + + table@5.4.6: + dependencies: + ajv: 6.10.2 + lodash: 4.17.15 + slice-ansi: 2.1.0 + string-width: 3.1.0 + + temp-fs@0.9.9: + dependencies: + rimraf: 2.5.4 + + term-size@1.2.0: + dependencies: + execa: 0.7.0 + + text-table@0.2.0: {} + + through@2.3.8: {} + + timed-out@4.0.1: {} + + tmp@0.0.33: + dependencies: + os-tmpdir: 1.0.2 + + tmp@0.2.1: + dependencies: + rimraf: 3.0.2 + + to-object-path@0.3.0: + dependencies: + kind-of: 3.2.2 + + to-regex-range@2.1.1: + dependencies: + is-number: 3.0.0 + repeat-string: 1.6.1 + + to-regex@3.0.2: + dependencies: + define-property: 2.0.2 + extend-shallow: 3.0.2 + regex-not: 1.0.2 + safe-regex: 1.1.0 + + touch@3.1.0: + dependencies: + nopt: 1.0.10 + + tough-cookie@2.4.3: + dependencies: + psl: 1.7.0 + punycode: 1.4.1 + + tslib@1.10.0: {} + + tunnel-agent@0.6.0: + dependencies: + safe-buffer: 5.1.2 + + tweetnacl@0.14.5: {} + + type-check@0.3.2: + dependencies: + prelude-ls: 1.1.2 + + type-detect@4.0.8: {} + + type-fest@0.8.1: {} + + typescript@7.0.2: + optionalDependencies: + '@typescript/typescript-aix-ppc64': 7.0.2 + '@typescript/typescript-darwin-arm64': 7.0.2 + '@typescript/typescript-darwin-x64': 7.0.2 + '@typescript/typescript-freebsd-arm64': 7.0.2 + '@typescript/typescript-freebsd-x64': 7.0.2 + '@typescript/typescript-linux-arm': 7.0.2 + '@typescript/typescript-linux-arm64': 7.0.2 + '@typescript/typescript-linux-loong64': 7.0.2 + '@typescript/typescript-linux-mips64el': 7.0.2 + '@typescript/typescript-linux-ppc64': 7.0.2 + '@typescript/typescript-linux-riscv64': 7.0.2 + '@typescript/typescript-linux-s390x': 7.0.2 + '@typescript/typescript-linux-x64': 7.0.2 + '@typescript/typescript-netbsd-arm64': 7.0.2 + '@typescript/typescript-netbsd-x64': 7.0.2 + '@typescript/typescript-openbsd-arm64': 7.0.2 + '@typescript/typescript-openbsd-x64': 7.0.2 + '@typescript/typescript-sunos-x64': 7.0.2 + '@typescript/typescript-win32-arm64': 7.0.2 + '@typescript/typescript-win32-x64': 7.0.2 + + uglify-js@3.9.4: + dependencies: + commander: 2.20.3 + + undefsafe@2.0.3(supports-color@5.5.0): + dependencies: + debug: 2.6.9(supports-color@5.5.0) + transitivePeerDependencies: + - supports-color + + undici-types@7.18.2: {} + + union-value@1.0.1: + dependencies: + arr-union: 3.1.0 + get-value: 2.0.6 + is-extendable: 0.1.1 + set-value: 2.0.1 + + unique-string@1.0.0: + dependencies: + crypto-random-string: 1.0.0 + + unset-value@1.0.0: + dependencies: + has-value: 0.3.1 + isobject: 3.0.1 + + unzip-response@2.0.1: {} + + upath@1.2.0: {} + + update-notifier@2.5.0: + dependencies: + boxen: 1.3.0 + chalk: 2.4.2 + configstore: 3.1.2 + import-lazy: 2.1.0 + is-ci: 1.2.1 + is-installed-globally: 0.1.0 + is-npm: 1.0.0 + latest-version: 3.1.0 + semver-diff: 2.1.0 + xdg-basedir: 3.0.0 + + uri-js@4.2.2: + dependencies: + punycode: 2.1.1 + + urix@0.1.0: {} + + url-parse-lax@1.0.0: + dependencies: + prepend-http: 1.0.4 + + use@3.1.1: {} + + util-deprecate@1.0.2: {} + + uuid-validate@0.0.3: {} + + uuid@3.4.0: {} + + v8-compile-cache@2.1.0: {} + + verror@1.10.0: + dependencies: + assert-plus: 1.0.0 + core-util-is: 1.0.2 + extsprintf: 1.3.0 + + which-module@2.0.0: {} + + which@1.3.1: + dependencies: + isexe: 2.0.0 + + wide-align@1.1.3: + dependencies: + string-width: 2.1.1 + + widest-line@2.0.1: + dependencies: + string-width: 2.1.1 + + word-wrap@1.2.3: {} + + wordwrap@1.0.0: {} + + wrap-ansi@5.1.0: + dependencies: + ansi-styles: 3.2.1 + string-width: 3.1.0 + strip-ansi: 5.2.0 + + wrappy@1.0.2: {} + + write-file-atomic@2.4.3: + dependencies: + graceful-fs: 4.2.1 + imurmurhash: 0.1.4 + signal-exit: 3.0.2 + + write@1.0.3: + dependencies: + mkdirp: 0.5.5 + + ws@8.8.1: {} + + xdg-basedir@3.0.0: {} + + y18n@4.0.0: {} + + yallist@2.1.2: {} + + yargs-parser@13.1.2: + dependencies: + camelcase: 5.3.1 + decamelize: 1.2.0 + + yargs-unparser@1.6.0: + dependencies: + flat: 4.1.0 + lodash: 4.17.15 + yargs: 13.3.2 + + yargs@13.3.2: + dependencies: + cliui: 5.0.0 + find-up: 3.0.0 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + require-main-filename: 2.0.0 + set-blocking: 2.0.0 + string-width: 3.1.0 + which-module: 2.0.0 + y18n: 4.0.0 + yargs-parser: 13.1.2 diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml new file mode 100644 index 00000000..adb667bd --- /dev/null +++ b/pnpm-workspace.yaml @@ -0,0 +1,12 @@ +minimumReleaseAge: 10080 +minimumReleaseAgeStrict: true +minimumReleaseAgeIgnoreMissingTime: false +trustPolicy: no-downgrade +trustLockfile: false +blockExoticSubdeps: true +engineStrict: true +strictDepBuilds: true +verifyDepsBeforeRun: error +allowBuilds: + fsevents: false + nodemon: false diff --git a/test/deploy.test.mts b/test/deploy.test.mts new file mode 100644 index 00000000..3ae74086 --- /dev/null +++ b/test/deploy.test.mts @@ -0,0 +1,208 @@ +import assert from "node:assert/strict"; +import { describe, it } from "node:test"; + +import { + classifyContent, + createManifest, + firstLine, + latestVersionFromNames, + repositoryPolicy, + summarize, + transformContent, + type DeployFile, + type PreviewFile, +} from "../deploy.mts"; + +describe("deployment manifest", () => { + it("maps latest and its legacy companions to both destinations", () => { + const files = createManifest({ + destinations: ["cdn", "custom"], + scripts: ["default"], + variants: ["latest"], + }); + + assert.deepEqual( + files.map((file) => `${file.destination}:${file.remotePath}`), + [ + "cdn:latest.js", + "cdn:latest.js.map", + "cdn:hello.js", + "cdn:hello.js.map", + "cdn:latest.dev.js", + "custom:latest.js", + "custom:latest.js.map", + "custom:events.js", + "custom:events.js.map", + "custom:latest.dev.js", + ], + ); + }); + + it("includes every selected current and versioned file", () => { + const files = createManifest( + { + destinations: ["cdn", "custom"], + scripts: ["default", "auto-events"], + variants: ["latest", "sri", "light", "proxy"], + }, + 12, + ); + + assert.equal(files.length, 30); + assert.deepEqual( + files + .filter((file) => file.immutable) + .map((file) => `${file.destination}:${file.remotePath}`), + [ + "cdn:sri/v12.js", + "cdn:sri/v12.js.map", + "custom:v12/app.js", + "custom:v12/app.js.map", + "custom:v12/light.js", + "custom:v12/light.js.map", + "custom:v12/proxy.js", + "custom:v12/proxy.js.map", + "custom:v12/auto-events.js", + "custom:v12/auto-events.js.map", + ], + ); + }); + + it("deploys standalone auto-events without implicit SRI files", () => { + const files = createManifest({ + destinations: ["cdn", "custom"], + scripts: ["auto-events"], + variants: [], + }); + + assert.deepEqual( + files.map((file) => `${file.destination}:${file.remotePath}`), + [ + "cdn:auto-events.js", + "cdn:auto-events.js.map", + "custom:auto-events.js", + "custom:auto-events.js.map", + ], + ); + assert.equal(files.some((file) => file.immutable), false); + }); + + it("never emits proxy files for a CDN-only selection", () => { + const files = createManifest( + { + destinations: ["cdn"], + scripts: ["default"], + variants: ["proxy", "sri"], + }, + 12, + ); + + assert.equal(files.some((file) => file.remotePath.includes("proxy")), false); + assert.deepEqual( + files.map((file) => file.remotePath), + ["sri/v12.js", "sri/v12.js.map"], + ); + }); + + it("requires a version when SRI is selected", () => { + assert.throws( + () => + createManifest({ + destinations: ["cdn"], + scripts: ["default"], + variants: ["sri"], + }), + /SRI version is required/, + ); + }); + + it("never invents a source map for latest.dev.js", () => { + const files = createManifest({ + destinations: ["cdn", "custom"], + scripts: ["default"], + variants: ["latest"], + }); + + assert.equal( + files.some((file) => file.remotePath === "latest.dev.js.map"), + false, + ); + }); +}); + +describe("SRI content", () => { + const javascriptFile: DeployFile = { + destination: "cdn", + immutable: true, + kind: "javascript", + localPath: "dist/v12/app.js", + remotePath: "sri/v12.js", + transform: "cdn-sri-javascript", + version: 12, + }; + const mapFile: DeployFile = { + ...javascriptFile, + kind: "source-map", + localPath: "dist/v12/app.js.map", + remotePath: "sri/v12.js.map", + transform: "cdn-sri-map", + }; + + it("rewrites CDN source-map references without changing local files", () => { + assert.equal( + transformContent( + javascriptFile, + Buffer.from("code\n//# sourceMappingURL=app.js.map"), + ).toString(), + "code\n//# sourceMappingURL=v12.js.map", + ); + assert.equal( + transformContent( + mapFile, + Buffer.from('{"file":"app.js","sources":["app.js"]}'), + ).toString(), + '{"file":"v12.js","sources":["v12.js"]}', + ); + }); + + it("classifies immutable content without permitting replacement", () => { + const local = Buffer.from("new"); + assert.equal(classifyContent(local, null, true), "create"); + assert.equal(classifyContent(local, Buffer.from("new"), true), "unchanged"); + assert.equal(classifyContent(local, Buffer.from("old"), true), "blocked"); + assert.equal(classifyContent(local, Buffer.from("old"), false), "replace"); + }); +}); + +describe("preview helpers", () => { + it("finds the highest numeric SRI directory", () => { + assert.equal(latestVersionFromNames(["latest", "v2", "v11", "v9"]), 11); + assert.equal(latestVersionFromNames(["latest", "version-1"]), undefined); + }); + + it("extracts CRLF and LF headers", () => { + assert.equal(firstLine(Buffer.from("header\r\nbody")), "header"); + assert.equal(firstLine(Buffer.from("header\nbody")), "header"); + }); + + it("warns for dirty dry runs and blocks dirty deployments", () => { + assert.equal(repositoryPolicy(true, true), "warn"); + assert.equal(repositoryPolicy(false, false), "clean"); + assert.throws(() => repositoryPolicy(false, true), /uncommitted changes/); + }); + + it("summarizes every file state", () => { + const preview = (status: PreviewFile["status"]) => + ({ status }) as PreviewFile; + assert.deepEqual( + summarize([ + preview("create"), + preview("replace"), + preview("unchanged"), + preview("blocked"), + preview("blocked"), + ]), + { blocked: 2, create: 1, replace: 1, unchanged: 1 }, + ); + }); +}); diff --git a/test/index.js b/test/index.js index df4e410e..d2c56300 100644 --- a/test/index.js +++ b/test/index.js @@ -1,12 +1,12 @@ const Mocha = require("mocha"); const { expect } = require("chai"); +const { readFileSync } = require("fs"); const browserstack = require("browserstack-local"); const { Builder } = require("selenium-webdriver"); const { promisify } = require("util"); const { DEBUG, CI } = require("./constants"); const { version, navigate } = require("./helpers"); -const getExitCode = require("./helpers/get-exit-code"); const getBrowsers = require("./helpers/get-browsers"); const { MINIMUM_SESSIONS, @@ -252,7 +252,10 @@ const getDeviceName = ({ suiteInstance.addTest( new Mocha.Test(`Test Node.js environment`, async function () { - expect(process.version, "Should use Node.js 22.16").to.match(/^v22\.16/); + const expectedVersion = `v${readFileSync(".nvmrc", "utf8").trim()}`; + expect(process.version, `Should use Node.js ${expectedVersion}`).to.equal( + expectedVersion + ); }) ); @@ -288,14 +291,12 @@ const getDeviceName = ({ if (nextDriver) { log(`Reusing next driver...`); driver = await nextDriver; - // eslint-disable-next-line require-atomic-updates nextDriver = null; } else { log(`Waiting to get ${browser.name}...`); driver = await getDriverWithTimeout(browser); } - // eslint-disable-next-line require-atomic-updates nextDriver = backgroundDriver; // Try again with new device when driver is not available @@ -351,6 +352,8 @@ const getDeviceName = ({ // Empty global REQUESTS global.REQUESTS = []; + let errorMessage = null; + try { await navigate({ ...browser, @@ -404,6 +407,9 @@ const getDeviceName = ({ }); await require("./test-events")(browser); + } catch (error) { + errorMessage = error.message; + throw error; } finally { // if (!driver) return; // try { @@ -439,6 +445,6 @@ const getDeviceName = ({ } // Exit with exit code when having failures - process.exit(getExitCode({ stopOnFail: STOP_ON_FAIL, amountFailures })); + process.exit(STOP_ON_FAIL && amountFailures > 0 ? 1 : 0); }); })(); diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 00000000..f1072ada --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,15 @@ +{ + "compilerOptions": { + "allowImportingTsExtensions": true, + "erasableSyntaxOnly": true, + "module": "NodeNext", + "moduleResolution": "NodeNext", + "noEmit": true, + "skipLibCheck": true, + "strict": true, + "target": "ESNext", + "types": ["node"], + "verbatimModuleSyntax": true + }, + "include": ["deploy.mts", "test/deploy.test.mts"] +} From 62d0cdafa693f4215075a0e2f8bfb7867f3bda53 Mon Sep 17 00:00:00 2001 From: Simple Analytics Codex Date: Wed, 16 Sep 2026 12:46:19 +0200 Subject: [PATCH 50/62] Use querykeys for query parameter name collection --- dist/latest/auto-events.js | 4 +- dist/latest/auto-events.js.map | 2 +- dist/latest/cloudflare.js | 154 +++++++++++++++++--------- dist/latest/custom/app.js | 4 +- dist/latest/custom/app.js.map | 2 +- dist/latest/custom/auto-events.js | 4 +- dist/latest/custom/auto-events.js.map | 2 +- dist/latest/custom/e.js | 4 +- dist/latest/custom/e.js.map | 2 +- dist/latest/custom/latest.dev.js | 154 +++++++++++++++++--------- dist/latest/custom/latest.js | 4 +- dist/latest/custom/latest.js.map | 2 +- dist/latest/custom/light.js | 4 +- dist/latest/custom/light.js.map | 2 +- dist/latest/custom/proxy.js | 4 +- dist/latest/custom/proxy.js.map | 2 +- dist/latest/hello.js | 4 +- dist/latest/hello.js.map | 2 +- dist/latest/latest.dev.js | 154 +++++++++++++++++--------- dist/latest/latest.js | 4 +- dist/latest/latest.js.map | 2 +- dist/latest/light.js | 4 +- dist/latest/light.js.map | 2 +- dist/v12/app.js | 4 +- dist/v12/app.js.map | 2 +- dist/v12/auto-events.js | 2 +- dist/v12/custom/app.js | 4 +- dist/v12/custom/app.js.map | 2 +- dist/v12/custom/auto-events.js | 2 +- dist/v12/custom/light.js | 2 +- dist/v12/custom/proxy.js | 4 +- dist/v12/custom/proxy.js.map | 2 +- dist/v12/light.js | 2 +- src/default.js | 12 +- test/unit/pageview-query.test.js | 6 +- 35 files changed, 361 insertions(+), 205 deletions(-) diff --git a/dist/latest/auto-events.js b/dist/latest/auto-events.js index c55140ea..d48601dd 100644 --- a/dist/latest/auto-events.js +++ b/dist/latest/auto-events.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy friendly analytics (docs.simpleanalytics.com/script; 2026-08-17; 5dd7; v11) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-16; e658; v12) */ -function r(t,e){var a,o=!1;p.downloads&&/^https?:\/\//i.test(t.href)&&new RegExp("\\.("+(p.downloadsExtensions||[]).join("|")+")$","i").test(t.pathname)?o="download":p.outbound&&/^https?:\/\//i.test(t.href)&&t.hostname!==m.location.hostname?o="outbound":p.emails&&/^mailto:/i.test(t.href)&&(o="email"),o&&(e?(a="saAutomatedLink(this, '"+o+"');",t.hasAttribute("target")&&"_self"!==t.getAttribute("target")||(a+=" return false;"),t.setAttribute("onclick",a)):t.addEventListener("click",function(){saAutomatedLink(this,o)}))}function e(){try{for(var t=document.getElementsByTagName("a"),e=0;e -1,\n emails: collectTypes.indexOf(\"emails\") > -1,\n downloads: collectTypes.indexOf(\"downloads\") > -1,\n // Downloads: enter file extensions you want to collect\n downloadsExtensions: setting(\"extensions\", \"array\", [\n \"pdf\",\n \"csv\",\n \"docx\",\n \"xlsx\",\n \"zip\",\n \"doc\",\n \"xls\",\n ]),\n\n // All: use title attribute if set for event name (for all events)\n // THIS TAKES PRECEDENCE OVER OTHER SETTINGS BELOW\n title: setting(\"useTitle\", \"bool\", true),\n // Outbound: use full URL of the links? false for just the hostname\n outboundFullUrl: fullUrls,\n // Downloads: if taking event name from URL, use full URL or just filename (default)\n downloadsFullUrl: fullUrls,\n };\n\n var saGlobal = setting(\"saGlobal\", \"string\", \"sa_event\");\n\n // For compiling the script\n var optionsLink = options;\n\n if (typeof optionsLink === \"undefined\")\n log(\"options object not found, please specify\", \"warn\");\n\n window.saAutomatedLink = function saAutomatedLink(element, type) {\n try {\n if (!element) return log(\"no element found\");\n var sent = false;\n\n var callback = function () {\n if (\n !sent &&\n (!element.hasAttribute(\"target\") ||\n element.getAttribute(\"target\") === \"_self\")\n )\n document.location = element.getAttribute(\"href\");\n sent = true;\n };\n\n if (window[saGlobal] && window[saGlobal + \"_loaded\"]) {\n var hostname = element.hostname;\n var pathname = element.pathname;\n\n var event;\n var metadata = {\n title: element.getAttribute(\"title\") || undefined,\n };\n var url = element.href || undefined;\n\n var useTitle = false;\n if (optionsLink.title && element.hasAttribute(\"title\")) {\n var theTitle = element.getAttribute(\"title\").trim();\n if (theTitle != \"\") useTitle = true;\n }\n\n if (useTitle) {\n event = theTitle;\n } else {\n switch (type) {\n case \"outbound\": {\n event = hostname + (optionsLink.outboundFullUrl ? pathname : \"\");\n metadata.url = url;\n break;\n }\n case \"download\": {\n event = optionsLink.downloadsFullUrl\n ? hostname + pathname\n : pathname.split(\"/\").pop();\n metadata.url = url;\n break;\n }\n case \"email\": {\n var href = element.getAttribute(\"href\");\n event = (href.split(\":\")[1] || \"\").split(\"?\")[0];\n metadata.email = event;\n break;\n }\n }\n }\n\n var clean =\n type +\n \"_\" +\n event.replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_+|_+$)/g, \"\");\n\n window[saGlobal](clean, metadata, callback);\n\n log(\"collected \" + clean);\n\n return type === \"email\"\n ? callback()\n : window.setTimeout(callback, 5000);\n } else {\n log(saGlobal + \" is not defined\", \"warn\");\n return callback();\n }\n } catch (error) {\n log(error.message, \"warn\");\n }\n };\n\n function collectLink(link, onclick) {\n var collect = false;\n\n // Collect download clicks\n if (\n optionsLink.downloads &&\n /^https?:\\/\\//i.test(link.href) &&\n new RegExp(\n \"\\\\.(\" + (optionsLink.downloadsExtensions || []).join(\"|\") + \")$\",\n \"i\"\n ).test(link.pathname)\n ) {\n collect = \"download\";\n\n // Collect outbound links clicks\n } else if (\n optionsLink.outbound &&\n /^https?:\\/\\//i.test(link.href) &&\n link.hostname !== window.location.hostname\n ) {\n collect = \"outbound\";\n\n // Collect email clicks\n } else if (optionsLink.emails && /^mailto:/i.test(link.href)) {\n collect = \"email\";\n }\n\n if (!collect) return;\n\n if (onclick) {\n var onClickAttribute = \"saAutomatedLink(this, '\" + collect + \"');\";\n\n if (\n !link.hasAttribute(\"target\") ||\n link.getAttribute(\"target\") === \"_self\"\n )\n onClickAttribute += \" return false;\";\n\n link.setAttribute(\"onclick\", onClickAttribute);\n } else {\n link.addEventListener(\"click\", function () {\n saAutomatedLink(this, collect);\n });\n }\n }\n\n function onDOMContentLoaded() {\n try {\n var a = document.getElementsByTagName(\"a\");\n\n // Loop over all links on the page\n for (var i = 0; i < a.length; i++) {\n var link = a[i];\n var href = link.getAttribute(\"href\");\n\n // Skip links that don't have an href\n if (!href) continue;\n\n // We don't want to overwrite website behaviour so we check for the onclick attribute\n if (!link.getAttribute(\"onclick\") && !/^mailto:/.test(href)) {\n collectLink(link, true);\n } else {\n collectLink(link, false);\n }\n }\n } catch (error) {\n log(error.message, \"warn\");\n }\n }\n\n if (doc.readyState === \"ready\" || doc.readyState === \"complete\") {\n onDOMContentLoaded();\n } else {\n document.addEventListener(\"readystatechange\", function (event) {\n if (event.target.readyState === \"complete\") onDOMContentLoaded();\n });\n }\n})(window);\n"],"names":["collectLink","link","onclick","onClickAttribute","collect","optionsLink","downloads","test","href","RegExp","downloadsExtensions","join","pathname","outbound","hostname","window","location","emails","hasAttribute","getAttribute","setAttribute","addEventListener","saAutomatedLink","this","onDOMContentLoaded","a","document","getElementsByTagName","i","length","error","log","message","doc","scriptElement","setting","collectTypes","fullUrls","options","saGlobal","type","logger","console","warn","info","currentScript","querySelector","attribute","defaultValue","value","dataset","split","map","item","trim","filter","Boolean","indexOf","title","outboundFullUrl","downloadsFullUrl","element","sent","callback","theTitle","metadata","undefined","url","useTitle","event","pop","email","clean","replace","setTimeout","readyState","target"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"auto-events.source.js","sources":["auto-events.source.js"],"sourcesContent":["(function saAutomatedEvents(window) {\n // Skip server side rendered pages\n if (typeof window === \"undefined\") return;\n\n var log = function (message, type) {\n var logger = type === \"warn\" ? console.warn : console.info;\n return logger && logger(\"Simple Analytics auto events:\", message);\n };\n\n var doc = window.document;\n\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"auto-events.js\"]');\n\n var setting = function (attribute, type, defaultValue) {\n var value = scriptElement && scriptElement.dataset[attribute];\n\n // Booleans\n if (type === \"bool\" && (value === \"true\" || value === \"false\"))\n return value === \"true\";\n else if (type === \"bool\") return defaultValue;\n\n // Arrays\n if (type === \"array\" && value)\n return value\n .split(\",\")\n .map(function (item) {\n return item.trim();\n })\n .filter(Boolean);\n else if (type === \"array\") return defaultValue;\n\n return value || defaultValue;\n };\n\n var collectTypes = setting(\"collect\", \"array\", [\n \"outbound\",\n \"emails\",\n \"downloads\",\n \"phones\",\n ]);\n var fullUrls = setting(\"fullUrls\", \"bool\", false);\n\n var options = {\n // What to collect\n outbound: collectTypes.indexOf(\"outbound\") > -1,\n emails: collectTypes.indexOf(\"emails\") > -1,\n downloads: collectTypes.indexOf(\"downloads\") > -1,\n phones: collectTypes.indexOf(\"phones\") > -1,\n // Downloads: enter file extensions you want to collect\n downloadsExtensions: setting(\"extensions\", \"array\", [\n \"pdf\",\n \"csv\",\n \"docx\",\n \"xlsx\",\n \"zip\",\n \"doc\",\n \"xls\",\n ]),\n\n // All: use title attribute if set for event name (for all events)\n // THIS TAKES PRECEDENCE OVER OTHER SETTINGS BELOW\n title: setting(\"useTitle\", \"bool\", true),\n // Outbound: use full URL of the links? false for just the hostname\n outboundFullUrl: fullUrls,\n // Downloads: if taking event name from URL, use full URL or just filename (default)\n downloadsFullUrl: fullUrls,\n };\n\n var saGlobal = setting(\"saGlobal\", \"string\", \"sa_event\");\n\n // For compiling the script\n var optionsLink = options;\n\n if (typeof optionsLink === \"undefined\")\n log(\"options object not found, please specify\", \"warn\");\n\n var saAutomatedLink = function saAutomatedLink(element, type) {\n try {\n if (!element) return log(\"no element found\");\n var sent = false;\n\n var callback = function () {\n if (\n !sent &&\n (!element.hasAttribute(\"target\") ||\n element.getAttribute(\"target\") === \"_self\")\n )\n document.location = element.getAttribute(\"href\");\n sent = true;\n };\n\n if (window[saGlobal] && window[saGlobal + \"_loaded\"]) {\n var hostname = element.hostname;\n var pathname = element.pathname;\n\n var event;\n var metadata = {\n title: element.getAttribute(\"title\") || undefined,\n };\n var url = element.href || undefined;\n\n var useTitle = false;\n if (optionsLink.title && element.hasAttribute(\"title\")) {\n var theTitle = element.getAttribute(\"title\").trim();\n if (theTitle != \"\") useTitle = true;\n }\n\n if (useTitle) {\n event = theTitle;\n } else {\n switch (type) {\n case \"outbound\": {\n event = hostname + (optionsLink.outboundFullUrl ? pathname : \"\");\n metadata.url = url;\n break;\n }\n case \"download\": {\n event = optionsLink.downloadsFullUrl\n ? hostname + pathname\n : pathname.split(\"/\").pop();\n metadata.url = url;\n break;\n }\n case \"email\": {\n var href = element.getAttribute(\"href\");\n event = (href.split(\":\")[1] || \"\").split(\"?\")[0];\n metadata.email = event;\n break;\n }\n case \"phone\": {\n var hrefPhone = element.getAttribute(\"href\");\n event = (hrefPhone.split(\":\")[1] || \"\").split(\"?\")[0];\n metadata.phone = event;\n break;\n }\n }\n }\n\n var clean =\n type +\n \"_\" +\n event.replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_+|_+$)/g, \"\");\n\n window[saGlobal](clean, metadata, callback);\n\n log(\"collected \" + clean);\n\n return type === \"email\" || type === \"phone\"\n ? callback()\n : window.setTimeout(callback, 5000);\n } else {\n log(saGlobal + \" is not defined\", \"warn\");\n return callback();\n }\n } catch (error) {\n log(error.message, \"warn\");\n }\n };\n\n window.saAutomatedLink = saAutomatedLink;\n\n function collectLink(link, onclick) {\n if (link.hasAttribute(\"data-simple-event\")) return;\n var collect = false;\n\n // Collect download clicks\n if (\n optionsLink.downloads &&\n /^https?:\\/\\//i.test(link.href) &&\n new RegExp(\n \"\\\\.(\" + (optionsLink.downloadsExtensions || []).join(\"|\") + \")$\",\n \"i\"\n ).test(link.pathname)\n ) {\n collect = \"download\";\n\n // Collect outbound links clicks\n } else if (\n optionsLink.outbound &&\n /^https?:\\/\\//i.test(link.href) &&\n link.hostname !== window.location.hostname\n ) {\n collect = \"outbound\";\n\n // Collect email clicks\n } else if (optionsLink.emails && /^mailto:/i.test(link.href)) {\n collect = \"email\";\n\n // Collect telephone clicks\n } else if (optionsLink.phones && /^tel:/i.test(link.href)) {\n collect = \"phone\";\n }\n\n if (!collect) return;\n\n if (onclick) {\n var onClickAttribute = \"saAutomatedLink(this, '\" + collect + \"');\";\n\n if (\n !link.hasAttribute(\"target\") ||\n link.getAttribute(\"target\") === \"_self\"\n )\n onClickAttribute += \" return false;\";\n\n link.setAttribute(\"onclick\", onClickAttribute);\n } else {\n link.addEventListener(\"click\", function () {\n saAutomatedLink(this, collect);\n });\n }\n }\n\n function onDOMContentLoaded() {\n try {\n var a = document.getElementsByTagName(\"a\");\n\n // Loop over all links on the page\n for (var i = 0; i < a.length; i++) {\n var link = a[i];\n var href = link.getAttribute(\"href\");\n\n // Skip links that don't have an href\n if (!href) continue;\n\n // We don't want to overwrite website behaviour so we check for the onclick attribute\n if (\n !link.getAttribute(\"onclick\") &&\n !/^mailto:/.test(href) &&\n !/^tel:/.test(href)\n ) {\n collectLink(link, true);\n } else {\n collectLink(link, false);\n }\n }\n } catch (error) {\n log(error.message, \"warn\");\n }\n }\n\n if (doc.readyState === \"ready\" || doc.readyState === \"complete\") {\n onDOMContentLoaded();\n } else {\n document.addEventListener(\"readystatechange\", function (event) {\n if (event.target.readyState === \"complete\") onDOMContentLoaded();\n });\n }\n})(window);\n"],"names":["collectLink","link","onclick","collect","onClickAttribute","hasAttribute","optionsLink","downloads","test","href","RegExp","downloadsExtensions","join","pathname","outbound","hostname","window","location","emails","phones","getAttribute","setAttribute","addEventListener","saAutomatedLink","this","onDOMContentLoaded","a","document","getElementsByTagName","i","length","error","log","message","doc","scriptElement","setting","collectTypes","fullUrls","options","saGlobal","type","logger","console","warn","info","currentScript","querySelector","attribute","defaultValue","value","dataset","split","map","item","trim","filter","Boolean","indexOf","title","outboundFullUrl","downloadsFullUrl","element","sent","callback","theTitle","metadata","undefined","url","useTitle","event","pop","email","phone","clean","replace","setTimeout","readyState","target"],"mappings":"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"} \ No newline at end of file diff --git a/dist/latest/cloudflare.js b/dist/latest/cloudflare.js index adc0447b..c6c62a83 100644 --- a/dist/latest/cloudflare.js +++ b/dist/latest/cloudflare.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy friendly analytics (docs.simpleanalytics.com/script; 2026-08-17; 6b9f; v11) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-16; b9db; v12) */ /* eslint-env browser */ (function ( @@ -193,11 +193,17 @@ attr(scriptElement, namespaceText) || defaultNamespace; - var metadataObject = window[namespace + "_metadata"]; var appendMetadata = function (metadata, data) { + var metadataObject = window[namespace + "_metadata"]; if (isObject(metadataObject)) metadata = assign(metadata, metadataObject); var metadataCollectorFunction = window[metadataCollector]; - if (!isFunction(metadataCollectorFunction)) return metadata; + if (!isFunction(metadataCollectorFunction)) { + if (metadataCollector) + warn( + metadataCollector + " not found, set window." + metadataCollector + ); + return metadata; + } try { return assign( metadata, @@ -218,32 +224,40 @@ overwriteOptions.strictUtm || attr(scriptElement, "strict-utm") == trueText; - var getQueryParams = function (ignoreSource) { - return ( - loc.search - .slice(1) - .split("&") - .filter(function (keyValue) { - var ignore = ignoreSource || !collectMetricByString("ut"); - - var paramsRegexList = allowParams.map(filterRegex).join("|"); - var regex = ignore - ? "^(" + paramsRegexList + ")=" - : "^((utm_)" + - (strictUtm ? "" : "?") + - "(source|medium|content|term|campaign)" + - (strictUtm ? "" : "|ref") + - "|" + - paramsRegexList + - ")="; - if (ignore && !allowParams.length) return falseVar; - - // The prefix "utm_" is optional with "strictUtm" disabled - // "ref" is only collected when "strictUtm" is disabled - return new RegExp(regex).test(keyValue); - }) - .join("&") || undefinedVar - ); + var k; + + var getQueryParams = function (ignoreSource, overwriteSearch) { + k = !ignoreSource && collectMetricByString("q") ? "" : falseVar; + var q = (overwriteSearch || loc.search) + .slice(1) + .split("&") + .filter(function (keyValue) { + var i = keyValue.indexOf("="); + if (k !== falseVar && i > 0 && keyValue.slice(i + 1)) + k += (k ? "," : "") + keyValue.slice(0, i); + + var ignore = ignoreSource || !collectMetricByString("ut"); + + var paramsRegexList = allowParams.map(filterRegex).join("|"); + var regex = ignore + ? "^(" + paramsRegexList + ")=" + : "^((utm_)" + + (strictUtm ? "" : "?") + + "(source|medium|content|term|campaign)" + + (strictUtm ? "" : "|ref") + + "|" + + paramsRegexList + + ")="; + if (ignore && !allowParams.length) return falseVar; + + // The prefix "utm_" is optional with "strictUtm" disabled + // "ref" is only collected when "strictUtm" is disabled + return new RegExp(regex, "i").test(keyValue); + }) + .join("&"); + + k = k || undefinedVar; + return q || undefinedVar; }; // Ignore pages specified in data-ignore-pages @@ -433,12 +447,13 @@ // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS // + var phantom = window.phantom; var bot = nav.webdriver || window.__nightmare || window.callPhantom || window._phantom || - window.phantom || + (phantom && !phantom.solana) || window.__polypane || window._bot || isBotAgent || @@ -512,8 +527,12 @@ var lastSendPath; var getReferrer = function () { + // Customers can overwrite their referrer, here we check for that + var overwrittenReferrer = + overwriteOptions.referrer || attr(scriptElement, "referrer"); + return ( - (doc.referrer || "") + (overwrittenReferrer || doc.referrer || "") .replace(locationHostname, definedHostname) .replace(/^https?:\/\/((m|l|w{2,3}([0-9]+)?)\.)?([^?#]+)(.*)$/, "$4") .replace(/^([^/]+)$/, "$1") || undefinedVar @@ -554,7 +573,12 @@ // sendData will assign payload to request sendData(append, undefinedVar, trueVar); } else { - nav.sendBeacon(fullApiUrl + "/append", stringify(append)); + try { + nav.sendBeacon.bind(nav)(fullApiUrl + "/append", stringify(append)); + } catch (e) { + // Fallback for browsers throwing "Illegal invocation" when the URL is invalid + sendData(append, undefinedVar, trueVar); + } } }; @@ -651,21 +675,28 @@ isPushState, deleteSourceInfo, sameSite, - metadata + search, + metadata, + callback ) { if (isPushState) sendOnLeave("" + payload.page_id, trueVar); if (collectDataOnLeave) payload.page_id = uuid(); var currentPage = definedHostname + getPath(); + var query = getQueryParams(deleteSourceInfo, search); - sendData({ - id: payload.page_id, - type: pageviewText, - referrer: !deleteSourceInfo || sameSite ? referrer : null, - query: getQueryParams(deleteSourceInfo), - - metadata: stringify(metadata), - }); + sendData( + { + id: payload.page_id, + type: pageviewText, + referrer: !deleteSourceInfo || sameSite ? referrer : null, + query: query, + k: k, + + metadata: stringify(metadata), + }, + callback + ); previousReferrer = referrer; referrer = currentPage; @@ -675,7 +706,21 @@ var sameSite, userNavigated; - var pageview = function (isPushState, pathOverwrite, metadata) { + var pageview = function ( + isPushState, + pathOverwrite, + metadata, + callbackRaw + ) { + if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata; + var callback = isFunction(callbackRaw) ? callbackRaw : function () {}; + var querySearch; + if (isString(pathOverwrite) && pathOverwrite.indexOf("?") > -1) { + // keep query from manual path + var parts = pathOverwrite.split("?"); + pathOverwrite = parts.shift(); + querySearch = "?" + parts.join("?"); + } // Obfuscate personal data in URL by dropping the search and hash var path = getPath(pathOverwrite); @@ -738,7 +783,10 @@ : falseVar; // We set unique variable based on pushstate or back navigation, if no match we check the referrer - page.unique = isPushState || userNavigated ? falseVar : !sameSite; + page.unique = + /__cf_/.test(getReferrer()) || isPushState || userNavigated + ? falseVar + : !sameSite; metadata = appendMetadata(metadata, { type: pageviewText, @@ -747,11 +795,15 @@ var triggerSendPageView = function () { fetchedHighEntropyValues = trueVar; + var delSrc = + isPushState || userNavigated || !collectMetricByString("r"); sendPageView( isPushState, - isPushState || userNavigated || !collectMetricByString("r"), // r = referrers + delSrc, // r = referrers sameSite, - metadata + querySearch, + metadata, + callback ); }; @@ -841,11 +893,11 @@ } if (autoCollect) pageview(); - else { - window.sa_pageview = function (path, metadata) { - pageview(0, path, metadata); - }; - } + + window.sa_pageview = function (path, metadata, callback) { + pageview(0, path, metadata, callback); + }; + ///////////////////// // EVENTS @@ -938,6 +990,6 @@ {"hostname":INSTALL_OPTIONS.hostname,"collectDnt":typeof INSTALL_OPTIONS.collect_dnt === 'boolean' ? INSTALL_OPTIONS.collect_dnt : null,"mode":INSTALL_OPTIONS.hash_mode ? 'hash' : 'normal',"strictUtm":INSTALL_OPTIONS.advanced_settings_toggle && INSTALL_OPTIONS.strict_utm,"allowParams":INSTALL_OPTIONS.advanced_settings_toggle && INSTALL_OPTIONS.allow_url_parameters,"nonUniqueHostnames":INSTALL_OPTIONS.advanced_settings_toggle && INSTALL_OPTIONS.non_unique_hostnames,"ignorePages":INSTALL_OPTIONS.advanced_settings_toggle && INSTALL_OPTIONS.ignore_pages,"namespace":INSTALL_OPTIONS.overwrite_namespace && INSTALL_OPTIONS.namespace}, INSTALL_OPTIONS.custom_domain || "queue.simpleanalyticscdn.com", "", - "cloudflare_11", + "cloudflare_12", "sa" ); diff --git a/dist/latest/custom/app.js b/dist/latest/custom/app.js index bd85d875..50e7c3c7 100644 --- a/dist/latest/custom/app.js +++ b/dist/latest/custom/app.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy friendly analytics (docs.simpleanalytics.com/script; 2026-08-17; 2eca; v11) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-16; 2be9; v12) */ -!function(l,t,e,n,p){try{var h=undefined,f=!0,d=!1,r="true",a="https:",m="pageview",u="event",i="error",o=l.console,c="doNotTrack",g=l.navigator,s=l.location,v=s.host,y=l.document,_=g.userAgent,w="Not sending request ",b=w+"when ",E=d,O=encodeURIComponent,x=decodeURIComponent,S=JSON.stringify,M=l.addEventListener,k="https://"+e,A=y.documentElement||{},q="language",$="Height",j="scroll",D=g.userAgentData,C=j+$,H="offset"+$,R="client"+$,P="pagehide",T="platform",U="platformVersion",I="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(_)&&!/(cubot)/i.test(_),N=l.screen,z=y.currentScript||y.querySelector('script[src*="'+e+'"]');p=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){p("Error in your "+t+" function:",e)},W=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},G=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},J=function(t,e){return t&&t.getAttribute("data-"+e)},L=function(t){return Array.isArray(t)?t:"string"==typeof t&&t.length?t.split(/, ?/):[]},Y=function(t){return t&&t.constructor===Object},Z=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},rt=function(t){return"function"==typeof t},at="namespace",it=t[at]||J(z,at)||"sa",ot=l[it+"_metadata"],ct=function(t,e){Y(ot)&&(t=Z(t,ot));var n=l[Mt];if(!rt(n))return t;try{return Z(t,n.call(l,Z(t,e)))}catch(r){F("metadata",r)}},st=t.strictUtm||J(z,"strict-utm")==r,ut=function(a){return s.search.slice(1).split("&").filter(function(t){var e=a||!tt("ut"),n=Ot.map(G).join("|"),r=e?"^("+n+")=":"^((utm_)"+(st?"":"?")+"(source|medium|content|term|campaign)"+(st?"":"|ref")+"|"+n+")=";return e&&!Ot.length?d:new RegExp(r).test(t)}).join("&")||h},lt=it+"_loaded";if(l[lt]==f)return p(w+"twice");l.sa_event_loaded=f,l[lt]=f;var pt=function(e,t,n){e=n?e:Z(qt,Dt,e),g.brave&&!n&&(e.brave=f),g._duckduckgoloader_&&!n&&(e.duck=f);var r=new Image;t&&(r.onerror=t,r.onload=t),r.src=k+"/simple.gif?"+Object.keys(e).filter(function(t){return e[t]!=h}).map(function(t){return O(t)+"="+O(e[t])}).join("&")+"&time="+Date.now()},ht=t.hostname||J(z,"hostname"),ft=ht||v,dt={version:"custom_app_11",hostname:ft};n=function(t){t=t.stack?t+" "+t.stack:t,p(t),pt(Z(dt,{type:i,error:t,path:s.pathname}),h,f)},M(i,function(t){t.filename&&-1"); +!function(d,t,e,n,m){try{var v=undefined,g=!0,y=!1,r="true",a="https:",_="pageview",u="event",i="error",o=d.console,c="doNotTrack",w=d.navigator,s=d.location,b=s.host,l=d.document,p=w.userAgent,f="Not sending request ",h=f+"when ",O=y,x=encodeURIComponent,E=decodeURIComponent,S=JSON.stringify,k=d.addEventListener,M="https://"+e,q=l.documentElement||{},A="language",$="Height",j="scroll",D=w.userAgentData,C=j+$,H="offset"+$,R="client"+$,P="pagehide",T="platform",U="platformVersion",I="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),N=d.screen,z=l.currentScript||l.querySelector('script[src*="'+e+'"]');m=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){m("Error in your "+t+" function:",e)},W=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},G=function(t){return"string"==typeof t},J=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},L=function(t,e){return t&&t.getAttribute("data-"+e)},Y=function(t){return Array.isArray(t)?t:G(t)&&t.length?t.split(/, ?/):[]},Z=function(t){return t&&t.constructor===Object},K=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},it=function(t){return"function"==typeof t},ot="namespace",ct=t[ot]||L(z,ot)||"sa",st=function(t,e){var n=d[ct+"_metadata"];Z(n)&&(t=K(t,n));var r=d[Mt];if(!it(r))return Mt&&m(Mt+" not found, set window."+Mt),t;try{return K(t,r.call(d,K(t,e)))}catch(a){F("metadata",a)}},ut=t.strictUtm||L(z,"strict-utm")==r,lt=function(i,t){tt=!i&&nt("q")?"":y;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");tt!==y&&0"); //# sourceMappingURL=app.js.map \ No newline at end of file diff --git a/dist/latest/custom/app.js.map b/dist/latest/custom/app.js.map index fd21da99..d49fd42a 100644 --- a/dist/latest/custom/app.js.map +++ b/dist/latest/custom/app.js.map @@ -1 +1 @@ -{"version":3,"file":"app.source.js","sources":["app.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var metadataObject = window[namespace + \"_metadata\"];\n var appendMetadata = function (metadata, data) {\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) return metadata;\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var getQueryParams = function (ignoreSource) {\n return (\n loc.search\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex).test(keyValue);\n })\n .join(\"&\") || undefinedVar\n );\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n window.phantom ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n return (\n (doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n nav.sendBeacon(fullApiUrl + \"/append\", stringify(append));\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n metadata\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n\n sendData({\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: getQueryParams(deleteSourceInfo),\n\n metadata: stringify(metadata),\n });\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (isPushState, pathOverwrite, metadata) {\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique = isPushState || userNavigated ? falseVar : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n sendPageView(\n isPushState,\n isPushState || userNavigated || !collectMetricByString(\"r\"), // r = referrers\n sameSite,\n metadata\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n else {\n window.sa_pageview = function (path, metadata) {\n pageview(0, path, metadata);\n };\n }\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_app_11\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","metadataObject","appendMetadata","metadata","data","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","search","keyValue","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","indexOf","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","bot","webdriver","__nightmare","callPhantom","_phantom","phantom","__polypane","_bot","collectDataOnLeave","ua","protocol","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","i","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","e","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","callbackRaw","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue","q"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"app.source.js","sources":["app.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_app_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","protocol","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue"],"mappings":"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"} \ No newline at end of file diff --git a/dist/latest/custom/auto-events.js b/dist/latest/custom/auto-events.js index c55140ea..d48601dd 100644 --- a/dist/latest/custom/auto-events.js +++ b/dist/latest/custom/auto-events.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy friendly analytics (docs.simpleanalytics.com/script; 2026-08-17; 5dd7; v11) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-16; e658; v12) */ -function r(t,e){var a,o=!1;p.downloads&&/^https?:\/\//i.test(t.href)&&new RegExp("\\.("+(p.downloadsExtensions||[]).join("|")+")$","i").test(t.pathname)?o="download":p.outbound&&/^https?:\/\//i.test(t.href)&&t.hostname!==m.location.hostname?o="outbound":p.emails&&/^mailto:/i.test(t.href)&&(o="email"),o&&(e?(a="saAutomatedLink(this, '"+o+"');",t.hasAttribute("target")&&"_self"!==t.getAttribute("target")||(a+=" return false;"),t.setAttribute("onclick",a)):t.addEventListener("click",function(){saAutomatedLink(this,o)}))}function e(){try{for(var t=document.getElementsByTagName("a"),e=0;e -1,\n emails: collectTypes.indexOf(\"emails\") > -1,\n downloads: collectTypes.indexOf(\"downloads\") > -1,\n // Downloads: enter file extensions you want to collect\n downloadsExtensions: setting(\"extensions\", \"array\", [\n \"pdf\",\n \"csv\",\n \"docx\",\n \"xlsx\",\n \"zip\",\n \"doc\",\n \"xls\",\n ]),\n\n // All: use title attribute if set for event name (for all events)\n // THIS TAKES PRECEDENCE OVER OTHER SETTINGS BELOW\n title: setting(\"useTitle\", \"bool\", true),\n // Outbound: use full URL of the links? false for just the hostname\n outboundFullUrl: fullUrls,\n // Downloads: if taking event name from URL, use full URL or just filename (default)\n downloadsFullUrl: fullUrls,\n };\n\n var saGlobal = setting(\"saGlobal\", \"string\", \"sa_event\");\n\n // For compiling the script\n var optionsLink = options;\n\n if (typeof optionsLink === \"undefined\")\n log(\"options object not found, please specify\", \"warn\");\n\n window.saAutomatedLink = function saAutomatedLink(element, type) {\n try {\n if (!element) return log(\"no element found\");\n var sent = false;\n\n var callback = function () {\n if (\n !sent &&\n (!element.hasAttribute(\"target\") ||\n element.getAttribute(\"target\") === \"_self\")\n )\n document.location = element.getAttribute(\"href\");\n sent = true;\n };\n\n if (window[saGlobal] && window[saGlobal + \"_loaded\"]) {\n var hostname = element.hostname;\n var pathname = element.pathname;\n\n var event;\n var metadata = {\n title: element.getAttribute(\"title\") || undefined,\n };\n var url = element.href || undefined;\n\n var useTitle = false;\n if (optionsLink.title && element.hasAttribute(\"title\")) {\n var theTitle = element.getAttribute(\"title\").trim();\n if (theTitle != \"\") useTitle = true;\n }\n\n if (useTitle) {\n event = theTitle;\n } else {\n switch (type) {\n case \"outbound\": {\n event = hostname + (optionsLink.outboundFullUrl ? pathname : \"\");\n metadata.url = url;\n break;\n }\n case \"download\": {\n event = optionsLink.downloadsFullUrl\n ? hostname + pathname\n : pathname.split(\"/\").pop();\n metadata.url = url;\n break;\n }\n case \"email\": {\n var href = element.getAttribute(\"href\");\n event = (href.split(\":\")[1] || \"\").split(\"?\")[0];\n metadata.email = event;\n break;\n }\n }\n }\n\n var clean =\n type +\n \"_\" +\n event.replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_+|_+$)/g, \"\");\n\n window[saGlobal](clean, metadata, callback);\n\n log(\"collected \" + clean);\n\n return type === \"email\"\n ? callback()\n : window.setTimeout(callback, 5000);\n } else {\n log(saGlobal + \" is not defined\", \"warn\");\n return callback();\n }\n } catch (error) {\n log(error.message, \"warn\");\n }\n };\n\n function collectLink(link, onclick) {\n var collect = false;\n\n // Collect download clicks\n if (\n optionsLink.downloads &&\n /^https?:\\/\\//i.test(link.href) &&\n new RegExp(\n \"\\\\.(\" + (optionsLink.downloadsExtensions || []).join(\"|\") + \")$\",\n \"i\"\n ).test(link.pathname)\n ) {\n collect = \"download\";\n\n // Collect outbound links clicks\n } else if (\n optionsLink.outbound &&\n /^https?:\\/\\//i.test(link.href) &&\n link.hostname !== window.location.hostname\n ) {\n collect = \"outbound\";\n\n // Collect email clicks\n } else if (optionsLink.emails && /^mailto:/i.test(link.href)) {\n collect = \"email\";\n }\n\n if (!collect) return;\n\n if (onclick) {\n var onClickAttribute = \"saAutomatedLink(this, '\" + collect + \"');\";\n\n if (\n !link.hasAttribute(\"target\") ||\n link.getAttribute(\"target\") === \"_self\"\n )\n onClickAttribute += \" return false;\";\n\n link.setAttribute(\"onclick\", onClickAttribute);\n } else {\n link.addEventListener(\"click\", function () {\n saAutomatedLink(this, collect);\n });\n }\n }\n\n function onDOMContentLoaded() {\n try {\n var a = document.getElementsByTagName(\"a\");\n\n // Loop over all links on the page\n for (var i = 0; i < a.length; i++) {\n var link = a[i];\n var href = link.getAttribute(\"href\");\n\n // Skip links that don't have an href\n if (!href) continue;\n\n // We don't want to overwrite website behaviour so we check for the onclick attribute\n if (!link.getAttribute(\"onclick\") && !/^mailto:/.test(href)) {\n collectLink(link, true);\n } else {\n collectLink(link, false);\n }\n }\n } catch (error) {\n log(error.message, \"warn\");\n }\n }\n\n if (doc.readyState === \"ready\" || doc.readyState === \"complete\") {\n onDOMContentLoaded();\n } else {\n document.addEventListener(\"readystatechange\", function (event) {\n if (event.target.readyState === \"complete\") onDOMContentLoaded();\n });\n }\n})(window);\n"],"names":["collectLink","link","onclick","onClickAttribute","collect","optionsLink","downloads","test","href","RegExp","downloadsExtensions","join","pathname","outbound","hostname","window","location","emails","hasAttribute","getAttribute","setAttribute","addEventListener","saAutomatedLink","this","onDOMContentLoaded","a","document","getElementsByTagName","i","length","error","log","message","doc","scriptElement","setting","collectTypes","fullUrls","options","saGlobal","type","logger","console","warn","info","currentScript","querySelector","attribute","defaultValue","value","dataset","split","map","item","trim","filter","Boolean","indexOf","title","outboundFullUrl","downloadsFullUrl","element","sent","callback","theTitle","metadata","undefined","url","useTitle","event","pop","email","clean","replace","setTimeout","readyState","target"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"auto-events.source.js","sources":["auto-events.source.js"],"sourcesContent":["(function saAutomatedEvents(window) {\n // Skip server side rendered pages\n if (typeof window === \"undefined\") return;\n\n var log = function (message, type) {\n var logger = type === \"warn\" ? console.warn : console.info;\n return logger && logger(\"Simple Analytics auto events:\", message);\n };\n\n var doc = window.document;\n\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"auto-events.js\"]');\n\n var setting = function (attribute, type, defaultValue) {\n var value = scriptElement && scriptElement.dataset[attribute];\n\n // Booleans\n if (type === \"bool\" && (value === \"true\" || value === \"false\"))\n return value === \"true\";\n else if (type === \"bool\") return defaultValue;\n\n // Arrays\n if (type === \"array\" && value)\n return value\n .split(\",\")\n .map(function (item) {\n return item.trim();\n })\n .filter(Boolean);\n else if (type === \"array\") return defaultValue;\n\n return value || defaultValue;\n };\n\n var collectTypes = setting(\"collect\", \"array\", [\n \"outbound\",\n \"emails\",\n \"downloads\",\n \"phones\",\n ]);\n var fullUrls = setting(\"fullUrls\", \"bool\", false);\n\n var options = {\n // What to collect\n outbound: collectTypes.indexOf(\"outbound\") > -1,\n emails: collectTypes.indexOf(\"emails\") > -1,\n downloads: collectTypes.indexOf(\"downloads\") > -1,\n phones: collectTypes.indexOf(\"phones\") > -1,\n // Downloads: enter file extensions you want to collect\n downloadsExtensions: setting(\"extensions\", \"array\", [\n \"pdf\",\n \"csv\",\n \"docx\",\n \"xlsx\",\n \"zip\",\n \"doc\",\n \"xls\",\n ]),\n\n // All: use title attribute if set for event name (for all events)\n // THIS TAKES PRECEDENCE OVER OTHER SETTINGS BELOW\n title: setting(\"useTitle\", \"bool\", true),\n // Outbound: use full URL of the links? false for just the hostname\n outboundFullUrl: fullUrls,\n // Downloads: if taking event name from URL, use full URL or just filename (default)\n downloadsFullUrl: fullUrls,\n };\n\n var saGlobal = setting(\"saGlobal\", \"string\", \"sa_event\");\n\n // For compiling the script\n var optionsLink = options;\n\n if (typeof optionsLink === \"undefined\")\n log(\"options object not found, please specify\", \"warn\");\n\n var saAutomatedLink = function saAutomatedLink(element, type) {\n try {\n if (!element) return log(\"no element found\");\n var sent = false;\n\n var callback = function () {\n if (\n !sent &&\n (!element.hasAttribute(\"target\") ||\n element.getAttribute(\"target\") === \"_self\")\n )\n document.location = element.getAttribute(\"href\");\n sent = true;\n };\n\n if (window[saGlobal] && window[saGlobal + \"_loaded\"]) {\n var hostname = element.hostname;\n var pathname = element.pathname;\n\n var event;\n var metadata = {\n title: element.getAttribute(\"title\") || undefined,\n };\n var url = element.href || undefined;\n\n var useTitle = false;\n if (optionsLink.title && element.hasAttribute(\"title\")) {\n var theTitle = element.getAttribute(\"title\").trim();\n if (theTitle != \"\") useTitle = true;\n }\n\n if (useTitle) {\n event = theTitle;\n } else {\n switch (type) {\n case \"outbound\": {\n event = hostname + (optionsLink.outboundFullUrl ? pathname : \"\");\n metadata.url = url;\n break;\n }\n case \"download\": {\n event = optionsLink.downloadsFullUrl\n ? hostname + pathname\n : pathname.split(\"/\").pop();\n metadata.url = url;\n break;\n }\n case \"email\": {\n var href = element.getAttribute(\"href\");\n event = (href.split(\":\")[1] || \"\").split(\"?\")[0];\n metadata.email = event;\n break;\n }\n case \"phone\": {\n var hrefPhone = element.getAttribute(\"href\");\n event = (hrefPhone.split(\":\")[1] || \"\").split(\"?\")[0];\n metadata.phone = event;\n break;\n }\n }\n }\n\n var clean =\n type +\n \"_\" +\n event.replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_+|_+$)/g, \"\");\n\n window[saGlobal](clean, metadata, callback);\n\n log(\"collected \" + clean);\n\n return type === \"email\" || type === \"phone\"\n ? callback()\n : window.setTimeout(callback, 5000);\n } else {\n log(saGlobal + \" is not defined\", \"warn\");\n return callback();\n }\n } catch (error) {\n log(error.message, \"warn\");\n }\n };\n\n window.saAutomatedLink = saAutomatedLink;\n\n function collectLink(link, onclick) {\n if (link.hasAttribute(\"data-simple-event\")) return;\n var collect = false;\n\n // Collect download clicks\n if (\n optionsLink.downloads &&\n /^https?:\\/\\//i.test(link.href) &&\n new RegExp(\n \"\\\\.(\" + (optionsLink.downloadsExtensions || []).join(\"|\") + \")$\",\n \"i\"\n ).test(link.pathname)\n ) {\n collect = \"download\";\n\n // Collect outbound links clicks\n } else if (\n optionsLink.outbound &&\n /^https?:\\/\\//i.test(link.href) &&\n link.hostname !== window.location.hostname\n ) {\n collect = \"outbound\";\n\n // Collect email clicks\n } else if (optionsLink.emails && /^mailto:/i.test(link.href)) {\n collect = \"email\";\n\n // Collect telephone clicks\n } else if (optionsLink.phones && /^tel:/i.test(link.href)) {\n collect = \"phone\";\n }\n\n if (!collect) return;\n\n if (onclick) {\n var onClickAttribute = \"saAutomatedLink(this, '\" + collect + \"');\";\n\n if (\n !link.hasAttribute(\"target\") ||\n link.getAttribute(\"target\") === \"_self\"\n )\n onClickAttribute += \" return false;\";\n\n link.setAttribute(\"onclick\", onClickAttribute);\n } else {\n link.addEventListener(\"click\", function () {\n saAutomatedLink(this, collect);\n });\n }\n }\n\n function onDOMContentLoaded() {\n try {\n var a = document.getElementsByTagName(\"a\");\n\n // Loop over all links on the page\n for (var i = 0; i < a.length; i++) {\n var link = a[i];\n var href = link.getAttribute(\"href\");\n\n // Skip links that don't have an href\n if (!href) continue;\n\n // We don't want to overwrite website behaviour so we check for the onclick attribute\n if (\n !link.getAttribute(\"onclick\") &&\n !/^mailto:/.test(href) &&\n !/^tel:/.test(href)\n ) {\n collectLink(link, true);\n } else {\n collectLink(link, false);\n }\n }\n } catch (error) {\n log(error.message, \"warn\");\n }\n }\n\n if (doc.readyState === \"ready\" || doc.readyState === \"complete\") {\n onDOMContentLoaded();\n } else {\n document.addEventListener(\"readystatechange\", function (event) {\n if (event.target.readyState === \"complete\") onDOMContentLoaded();\n });\n }\n})(window);\n"],"names":["collectLink","link","onclick","collect","onClickAttribute","hasAttribute","optionsLink","downloads","test","href","RegExp","downloadsExtensions","join","pathname","outbound","hostname","window","location","emails","phones","getAttribute","setAttribute","addEventListener","saAutomatedLink","this","onDOMContentLoaded","a","document","getElementsByTagName","i","length","error","log","message","doc","scriptElement","setting","collectTypes","fullUrls","options","saGlobal","type","logger","console","warn","info","currentScript","querySelector","attribute","defaultValue","value","dataset","split","map","item","trim","filter","Boolean","indexOf","title","outboundFullUrl","downloadsFullUrl","element","sent","callback","theTitle","metadata","undefined","url","useTitle","event","pop","email","phone","clean","replace","setTimeout","readyState","target"],"mappings":";;AAkKE,SAASA,EAAYC,EAAMC,GACzB,IACIC,EAiCEC,EAlCFH,EAAKI,aAAa,uBAClBF,GAAU,EAIZG,EAAYC,WACZ,gBAAgBC,KAAKP,EAAKQ,OAC1B,IAAIC,OACF,QAAUJ,EAAYK,qBAAuB,IAAIC,KAAK,KAAO,KAC7D,KACAJ,KAAKP,EAAKY,UAEZV,EAAU,WAIVG,EAAYQ,UACZ,gBAAgBN,KAAKP,EAAKQ,OAC1BR,EAAKc,WAAaC,EAAOC,SAASF,SAElCZ,EAAU,WAGDG,EAAYY,QAAU,YAAYV,KAAKP,EAAKQ,MACrDN,EAAU,QAGDG,EAAYa,QAAU,SAASX,KAAKP,EAAKQ,QAClDN,EAAU,SAGPA,IAEDD,GACEE,EAAmB,0BAA4BD,EAAU,MAG1DF,EAAKI,aAAa,WACa,UAAhCJ,EAAKmB,aAAa,YAElBhB,GAAoB,kBAEtBH,EAAKoB,aAAa,UAAWjB,IAE7BH,EAAKqB,iBAAiB,QAAS,WAC7BC,EAAgBC,KAAMrB,OAK5B,SAASsB,IACP,IAIE,IAHA,IAAIC,EAAIC,SAASC,qBAAqB,KAG7BC,EAAI,EAAGA,EAAIH,EAAEI,OAAQD,IAAK,CACjC,IAAI5B,EAAOyB,EAAEG,GACTpB,EAAOR,EAAKmB,aAAa,QAGxBX,IAIFR,EAAKmB,aAAa,YAClB,WAAWZ,KAAKC,IAChB,QAAQD,KAAKC,GAIdT,EAAYC,GAAM,GAFlBD,EAAYC,GAAM,KAKtB,MAAO8B,GACPC,EAAID,EAAME,QAAS,SA7OzB,IAA4BjB,EAItBgB,EAKAE,EAEAC,EAGAC,EAqBAC,EAMAC,EAEAC,EA0BAC,EAGAlC,EAKAiB,OA3EkB,KAFIP,EAwPzBA,UApPGgB,EAAM,SAAUC,EAASQ,GAC3B,IAAIC,EAAkB,SAATD,EAAkBE,QAAQC,KAAOD,QAAQE,KACtD,OAAOH,GAAUA,EAAO,gCAAiCT,IAGvDC,EAAMlB,EAAOW,SAEbQ,EACFD,EAAIY,eAAiBZ,EAAIa,cAAc,iCAuBrCV,GArBAD,EAAU,SAAUY,EAAWP,EAAMQ,GACvC,IAAIC,EAAQf,GAAiBA,EAAcgB,QAAQH,GAGnD,MAAa,SAATP,GAA8B,SAAVS,GAA8B,UAAVA,EAE1B,SAATT,EAAwBQ,EAGpB,UAATR,GAAoBS,EACfA,EACJE,MAAM,KACNC,IAAI,SAAUC,GACb,OAAOA,EAAKC,SAEbC,OAAOC,SACM,UAAThB,GAEFS,GAF2BD,EAXf,SAAVC,IAgBgB,UAAW,QAAS,CAC7C,WACA,SACA,YACA,WAEEZ,EAAWF,EAAQ,WAAY,QAAQ,GAEvCG,EAAU,CAEZzB,UAA8C,EAApCuB,EAAaqB,QAAQ,YAC/BxC,QAA0C,EAAlCmB,EAAaqB,QAAQ,UAC7BnD,WAAgD,EAArC8B,EAAaqB,QAAQ,aAChCvC,QAA0C,EAAlCkB,EAAaqB,QAAQ,UAE7B/C,oBAAqByB,EAAQ,aAAc,QAAS,CAClD,MACA,MACA,OACA,OACA,MACA,MACA,QAKFuB,MAAOvB,EAAQ,WAAY,QAAQ,GAEnCwB,gBAAiBtB,EAEjBuB,iBAAkBvB,GAGhBE,EAAWJ,EAAQ,WAAY,SAAU,iBAKlB,KAFvB9B,EAAciC,IAGhBP,EAAI,2CAA4C,QAE9CT,EAAkB,SAASA,EAAgBuC,EAASrB,GACtD,IACE,IAAKqB,EAAS,OAAO9B,EAAI,oBACzB,IAAI+B,GAAO,EAEPC,EAAW,WAEVD,GACCD,EAAQzD,aAAa,WACc,UAAnCyD,EAAQ1C,aAAa,YAEvBO,SAASV,SAAW6C,EAAQ1C,aAAa,SAC3C2C,GAAO,GAGT,GAAI/C,EAAOwB,IAAaxB,EAAOwB,EAAW,WAAY,CACpD,IAWMyB,EAXFlD,EAAW+C,EAAQ/C,SACnBF,EAAWiD,EAAQjD,SAGnBqD,EAAW,CACbP,MAAOG,EAAQ1C,aAAa,UAAY+C,WAEtCC,EAAMN,EAAQrD,MAAQ0D,UAEtBE,GAAW,EAMf,GALI/D,EAAYqD,OAASG,EAAQzD,aAAa,WAE5B,KADZ4D,EAAWH,EAAQ1C,aAAa,SAASmC,UACzBc,GAAW,IAG7BA,EACFC,EAAQL,OAER,OAAQxB,GACN,IAAK,WACH6B,EAAQvD,GAAYT,EAAYsD,gBAAkB/C,EAAW,IAC7DqD,EAASE,IAAMA,EACf,MAEF,IAAK,WACHE,EAAQhE,EAAYuD,iBAChB9C,EAAWF,EACXA,EAASuC,MAAM,KAAKmB,MACxBL,EAASE,IAAMA,EACf,MAEF,IAAK,QACH,IACAE,GADWR,EAAQ1C,aAAa,QAClBgC,MAAM,KAAK,IAAM,IAAIA,MAAM,KAAK,GAC9Cc,EAASM,MAAQF,EACjB,MAEF,IAAK,QAEHA,GADgBR,EAAQ1C,aAAa,QAClBgC,MAAM,KAAK,IAAM,IAAIA,MAAM,KAAK,GACnDc,EAASO,MAAQH,EAMvB,IAAII,EACFjC,EACA,IACA6B,EAAMK,QAAQ,eAAgB,KAAKA,QAAQ,aAAc,IAM3D,OAJA3D,EAAOwB,GAAUkC,EAAOR,EAAUF,GAElChC,EAAI,aAAe0C,GAEH,UAATjC,GAA6B,UAATA,EACvBuB,IACAhD,EAAO4D,WAAWZ,EAAU,KAGhC,OADAhC,EAAIQ,EAAW,kBAAmB,QAC3BwB,IAET,MAAOjC,GACPC,EAAID,EAAME,QAAS,UAIvBjB,EAAOO,gBAAkBA,EAiFF,UAAnBW,EAAI2C,YAA6C,aAAnB3C,EAAI2C,WACpCpD,IAEAE,SAASL,iBAAiB,mBAAoB,SAAUgD,GACtB,aAA5BA,EAAMQ,OAAOD,YAA2BpD"} \ No newline at end of file diff --git a/dist/latest/custom/e.js b/dist/latest/custom/e.js index 5d67ac66..56af8e4a 100644 --- a/dist/latest/custom/e.js +++ b/dist/latest/custom/e.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy friendly analytics (docs.simpleanalytics.com/script; 2026-08-17; 4949; v11) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-16; a33e; v12) */ -!function(l,t,e,n,p){try{var h=undefined,f=!0,d=!1,r="true",a="https:",m="pageview",u="event",i="error",o=l.console,c="doNotTrack",g=l.navigator,s=l.location,v=s.host,y=l.document,_=g.userAgent,w="Not sending request ",b=w+"when ",E=d,O=encodeURIComponent,x=decodeURIComponent,S=JSON.stringify,M=l.addEventListener,k="https://"+e,A=y.documentElement||{},q="language",$="Height",j="scroll",D=g.userAgentData,C=j+$,H="offset"+$,R="client"+$,P="pagehide",T="platform",U="platformVersion",I="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(_)&&!/(cubot)/i.test(_),N=l.screen,z=y.currentScript||y.querySelector('script[src*="'+e+'"]');p=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){p("Error in your "+t+" function:",e)},W=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},G=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},J=function(t,e){return t&&t.getAttribute("data-"+e)},L=function(t){return Array.isArray(t)?t:"string"==typeof t&&t.length?t.split(/, ?/):[]},Y=function(t){return t&&t.constructor===Object},Z=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},rt=function(t){return"function"==typeof t},at="namespace",it=t[at]||J(z,at)||"sa",ot=l[it+"_metadata"],ct=function(t,e){Y(ot)&&(t=Z(t,ot));var n=l[Mt];if(!rt(n))return t;try{return Z(t,n.call(l,Z(t,e)))}catch(r){F("metadata",r)}},st=t.strictUtm||J(z,"strict-utm")==r,ut=function(a){return s.search.slice(1).split("&").filter(function(t){var e=a||!tt("ut"),n=Ot.map(G).join("|"),r=e?"^("+n+")=":"^((utm_)"+(st?"":"?")+"(source|medium|content|term|campaign)"+(st?"":"|ref")+"|"+n+")=";return e&&!Ot.length?d:new RegExp(r).test(t)}).join("&")||h},lt=it+"_loaded";if(l[lt]==f)return p(w+"twice");l.sa_event_loaded=f,l[lt]=f;var pt=function(e,t,n){e=n?e:Z(qt,Dt,e),g.brave&&!n&&(e.brave=f),g._duckduckgoloader_&&!n&&(e.duck=f);var r=new Image;t&&(r.onerror=t,r.onload=t),r.src=k+"/simple.gif?"+Object.keys(e).filter(function(t){return e[t]!=h}).map(function(t){return O(t)+"="+O(e[t])}).join("&")+"&time="+Date.now()},ht=t.hostname||J(z,"hostname"),ft=ht||v,dt={version:"custom_events_11",hostname:ft};n=function(t){t=t.stack?t+" "+t.stack:t,p(t),pt(Z(dt,{type:i,error:t,path:s.pathname}),h,f)},M(i,function(t){t.filename&&-1"); +!function(d,t,e,n,m){try{var v=undefined,g=!0,y=!1,r="true",a="https:",_="pageview",u="event",i="error",o=d.console,c="doNotTrack",w=d.navigator,s=d.location,b=s.host,l=d.document,p=w.userAgent,f="Not sending request ",h=f+"when ",O=y,x=encodeURIComponent,E=decodeURIComponent,S=JSON.stringify,k=d.addEventListener,M="https://"+e,q=l.documentElement||{},A="language",$="Height",j="scroll",D=w.userAgentData,C=j+$,H="offset"+$,R="client"+$,P="pagehide",T="platform",U="platformVersion",I="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),N=d.screen,z=l.currentScript||l.querySelector('script[src*="'+e+'"]');m=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){m("Error in your "+t+" function:",e)},W=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},G=function(t){return"string"==typeof t},J=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},L=function(t,e){return t&&t.getAttribute("data-"+e)},Y=function(t){return Array.isArray(t)?t:G(t)&&t.length?t.split(/, ?/):[]},Z=function(t){return t&&t.constructor===Object},K=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},it=function(t){return"function"==typeof t},ot="namespace",ct=t[ot]||L(z,ot)||"sa",st=function(t,e){var n=d[ct+"_metadata"];Z(n)&&(t=K(t,n));var r=d[Mt];if(!it(r))return Mt&&m(Mt+" not found, set window."+Mt),t;try{return K(t,r.call(d,K(t,e)))}catch(a){F("metadata",a)}},ut=t.strictUtm||L(z,"strict-utm")==r,lt=function(i,t){tt=!i&&nt("q")?"":y;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");tt!==y&&0"); //# sourceMappingURL=e.js.map \ No newline at end of file diff --git a/dist/latest/custom/e.js.map b/dist/latest/custom/e.js.map index 01cf5d9b..7d67aee9 100644 --- a/dist/latest/custom/e.js.map +++ b/dist/latest/custom/e.js.map @@ -1 +1 @@ -{"version":3,"file":"e.source.js","sources":["e.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var metadataObject = window[namespace + \"_metadata\"];\n var appendMetadata = function (metadata, data) {\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) return metadata;\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var getQueryParams = function (ignoreSource) {\n return (\n loc.search\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex).test(keyValue);\n })\n .join(\"&\") || undefinedVar\n );\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n window.phantom ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n return (\n (doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n nav.sendBeacon(fullApiUrl + \"/append\", stringify(append));\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n metadata\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n\n sendData({\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: getQueryParams(deleteSourceInfo),\n\n metadata: stringify(metadata),\n });\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (isPushState, pathOverwrite, metadata) {\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique = isPushState || userNavigated ? falseVar : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n sendPageView(\n isPushState,\n isPushState || userNavigated || !collectMetricByString(\"r\"), // r = referrers\n sameSite,\n metadata\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n else {\n window.sa_pageview = function (path, metadata) {\n pageview(0, path, metadata);\n };\n }\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_events_11\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","metadataObject","appendMetadata","metadata","data","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","search","keyValue","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","indexOf","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","bot","webdriver","__nightmare","callPhantom","_phantom","phantom","__polypane","_bot","collectDataOnLeave","ua","protocol","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","i","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","e","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","callbackRaw","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue","q"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"e.source.js","sources":["e.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_events_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","protocol","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue"],"mappings":";;CAEA,SACEA,EACAC,EACAC,EAIAC,EACAC,GAEA,IAQE,IAAIC,EAAeC,UACfC,GAAU,EACVC,GAAW,EACXC,EAAW,OACXC,EAAQ,SACRC,EAAe,WACfC,EAAY,QACZC,EAAY,QAGZC,EAAMd,EAAOe,QACbC,EAAa,aACbC,EAAMjB,EAAOkB,UACbC,EAAMnB,EAAOoB,SACbC,EAAmBF,EAAIG,KACvBC,EAAMvB,EAAOwB,SACbC,EAAYR,EAAIQ,UAChBC,EAAa,uBACbC,EAAiBD,EAAa,QAC9BE,EAA2BpB,EAC3BqB,EAAyBC,mBACzBC,EAAyBC,mBACzBC,EAAYC,KAAKD,UAEjBE,EAAuBnC,EAAOoC,iBAC9BC,EAhBW3B,WAgB4BR,EACvCoC,EAAkBf,EAAIe,iBAAmB,GACzCC,EAAW,WACXC,EAAS,SAETC,EAAS,SACTC,EAASzB,EAAI0B,cACbC,EAAeH,EAASD,EACxBK,EAAe,SAAWL,EAC1BM,EAAe,SAAWN,EAE1BO,EAAW,WACXC,EAAe,WACfC,EAAsB,kBACtBC,EAAU,mCACVC,EAAQ,EACRC,EACF,sBAAsBC,KAAK5B,KAAe,WAAW4B,KAAK5B,GACxD6B,EAAStD,EAAOsD,OAIhBC,EACFhC,EAAIiC,eAAiBjC,EAAIkC,cAAc,gBAAkBvD,EAAU,MAOrEE,EAAO,WAEL,IAAIsD,EAAO,GAAGC,MAAMC,KAAKC,WAOzB,OAJAH,EAAKI,QAAQ,qBAINC,SAASC,UAAUC,MAAML,KAAK9C,EAAIV,KAAMU,EAAK4C,IAGtD,IAAIQ,EAAiB,SAAUC,EAAMC,GACnChE,EAAK,iBAAmB+D,EAAO,aAAcC,IAG3CC,EAAU,SAAUC,EAAKC,GAC3B,OAAOC,OAAOR,UAAUS,eAAeb,KAAKU,EAAKC,IAG/CG,EAAW,SAAUC,GACvB,MAAwB,iBAAVA,GAGZC,EAAc,SAAUC,GAC1B,OAAOA,EAAKC,QAAQ,sBAAuB,SAGzCC,EAAO,SAAUxB,EAAeyB,GAClC,OAAOzB,GAAiBA,EAAc0B,aAAa,QAAUD,IAG3DE,EAA+B,SAAUC,GAC3C,OAAOC,MAAMC,QAAQF,GACjBA,EACAT,EAASS,IAAQA,EAAIG,OACnBH,EAAII,MAAM,OACV,IAGJC,EAAW,SAAUC,GACvB,OAAOA,GAAUA,EAAOC,cAAgBlB,QAGtCmB,EAAS,WAGX,IAFA,IAAIC,EAAK,GACLC,EAAMhC,UACDiC,EAAQ,EAAGA,EAAQD,EAAIP,OAAQQ,IAAS,CAC/C,IAAIC,EAAaF,EAAIC,GACrB,GAAIN,EAASO,GACX,IAAK,IAAIC,KAAWD,EACd1B,EAAQ0B,EAAYC,KACtBJ,EAAGI,GAAWD,EAAWC,IAKjC,OAAOJ,GAGLK,EAAWjG,EAAOkG,YAClBC,EAAcF,GAAYzB,OAAO4B,KAAKnG,GAAkBqF,OAG5DrF,EAAmB0F,EAAO1F,EAAkBgG,GAExCE,GAAa/F,EAAK,WAAYH,GAGlC,IA+EIoG,GA/EAC,GAAgBpB,EAClBjF,EAAiBqG,eAAiBvB,EAAKxB,EAAe,mBAGpDgD,GAAwB,SAAUC,GAEpC,OAGgB,IAFdF,GAAcG,OAAO,SAAU5B,GAC7B,OAAO,IAAI6B,OAAO,IAAMF,GAAoBnD,KAAKwB,KAChDS,QAIHqB,GAAMC,KAAKD,IAEXE,GAAO,WACT,IAAIC,EAAe9G,EAAO+G,QAAU/G,EAAOgH,SACvCC,EAAY,CAAC,MAAQ,KAAO,KAAO,KAAO,KAC1CC,EAAY,SAEhB,IACE,OAAOD,EAAUnC,QAAQoC,EAAW,SAAUC,GAC5C,OACEA,EACCL,EAAaM,gBAAgB,IAAIC,WAAW,IAAI,GAC9C,IAAOF,EAAI,GACdG,SAAS,MAEb,MAAOlD,GACP,OAAO6C,EAAUnC,QAAQoC,EAAW,SAAUC,GAC5C,IAAII,EAAqB,GAAhBC,KAAKC,SAAiB,EAE/B,OADMN,EAAI,EAAII,EAAS,EAAJA,EAAW,GACrBD,SAAS,QAKpBI,GAAa,SAAUC,GACzB,MAAsB,mBAARA,GAIZC,GAAgB,YAChBC,GACF5H,EAAiB2H,KACjB7C,EAAKxB,EAAeqE,KAiyBxB,KA9xBME,GAAiB,SAAUC,EAAUC,GACvC,IAAIC,EAAiBjI,EAAO6H,GAAY,aACpCrC,EAASyC,KAAiBF,EAAWpC,EAAOoC,EAAUE,IAC1D,IAAIC,EAA4BlI,EAAOmI,IACvC,IAAKT,GAAWQ,GAKd,OAJIC,IACF/H,EACE+H,GAAoB,0BAA4BA,IAE7CJ,EAET,IACE,OAAOpC,EACLoC,EACAG,EAA0BtE,KAAK5D,EAAQ2F,EAAOoC,EAAUC,KAE1D,MAAO5D,GACPF,EAAe,WAAYE,KAU3BgE,GACFnI,EAAiBmI,WACjBrD,EAAKxB,EAAe,eAAiB9C,EAInC4H,GAAiB,SAAUC,EAAcC,GAC3ClC,IAAKiC,GAAgB/B,GAAsB,KAAO,GAAK/F,EACvD,IAAIgI,GAAKD,GAAmBpH,EAAIsH,QAC7B9E,MAAM,GACN4B,MAAM,KACNkB,OAAO,SAAUiC,GAChB,IAAIC,EAAID,EAASE,QAAQ,KACrBvC,KAAM7F,GAAgB,EAAJmI,GAASD,EAAS/E,MAAMgF,EAAI,KAChDtC,KAAMA,GAAI,IAAM,IAAMqC,EAAS/E,MAAM,EAAGgF,IAE1C,IAAIE,EAASP,IAAiB/B,GAAsB,MAEhDuC,EAAkBC,GAAYC,IAAIpE,GAAaqE,KAAK,KACpDC,EAAQL,EACR,KAAOC,EAAkB,KACzB,YACCV,GAAY,GAAK,KAClB,yCACCA,GAAY,GAAK,QAClB,IACAU,EACA,KACJ,OAAID,IAAWE,GAAYzD,OAAe9E,EAInC,IAAIkG,OAAOwC,EAAO,KAAK7F,KAAKqF,KAEpCO,KAAK,KAGR,OADA5C,GAAIA,IAAKhG,EACFmI,GAAKnI,GA+BV8I,GAAiBtB,GAAY,UACjC,GAAI7H,EAAOmJ,KAAmB5I,EAAS,OAAOH,EAAKsB,EAAa,SAChE1B,EAAOoJ,gBAAkB7I,EACzBP,EAAOmJ,IAAkB5I,EAOzB,IAAI8I,GAAW,SAAUrB,EAAMsB,EAAUC,GACvCvB,EAAOuB,EAAevB,EAAOrC,EAAO6D,GAASC,GAAMzB,GAE/C/G,EAAIyI,QAAUH,IAAcvB,EAAK0B,MAAQnJ,GACzCU,EAAI0I,qBAAuBJ,IAAcvB,EAAK4B,KAAOrJ,GAGzD,IAAIsJ,EAAQ,IAAIC,MACZR,IACFO,EAAME,QAAUT,EAChBO,EAAMG,OAASV,GAEjBO,EAAMI,IACJ5H,EACA,eACAmC,OAAO4B,KAAK4B,GACTvB,OAAO,SAAUyD,GAChB,OAAOlC,EAAKkC,IAAQ7J,IAErB2I,IAAI,SAAUkB,GACb,OACErI,EAAuBqI,GACvB,IACArI,EAAuBmG,EAAKkC,MAG/BjB,KAAK,KACR,SACArC,KAAKD,OAILwD,GACFlK,EAAiBmK,UAAYrF,EAAKxB,EAAe,YAC/C8G,GAAkBF,IAAuB9I,EAEzCiJ,GAAc,CAChBC,QA+oBJ,mBA9oBIH,SAAUC,IASZlK,EAAY,SAAUqK,GACpBA,EAAiBA,EAAeC,MAC5BD,EAAiB,IAAMA,EAAeC,MACtCD,EACJpK,EAAKoK,GACLnB,GACE1D,EAAO2E,GAAa,CAClBI,KAAM7J,EACNuD,MAAOoG,EACPG,KAAMxJ,EAAIyJ,WAEZvK,EACAE,IAMJ4B,EACEtB,EACA,SAAUgK,GACJA,EAAMC,WAA+C,EAAnCD,EAAMC,SAASlC,QAAQ1I,IAC3CC,EAAU0K,EAAME,UAGpBvK,GAOF,IAwDIwK,GAxDAC,GAAQtE,KAERuE,GAAW,EAOXC,GAAOlL,EAAiBkL,MAAQpG,EAAKxB,EAAe,QAGpD6H,MA/KsBC,GA+KCpL,EAAiBmL,cA9KvBC,GA+KjBpL,EAAiBmL,WACjBrG,EAAKxB,EAAe,eAAiB9C,GACrCsE,EAAKxB,EAAe,aAAe9C,GACnCsE,EAAKxB,EAAe,gBAAkB9C,EAGtC6K,KACqC,SAAvCvG,EAAKxB,EAAe,iBACpBtD,EAAiBqL,cAAgB9K,GAI/B+K,GACFtL,EAAiBuL,UACjBzG,EAAKxB,EAAe,cACpBsE,GAAY,IAAMjH,EAGhB6K,GAAcvG,EAChBjF,EAAiBwL,aAAe1G,EAAKxB,EAAe,iBAIlDwF,GAAc7D,EAChBjF,EAAiB8I,aAAehE,EAAKxB,EAAe,iBAIlDmI,GAAqBxG,EACvBjF,EAAiByL,oBACf3G,EAAKxB,EAAe,yBAIpBoI,GACF1L,EAAiB0L,gBAAkB5G,EAAKxB,EAAe,mBAGrD4E,GACFlI,EAAiBkI,mBACjBpD,EAAKxB,EAAe,sBAItB,IAEEyH,GAAWzE,GAAsB,KAC7BqF,KAAKC,iBAAiBC,kBAAkBC,SACxC1L,EACJ,MAAO+D,IACPhE,EAAKgE,IAOP,IAAI4H,GAAUhM,EAAOgM,QACjBC,GACFhL,EAAIiL,WACJlM,EAAOmM,aACPnM,EAAOoM,aACPpM,EAAOqM,UACNL,KAAYA,GAAQM,QACrBtM,EAAOuM,YACPvM,EAAOwM,MACPpJ,GACAoE,KAAKC,UAAYD,KAAKC,SAGpBgF,GACFlG,GAAsB,MAAQA,GAAsB,QAElD0F,KAAK3B,GAAY2B,IAAM1L,GAE3B,IAAIiJ,GAAU7D,EAAO2E,GAAa,CAEhCoC,GAAInG,GAAsB,MAAQ9E,EAAYpB,EAE9CK,MAAOS,EAAIwL,UAAYjM,EACvBsK,SAAUA,GACV4B,QAASH,GAAqB5F,KAASxG,EAGvCwM,WAAYtG,GAAsB,MAAQM,KAASxG,IA0BrD,GAvBAmJ,GAAQsD,IAAMtM,EAIVkC,IACF8G,GAAQuD,OAASrK,EAAOqK,OACxBvD,GAAQwD,OAAS/K,EAAUS,EAAOsK,SAS/BzL,EAAI0L,SAAS7M,EAAK,4CAInBiK,KAAoBhJ,IACtBmI,GAAQ0D,kBAAoB7L,IAGzB+J,IAAcpK,KAAcC,GAA0B,KAAnBA,EAAID,GAC1C,OAAOZ,EACLuB,EAAiBX,EAAa,oBAAsBkC,EAAU,SAK7B,GAAlC7B,EAAiBuH,QAAQ,OACxB,aAAavF,KAAKhC,IACnB8I,IAED/J,EACE,mBACEiB,EACA,SACA6B,EACA,0BAON,IACIiK,GA0DAC,GA3DA3D,GAAO,GAGP4D,GAAc,WAKhB,OAFEpN,EAAiBqN,UAAYvI,EAAKxB,EAAe,aAGzBhC,EAAI+L,UAAY,IACrCxI,QAAQzD,EAAkBgJ,IAC1BvF,QAAQ,sDAAuD,MAC/DA,QAAQ,YAAa,OAASzE,GAKjCiN,GAAWD,KAOXE,GAAW,EAEXC,GAAc,SAAUC,EAAIC,GAC9B,GAAKjB,GAAL,CAEA,IAAIkB,EAAShI,EAAO2E,GAAa,CAC/BI,KAAM,SACNkD,YAAaF,EAAOD,EAAKjE,GAAQoD,UAenC,GAXIrG,GAAsB,OACxBoH,EAAOE,SAAWrG,KAAKsG,OAAOnH,KAAQsE,GAAQsC,IAngBnC,MAqgBbA,GAAW,EACXtC,GAAQtE,KAGJJ,GAAsB,UACxBoH,EAAOzC,SAAW1D,KAAKuG,IAAI,EAAG7C,GAAU8C,OAGtCN,IAASzM,EAAIgN,WAEf5E,GAASsE,EAAQtN,EAAcE,QAE/B,IACEU,EAAIgN,WAAWC,KAAKjN,EAApBA,CAAyBoB,EAAa,UAAWJ,EAAU0L,IAC3D,MAAOQ,GAEP9E,GAASsE,EAAQtN,EAAcE,MAMrC4B,EACE,mBACA,WACMZ,EAAI6M,QACA,KAAOrL,KAAY/C,GAASwN,KAClCJ,GAAczG,MACT4G,IAAY5G,KAAQyG,IAE7B5M,GAGF2B,EAAqBY,EAAUyK,GAAahN,GAE5C,IAAI6N,GAAO9M,EAAI8M,MAAQ,GACnBL,GAAW,WACb,IACE,IAAIM,EAAuBhM,EAAgBQ,IAAiB,EACxDyL,EAAS/G,KAAKuG,IAChBM,GAAKzL,IAAiB,EACtByL,GAAKxL,IAAiB,EACtBP,EAAgBQ,IAAiB,EACjCR,EAAgBM,IAAiB,EACjCN,EAAgBO,IAAiB,GAEnC,OAAO2E,KAAKgH,IACV,IAKI,EAJJhH,KAAKsG,MACF,MAAQxL,EAAgBmM,WAAa,GAAKH,GACzCC,EACA,IAGN,MAAOnK,IAEP,OADAhE,EAAKgE,IACE,IAIXjC,EAAqB,OAAQ,WAC3B+I,GAAW8C,KACX7L,EACEM,EACA,WACMyI,GAAW8C,OAAY9C,GAAW8C,OAExCxN,KAQJ,IAgCIkO,GAoCAC,GAAUC,GApEVC,GAAU,SAAUC,GACtB,IAAInE,EAAO,GAIX,IACEA,EAAOmE,GAAa/M,EAAuBZ,EAAIyJ,UAC/C,MAAOxG,IACPhE,EAAKgE,IAGP,IAAI2K,EAAyB/O,EAAO2L,IACpC,GAAIjE,GAAWqH,GACb,IACEpE,EAAOoE,EAAuBnL,KAAK5D,EAAQ,CAAE2K,KAAMA,KAAWA,EAC9D,MAAOvG,IACPF,EAAe,OAAQE,IAK3B,IA5YiB,SAAUuG,GAC3B,IAAK,IAAIhC,KAAK8C,GAAa,CACzB,IAAIuD,EAAgBvD,GAAY9C,GAChC,GAAKqG,EAAL,CAGA,IAAIC,EA9OI,KA+OND,EAAc,GAAcA,EA/OtB,IA+O8CA,EAEtD,GACEC,IAAetE,GACf,IAAIjE,OACF,IAAM9B,EAAYqK,GAAYnK,QAAQ,SAAU,QAAU,IAC1D,KACAzB,KAAKsH,GAEP,OAAOpK,GAEX,OAAOC,EA0XH0O,CAAavE,GAQjB,MAFY,QAARQ,IAAkBhK,EAAIgO,OAAMxE,GAAQxJ,EAAIgO,KAAK5J,MAAM,KAAK,IAErDoF,EAPLvK,EAAKuB,EAAiB,YAAcgJ,IAgDpCyE,GAAW,SACbC,EACAC,EACAvH,EACAwH,IAEKA,GAAe7H,GAAWK,KAAWwH,EAAcxH,GACxD,IACIyH,EAGEC,EAJFnG,EAAW5B,GAAW6H,GAAeA,EAAc,aAEnD7K,EAAS4K,KAAgD,EAA9BA,EAAc1G,QAAQ,OAGnD0G,GADIG,EAAQH,EAAc/J,MAAM,MACVmK,QACtBF,EAAc,IAAMC,EAAMxG,KAAK,MAGjC,IAAI0B,EAAOkE,GAAQS,GAGnB,GAAK3E,GAAQwC,IAAgBxC,EAA7B,CAEAwC,GAAexC,EACflB,GAAKkB,KAAOA,EAGRpE,GAAsB,OACxBkD,GAAKkG,eACHnI,KAAKuG,IAAIzL,EAA2B,aAAK,EAAGtC,EAAO4P,YAAc,IACjE,KACFnG,GAAKoG,gBACHrI,KAAKuG,IACHzL,EAAgBQ,IAAiB,EACjC9C,EAAO8P,aAAe,IACnB,MAILvJ,GAAsB,MACpBtF,EAAIsB,KAAWkH,GAAKlH,GAAYtB,EAAIsB,IAItCe,GAAUiD,GAAsB,QAClCkD,GAAKsG,aAAezM,EAAO0M,MAC3BvG,GAAKwG,cAAgB3M,EAAOiL,QAI9B,IAII2B,EAJAC,EAAOnQ,EAAOoQ,YACdC,EAAiB,aAIrB,IACEH,EAAsBC,EAAKG,iBAAiBD,GAAgB,GAAG3F,KAC/D,MAAOtG,IACPhE,EAAKgE,IAGPwK,GAAgBsB,GAC+C,EAA3D,CAAC,SAAU,gBAAgBtH,QAAQsH,GAGnCC,GACAA,EAAKE,KACwC,EAA7C,CAAC,EAAG,GAAGzH,QAAQuH,EAAKE,GAAgB3F,MAGxC,IAAI6F,EAA0BjD,GAC1BA,GAAS/H,MA1uBH,KA0uBgB,GACtBlF,EACJsO,GAAWrB,IACgD,EAAvD5B,GAAmB9C,QAAQ2H,IAC3BA,GAA2BlP,EAC3Bb,EAGJiJ,GAAK+G,OACH,QAAQnN,KAAKgK,OAAkBgC,GAAeT,GAC1CpO,GACCmO,GAEP5G,EAAWD,GAAeC,EAAU,CAClC2C,KAAM/J,EACNgK,KAAMlB,GAAKkB,OAGb,IAAI8F,EAAsB,WACxB7O,EAA2BrB,EAC3B,IAAImQ,EACFrB,GAAeT,KAAkBrI,GAAsB,MA7H1C,SACjB8I,EACAsB,EACAhC,EACAlG,EACAV,EACAuB,GAEI+F,GAAa7B,GAAY,GAAKhE,GAAQoD,QAASrM,GAC/CkM,KAAoBjD,GAAQoD,QAAU/F,MAE1C,IAAI+J,EAAcvG,GAAkBwE,KAChCgC,EAAQxI,GAAesI,EAAkBlI,GAE7CY,GACE,CACEoE,GAAIjE,GAAQoD,QACZlC,KAAM/J,EACN2M,UAAWqD,GAAoBhC,EAAWrB,GAAW,KACrDuD,MAAOA,EACPxK,EAAGA,GAEH0B,SAAU9F,EAAU8F,IAEtBuB,GAGFoF,GAAmBpB,GACnBA,GAAWsD,EAEXzN,IAgGE2N,CACEzB,EACAqB,EACA/B,GACAa,EACAzH,EACAuB,IAIJ,GAAK1H,EAmBH6O,SAjBA,IACM/N,GAAUgF,GAAWhF,EAAOqO,sBAC9BrO,EACGqO,qBAAqB,CAAC/N,EAAcC,IACpC+N,KAAK,SAAUC,GACdzH,GAAQ0H,QAAUD,EAAkBjO,GACpCwG,GAAQ2H,WAAaF,EAAkBhO,GACvCwN,MAEDW,SAAMX,GAETA,IAEF,MAAOtC,GACPsC,OAWFY,GAAMrR,EAAOsR,QACbC,GAAeF,GAAMA,GAAIG,UAAYnR,EACrCoR,GAAMzR,EAAO0R,cACbC,GAAgB,YAIhBrG,IAAeiG,IAAgBK,OAASH,KAqB1CJ,GAAIG,WAnBEK,GAAOR,GADiB3G,GAoBAiH,IAlBrB,WACL,IAEI9G,EAFAhF,EAAMhC,UACNiO,EAAKD,GAAK5N,MAAM8N,KAAMlM,GAY1B,OAVI6B,GAAWkK,OACb/G,EAAQ,IAAI+G,MAAMlH,KAIlBG,EAAQtJ,EAAIyQ,YAAY,UAClBC,UAAUvH,GAAMnK,EAASA,GAEjCsK,EAAMhH,UAAYgC,EAClB4L,GAAI5G,GACGiH,IAMX3P,EACEwP,GACA,WACEvC,GAAS,IAEX5O,GAGF2B,EACE,WACA,WACEiN,GAAS,IAEX5O,IAKA8K,IAAuB,QAARH,IAAkB,iBAAkBnL,GACrDmC,EACE,aACA,WACEiN,GAAS,IAEX5O,GAIA8K,IAAa8D,KAEjBpP,EAAOkS,YAAc,SAAUvH,EAAM5C,EAAUuB,GAC7C8F,GAAS,EAAGzE,EAAM5C,EAAUuB,IAQ9B,IAAI6I,GAAa,CAAC,SAAU,UAExBC,GAAY,SAAUvH,EAAO9C,EAAUwH,IACpCA,GAAe7H,GAAWK,KAAWwH,EAAcxH,GAExD,IAAIsK,EAAkB3K,GAAWmD,GAC7BvB,EAAW5B,GAAW6H,GAAeA,EAAc,aACnD+C,SAAmBzH,EAEvB,GAAIsH,GAAWvJ,QAAQ0J,GAAa,IAAMD,EAExC,OADAnO,EAAeqH,GAAmB3K,EAAY,aAAe0R,GACtDhJ,IAGT,IACE,GAAI+I,EAAiB,CACnB,IAAIE,EAAc1H,IAClB,GAAIsH,GAAWvJ,eAAe2J,GAAe,EAK3C,OAJArO,EACEqH,GACAV,EAAQ,uBAAyB0H,GAE5BjJ,IAETuB,EAAQ0H,GAEV,MAAOnO,IAEP,OADAF,EAAeqH,GAAmBnH,IAC3BkF,IAGTuB,GAAS,GAAKA,GAAO/F,QAAQ,eAAgB,KAAKA,QAAQ,WAAY,IAEtE,IAAI0N,EAAc,CAAE9H,KAAM9J,EAAWiK,MAAOA,GACxC4H,GAAa7D,IAAiBzL,EAAQ,EAE1C4E,EAAWD,GAAeC,EAAUyK,GAEhC3H,GACFxB,GACE1D,EAAO6M,EAAa,CAClB/E,GAAI5G,KACJgK,MAAOxI,IAAgBoK,GACvBnF,UACGmF,GAAa9D,KAAapI,GAAsB,KAC7CmI,GACA,KAEN3G,SAAU9F,EAAU8F,KAEtBuB,IAKFoJ,GAAmB,SAAU7H,EAAO9C,EAAUuB,GAChD8I,GAAUvH,EAAO9C,EAAUuB,IAIxBtJ,EAAOuL,MACVvL,EAAOuL,IAAqBmH,IAE9B,IAAIC,GAAY3S,EAAOuL,IAGnBqH,GAAQD,IAAaA,GAAUnK,EAAImK,GAAUnK,EAAI,GAMrD,IAAK,IAAIqC,MAHT7K,EAAOuL,IAAqBmH,GAGVE,GACZvO,EAAQuO,GAAO/H,MACjBzF,MAAMC,QAAQuN,GAAM/H,KAChBuH,GAAUnO,MAAM,KAAM2O,GAAM/H,KAC5BuH,GAAUQ,GAAM/H,MAGxB,MAAOsD,IACPhO,EAAUgO,IA7IY,IAAUzD,GACxBmH,GArnBkBxG,GAnN9B,CAu9BErL,OACA,uBACA"} \ No newline at end of file diff --git a/dist/latest/custom/latest.dev.js b/dist/latest/custom/latest.dev.js index 883ddcd6..8dc894a5 100644 --- a/dist/latest/custom/latest.dev.js +++ b/dist/latest/custom/latest.dev.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy friendly analytics (docs.simpleanalytics.com/script; 2026-08-17; 1bd9; v11) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-16; 3665; v12) */ /* eslint-env browser */ (function ( @@ -191,11 +191,17 @@ attr(scriptElement, namespaceText) || defaultNamespace; - var metadataObject = window[namespace + "_metadata"]; var appendMetadata = function (metadata, data) { + var metadataObject = window[namespace + "_metadata"]; if (isObject(metadataObject)) metadata = assign(metadata, metadataObject); var metadataCollectorFunction = window[metadataCollector]; - if (!isFunction(metadataCollectorFunction)) return metadata; + if (!isFunction(metadataCollectorFunction)) { + if (metadataCollector) + warn( + metadataCollector + " not found, set window." + metadataCollector + ); + return metadata; + } try { return assign( metadata, @@ -216,32 +222,40 @@ overwriteOptions.strictUtm || attr(scriptElement, "strict-utm") == trueText; - var getQueryParams = function (ignoreSource) { - return ( - loc.search - .slice(1) - .split("&") - .filter(function (keyValue) { - var ignore = ignoreSource || !collectMetricByString("ut"); - - var paramsRegexList = allowParams.map(filterRegex).join("|"); - var regex = ignore - ? "^(" + paramsRegexList + ")=" - : "^((utm_)" + - (strictUtm ? "" : "?") + - "(source|medium|content|term|campaign)" + - (strictUtm ? "" : "|ref") + - "|" + - paramsRegexList + - ")="; - if (ignore && !allowParams.length) return falseVar; - - // The prefix "utm_" is optional with "strictUtm" disabled - // "ref" is only collected when "strictUtm" is disabled - return new RegExp(regex).test(keyValue); - }) - .join("&") || undefinedVar - ); + var k; + + var getQueryParams = function (ignoreSource, overwriteSearch) { + k = !ignoreSource && collectMetricByString("q") ? "" : falseVar; + var q = (overwriteSearch || loc.search) + .slice(1) + .split("&") + .filter(function (keyValue) { + var i = keyValue.indexOf("="); + if (k !== falseVar && i > 0 && keyValue.slice(i + 1)) + k += (k ? "," : "") + keyValue.slice(0, i); + + var ignore = ignoreSource || !collectMetricByString("ut"); + + var paramsRegexList = allowParams.map(filterRegex).join("|"); + var regex = ignore + ? "^(" + paramsRegexList + ")=" + : "^((utm_)" + + (strictUtm ? "" : "?") + + "(source|medium|content|term|campaign)" + + (strictUtm ? "" : "|ref") + + "|" + + paramsRegexList + + ")="; + if (ignore && !allowParams.length) return falseVar; + + // The prefix "utm_" is optional with "strictUtm" disabled + // "ref" is only collected when "strictUtm" is disabled + return new RegExp(regex, "i").test(keyValue); + }) + .join("&"); + + k = k || undefinedVar; + return q || undefinedVar; }; // Ignore pages specified in data-ignore-pages @@ -432,12 +446,13 @@ // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS // + var phantom = window.phantom; var bot = nav.webdriver || window.__nightmare || window.callPhantom || window._phantom || - window.phantom || + (phantom && !phantom.solana) || window.__polypane || window._bot || isBotAgent || @@ -512,8 +527,12 @@ var lastSendPath; var getReferrer = function () { + // Customers can overwrite their referrer, here we check for that + var overwrittenReferrer = + overwriteOptions.referrer || attr(scriptElement, "referrer"); + return ( - (doc.referrer || "") + (overwrittenReferrer || doc.referrer || "") .replace(locationHostname, definedHostname) .replace(/^https?:\/\/((m|l|w{2,3}([0-9]+)?)\.)?([^?#]+)(.*)$/, "$4") .replace(/^([^/]+)$/, "$1") || undefinedVar @@ -554,7 +573,12 @@ // sendData will assign payload to request sendData(append, undefinedVar, trueVar); } else { - nav.sendBeacon(fullApiUrl + "/append", stringify(append)); + try { + nav.sendBeacon.bind(nav)(fullApiUrl + "/append", stringify(append)); + } catch (e) { + // Fallback for browsers throwing "Illegal invocation" when the URL is invalid + sendData(append, undefinedVar, trueVar); + } } }; @@ -651,21 +675,28 @@ isPushState, deleteSourceInfo, sameSite, - metadata + search, + metadata, + callback ) { if (isPushState) sendOnLeave("" + payload.page_id, trueVar); if (collectDataOnLeave) payload.page_id = uuid(); var currentPage = definedHostname + getPath(); + var query = getQueryParams(deleteSourceInfo, search); - sendData({ - id: payload.page_id, - type: pageviewText, - referrer: !deleteSourceInfo || sameSite ? referrer : null, - query: getQueryParams(deleteSourceInfo), - - metadata: stringify(metadata), - }); + sendData( + { + id: payload.page_id, + type: pageviewText, + referrer: !deleteSourceInfo || sameSite ? referrer : null, + query: query, + k: k, + + metadata: stringify(metadata), + }, + callback + ); previousReferrer = referrer; referrer = currentPage; @@ -675,7 +706,21 @@ var sameSite, userNavigated; - var pageview = function (isPushState, pathOverwrite, metadata) { + var pageview = function ( + isPushState, + pathOverwrite, + metadata, + callbackRaw + ) { + if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata; + var callback = isFunction(callbackRaw) ? callbackRaw : function () {}; + var querySearch; + if (isString(pathOverwrite) && pathOverwrite.indexOf("?") > -1) { + // keep query from manual path + var parts = pathOverwrite.split("?"); + pathOverwrite = parts.shift(); + querySearch = "?" + parts.join("?"); + } // Obfuscate personal data in URL by dropping the search and hash var path = getPath(pathOverwrite); @@ -738,7 +783,10 @@ : falseVar; // We set unique variable based on pushstate or back navigation, if no match we check the referrer - page.unique = isPushState || userNavigated ? falseVar : !sameSite; + page.unique = + /__cf_/.test(getReferrer()) || isPushState || userNavigated + ? falseVar + : !sameSite; metadata = appendMetadata(metadata, { type: pageviewText, @@ -747,11 +795,15 @@ var triggerSendPageView = function () { fetchedHighEntropyValues = trueVar; + var delSrc = + isPushState || userNavigated || !collectMetricByString("r"); sendPageView( isPushState, - isPushState || userNavigated || !collectMetricByString("r"), // r = referrers + delSrc, // r = referrers sameSite, - metadata + querySearch, + metadata, + callback ); }; @@ -841,11 +893,11 @@ } if (autoCollect) pageview(); - else { - window.sa_pageview = function (path, metadata) { - pageview(0, path, metadata); - }; - } + + window.sa_pageview = function (path, metadata, callback) { + pageview(0, path, metadata, callback); + }; + ///////////////////// // EVENTS @@ -938,6 +990,6 @@ {}, "", "", - "custom_latest_dev_11", + "custom_latest_dev_12", "sa" ); diff --git a/dist/latest/custom/latest.js b/dist/latest/custom/latest.js index ad661a78..f331c1bf 100644 --- a/dist/latest/custom/latest.js +++ b/dist/latest/custom/latest.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy friendly analytics (docs.simpleanalytics.com/script; 2026-08-17; 4015; v11) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-16; 2fea; v12) */ -!function(l,t,e,n,p){try{var h=undefined,f=!0,d=!1,r="true",a="https:",m="pageview",u="event",i="error",o=l.console,c="doNotTrack",g=l.navigator,s=l.location,v=s.host,y=l.document,_=g.userAgent,w="Not sending request ",b=w+"when ",E=d,O=encodeURIComponent,x=decodeURIComponent,S=JSON.stringify,M=l.addEventListener,k="https://"+e,A=y.documentElement||{},q="language",$="Height",j="scroll",D=g.userAgentData,C=j+$,H="offset"+$,R="client"+$,P="pagehide",T="platform",U="platformVersion",I="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(_)&&!/(cubot)/i.test(_),N=l.screen,z=y.currentScript||y.querySelector('script[src*="'+e+'"]');p=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){p("Error in your "+t+" function:",e)},W=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},G=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},J=function(t,e){return t&&t.getAttribute("data-"+e)},L=function(t){return Array.isArray(t)?t:"string"==typeof t&&t.length?t.split(/, ?/):[]},Y=function(t){return t&&t.constructor===Object},Z=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},rt=function(t){return"function"==typeof t},at="namespace",it=t[at]||J(z,at)||"sa",ot=l[it+"_metadata"],ct=function(t,e){Y(ot)&&(t=Z(t,ot));var n=l[Mt];if(!rt(n))return t;try{return Z(t,n.call(l,Z(t,e)))}catch(r){F("metadata",r)}},st=t.strictUtm||J(z,"strict-utm")==r,ut=function(a){return s.search.slice(1).split("&").filter(function(t){var e=a||!tt("ut"),n=Ot.map(G).join("|"),r=e?"^("+n+")=":"^((utm_)"+(st?"":"?")+"(source|medium|content|term|campaign)"+(st?"":"|ref")+"|"+n+")=";return e&&!Ot.length?d:new RegExp(r).test(t)}).join("&")||h},lt=it+"_loaded";if(l[lt]==f)return p(w+"twice");l.sa_event_loaded=f,l[lt]=f;var pt=function(e,t,n){e=n?e:Z(qt,Dt,e),g.brave&&!n&&(e.brave=f),g._duckduckgoloader_&&!n&&(e.duck=f);var r=new Image;t&&(r.onerror=t,r.onload=t),r.src=k+"/simple.gif?"+Object.keys(e).filter(function(t){return e[t]!=h}).map(function(t){return O(t)+"="+O(e[t])}).join("&")+"&time="+Date.now()},ht=t.hostname||J(z,"hostname"),ft=ht||v,dt={version:"custom_latest_11",hostname:ft};n=function(t){t=t.stack?t+" "+t.stack:t,p(t),pt(Z(dt,{type:i,error:t,path:s.pathname}),h,f)},M(i,function(t){t.filename&&-1"); +!function(d,t,e,n,m){try{var v=undefined,g=!0,y=!1,r="true",a="https:",_="pageview",u="event",i="error",o=d.console,c="doNotTrack",w=d.navigator,s=d.location,b=s.host,l=d.document,p=w.userAgent,f="Not sending request ",h=f+"when ",O=y,x=encodeURIComponent,E=decodeURIComponent,S=JSON.stringify,k=d.addEventListener,M="https://"+e,q=l.documentElement||{},A="language",$="Height",j="scroll",D=w.userAgentData,C=j+$,H="offset"+$,R="client"+$,P="pagehide",T="platform",U="platformVersion",I="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),N=d.screen,z=l.currentScript||l.querySelector('script[src*="'+e+'"]');m=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){m("Error in your "+t+" function:",e)},W=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},G=function(t){return"string"==typeof t},J=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},L=function(t,e){return t&&t.getAttribute("data-"+e)},Y=function(t){return Array.isArray(t)?t:G(t)&&t.length?t.split(/, ?/):[]},Z=function(t){return t&&t.constructor===Object},K=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},it=function(t){return"function"==typeof t},ot="namespace",ct=t[ot]||L(z,ot)||"sa",st=function(t,e){var n=d[ct+"_metadata"];Z(n)&&(t=K(t,n));var r=d[Mt];if(!it(r))return Mt&&m(Mt+" not found, set window."+Mt),t;try{return K(t,r.call(d,K(t,e)))}catch(a){F("metadata",a)}},ut=t.strictUtm||L(z,"strict-utm")==r,lt=function(i,t){tt=!i&&nt("q")?"":y;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");tt!==y&&0"); //# sourceMappingURL=latest.js.map \ No newline at end of file diff --git a/dist/latest/custom/latest.js.map b/dist/latest/custom/latest.js.map index d0be19b3..e2232a8d 100644 --- a/dist/latest/custom/latest.js.map +++ b/dist/latest/custom/latest.js.map @@ -1 +1 @@ -{"version":3,"file":"latest.source.js","sources":["latest.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var metadataObject = window[namespace + \"_metadata\"];\n var appendMetadata = function (metadata, data) {\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) return metadata;\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var getQueryParams = function (ignoreSource) {\n return (\n loc.search\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex).test(keyValue);\n })\n .join(\"&\") || undefinedVar\n );\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n window.phantom ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n return (\n (doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n nav.sendBeacon(fullApiUrl + \"/append\", stringify(append));\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n metadata\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n\n sendData({\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: getQueryParams(deleteSourceInfo),\n\n metadata: stringify(metadata),\n });\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (isPushState, pathOverwrite, metadata) {\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique = isPushState || userNavigated ? falseVar : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n sendPageView(\n isPushState,\n isPushState || userNavigated || !collectMetricByString(\"r\"), // r = referrers\n sameSite,\n metadata\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n else {\n window.sa_pageview = function (path, metadata) {\n pageview(0, path, metadata);\n };\n }\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_latest_11\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","metadataObject","appendMetadata","metadata","data","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","search","keyValue","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","indexOf","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","bot","webdriver","__nightmare","callPhantom","_phantom","phantom","__polypane","_bot","collectDataOnLeave","ua","protocol","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","i","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","e","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","callbackRaw","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue","q"],"mappings":";;CAEA,SACEA,EACAC,EACAC,EAIAC,EACAC,GAEA,IAQE,IAAIC,EAAeC,UACfC,GAAU,EACVC,GAAW,EACXC,EAAW,OACXC,EAAQ,SACRC,EAAe,WACfC,EAAY,QACZC,EAAY,QAGZC,EAAMd,EAAOe,QACbC,EAAa,aACbC,EAAMjB,EAAOkB,UACbC,EAAMnB,EAAOoB,SACbC,EAAmBF,EAAIG,KACvBC,EAAMvB,EAAOwB,SACbC,EAAYR,EAAIQ,UAChBC,EAAa,uBACbC,EAAiBD,EAAa,QAC9BE,EAA2BpB,EAC3BqB,EAAyBC,mBACzBC,EAAyBC,mBACzBC,EAAYC,KAAKD,UAEjBE,EAAuBnC,EAAOoC,iBAC9BC,EAhBW3B,WAgB4BR,EACvCoC,EAAkBf,EAAIe,iBAAmB,GACzCC,EAAW,WACXC,EAAS,SAETC,EAAS,SACTC,EAASzB,EAAI0B,cACbC,EAAeH,EAASD,EACxBK,EAAe,SAAWL,EAC1BM,EAAe,SAAWN,EAE1BO,EAAW,WACXC,EAAe,WACfC,EAAsB,kBACtBC,EAAU,mCACVC,EAAQ,EACRC,EACF,sBAAsBC,KAAK5B,KAAe,WAAW4B,KAAK5B,GACxD6B,EAAStD,EAAOsD,OAIhBC,EACFhC,EAAIiC,eAAiBjC,EAAIkC,cAAc,gBAAkBvD,EAAU,MAOrEE,EAAO,WAEL,IAAIsD,EAAO,GAAGC,MAAMC,KAAKC,WAOzB,OAJAH,EAAKI,QAAQ,qBAINC,SAASC,UAAUC,MAAML,KAAK9C,EAAIV,KAAMU,EAAK4C,IAGtD,IAAIQ,EAAiB,SAAUC,EAAMC,GACnChE,EAAK,iBAAmB+D,EAAO,aAAcC,IAG3CC,EAAU,SAAUC,EAAKC,GAC3B,OAAOC,OAAOR,UAAUS,eAAeb,KAAKU,EAAKC,IAO/CG,EAAc,SAAUC,GAC1B,OAAOA,EAAKC,QAAQ,sBAAuB,SAGzCC,EAAO,SAAUtB,EAAeuB,GAClC,OAAOvB,GAAiBA,EAAcwB,aAAa,QAAUD,IAG3DE,EAA+B,SAAUC,GAC3C,OAAOC,MAAMC,QAAQF,GACjBA,EAboB,iBAcXA,GAAQA,EAAIG,OACnBH,EAAII,MAAM,OACV,IAGJC,EAAW,SAAUC,GACvB,OAAOA,GAAUA,EAAOC,cAAgBhB,QAGtCiB,EAAS,WAGX,IAFA,IAAIC,EAAK,GACLC,EAAM9B,UACD+B,EAAQ,EAAGA,EAAQD,EAAIP,OAAQQ,IAAS,CAC/C,IAAIC,EAAaF,EAAIC,GACrB,GAAIN,EAASO,GACX,IAAK,IAAIC,KAAWD,EACdxB,EAAQwB,EAAYC,KACtBJ,EAAGI,GAAWD,EAAWC,IAKjC,OAAOJ,GAGLK,EAAW/F,EAAOgG,YAClBC,EAAcF,GAAYvB,OAAO0B,KAAKjG,GAAkBmF,OAG5DnF,EAAmBwF,EAAOxF,EAAkB8F,GAExCE,GAAa7F,EAAK,WAAYH,GAGlC,IAAIkG,EAAgBnB,EAClB/E,EAAiBkG,eAAiBtB,EAAKtB,EAAe,mBAGpD6C,GAAwB,SAAUC,GAEpC,OAGgB,IAFdF,EAAcG,OAAO,SAAU3B,GAC7B,OAAO,IAAI4B,OAAO,IAAMF,GAAoBhD,KAAKsB,KAChDS,QAIHoB,GAAMC,KAAKD,IAEXE,GAAO,WACT,IAAIC,EAAe3G,EAAO4G,QAAU5G,EAAO6G,SACvCC,EAAY,CAAC,MAAQ,KAAO,KAAO,KAAO,KAC1CC,EAAY,SAEhB,IACE,OAAOD,EAAUlC,QAAQmC,EAAW,SAAUC,GAC5C,OACEA,EACCL,EAAaM,gBAAgB,IAAIC,WAAW,IAAI,GAC9C,IAAOF,EAAI,GACdG,SAAS,MAEb,MAAO/C,GACP,OAAO0C,EAAUlC,QAAQmC,EAAW,SAAUC,GAC5C,IAAII,EAAqB,GAAhBC,KAAKC,SAAiB,EAE/B,OADMN,EAAI,EAAII,EAAS,EAAJA,EAAW,GACrBD,SAAS,QAKpBI,GAAa,SAAUC,GACzB,MAAsB,mBAARA,GAIZC,GAAgB,YAChBC,GACFzH,EAAiBwH,KACjB5C,EAAKtB,EAAekE,KA6uBxB,KA1uBME,GAAiB3H,EAAO0H,GAAY,aACpCE,GAAiB,SAAUC,EAAUC,GACnCxC,EAASqC,MAAiBE,EAAWpC,EAAOoC,EAAUF,KAC1D,IAAII,EAA4B/H,EAAOgI,IACvC,IAAKT,GAAWQ,GAA4B,OAAOF,EACnD,IACE,OAAOpC,EACLoC,EACAE,EAA0BnE,KAAK5D,EAAQyF,EAAOoC,EAAUC,KAE1D,MAAO1D,GACPF,EAAe,WAAYE,KAU3B6D,GACFhI,EAAiBgI,WACjBpD,EAAKtB,EAAe,eAAiB9C,EAEnCyH,GAAiB,SAAUC,GAC7B,OACEhH,EAAIiH,OACDzE,MAAM,GACN0B,MAAM,KACNiB,OAAO,SAAU+B,GAChB,IAAIC,EAASH,IAAiB/B,GAAsB,MAEhDmC,EAAkBC,GAAYC,IAAI/D,GAAagE,KAAK,KACpDC,EAAQL,EACR,KAAOC,EAAkB,KACzB,YACCN,GAAY,GAAK,KAClB,yCACCA,GAAY,GAAK,QAClB,IACAM,EACA,KACJ,OAAID,IAAWE,GAAYpD,OAAe5E,EAInC,IAAI+F,OAAOoC,GAAOtF,KAAKgF,KAE/BK,KAAK,MAAQrI,GAgChBuI,GAAiBlB,GAAY,UACjC,GAAI1H,EAAO4I,KAAmBrI,EAAS,OAAOH,EAAKsB,EAAa,SAChE1B,EAAO6I,gBAAkBtI,EACzBP,EAAO4I,IAAkBrI,EAOzB,IAAIuI,GAAW,SAAUhB,EAAMiB,EAAUC,GACvClB,EAAOkB,EAAelB,EAAOrC,EAAOwD,GAASC,GAAMpB,GAE/C7G,EAAIkI,QAAUH,IAAclB,EAAKqB,MAAQ5I,GACzCU,EAAImI,qBAAuBJ,IAAclB,EAAKuB,KAAO9I,GAGzD,IAAI+I,EAAQ,IAAIC,MACZR,IACFO,EAAME,QAAUT,EAChBO,EAAMG,OAASV,GAEjBO,EAAMI,IACJrH,EACA,eACAmC,OAAO0B,KAAK4B,GACTxB,OAAO,SAAUqD,GAChB,OAAO7B,EAAK6B,IAAQtJ,IAErBoI,IAAI,SAAUkB,GACb,OACE9H,EAAuB8H,GACvB,IACA9H,EAAuBiG,EAAK6B,MAG/BjB,KAAK,KACR,SACAjC,KAAKD,OAILoD,GACF3J,EAAiB4J,UAAYhF,EAAKtB,EAAe,YAC/CuG,GAAkBF,IAAuBvI,EAEzC0I,GAAc,CAChBC,QAymBJ,mBAxmBIH,SAAUC,IASZ3J,EAAY,SAAU8J,GACpBA,EAAiBA,EAAeC,MAC5BD,EAAiB,IAAMA,EAAeC,MACtCD,EACJ7J,EAAK6J,GACLnB,GACErD,EAAOsE,GAAa,CAClBI,KAAMtJ,EACNuD,MAAO6F,EACPG,KAAMjJ,EAAIkJ,WAEZhK,EACAE,IAMJ4B,EACEtB,EACA,SAAUyJ,GACJA,EAAMC,WAA+C,EAAnCD,EAAMC,SAASC,QAAQtK,IAC3CC,EAAUmK,EAAMG,UAGpBjK,GAOF,IAwDIkK,GAxDAC,GAAQnE,KAERoE,GAAW,EAOXC,GAAO5K,EAAiB4K,MAAQhG,EAAKtB,EAAe,QAGpDuH,MAvKsBC,GAuKC9K,EAAiB6K,cAtKvBC,GAuKjB9K,EAAiB6K,WACjBjG,EAAKtB,EAAe,eAAiB9C,GACrCoE,EAAKtB,EAAe,aAAe9C,GACnCoE,EAAKtB,EAAe,gBAAkB9C,EAGtCuK,KACqC,SAAvCnG,EAAKtB,EAAe,iBACpBtD,EAAiB+K,cAAgBxK,GAI/ByK,GACFhL,EAAiBiL,UACjBrG,EAAKtB,EAAe,cACpBmE,GAAY,IAAM9G,EAGhBuK,GAAcnG,EAChB/E,EAAiBkL,aAAetG,EAAKtB,EAAe,iBAIlDiF,GAAcxD,EAChB/E,EAAiBuI,aAAe3D,EAAKtB,EAAe,iBAIlD6H,GAAqBpG,EACvB/E,EAAiBmL,oBACfvG,EAAKtB,EAAe,yBAIpB8H,GACFpL,EAAiBoL,gBAAkBxG,EAAKtB,EAAe,mBAGrDyE,GACF/H,EAAiB+H,mBACjBnD,EAAKtB,EAAe,sBAItB,IAEEmH,GAAWtE,GAAsB,KAC7BkF,KAAKC,iBAAiBC,kBAAkBC,SACxCpL,EACJ,MAAO+D,IACPhE,EAAKgE,IAOP,IAAIsH,GACFzK,EAAI0K,WACJ3L,EAAO4L,aACP5L,EAAO6L,aACP7L,EAAO8L,UACP9L,EAAO+L,SACP/L,EAAOgM,YACPhM,EAAOiM,MACP7I,GACAiE,KAAKC,UAAYD,KAAKC,SAGpB4E,GACF9F,GAAsB,MAAQA,GAAsB,QAElDsF,KAAK3B,GAAY2B,IAAMnL,GAE3B,IAAI0I,GAAUxD,EAAOsE,GAAa,CAEhCoC,GAAI/F,GAAsB,MAAQ3E,EAAYpB,EAE9CK,MAAOS,EAAIiL,UAAY1L,EACvBgK,SAAUA,GACV2B,QAASH,GAAqBxF,KAASrG,EAGvCiM,WAAYlG,GAAsB,MAAQM,KAASrG,IA0BrD,GAvBA4I,GAAQsD,IAAM/L,EAIVkC,IACFuG,GAAQuD,OAAS9J,EAAO8J,OACxBvD,GAAQwD,OAASxK,EAAUS,EAAO+J,SAS/BlL,EAAImL,SAAStM,EAAK,4CAInB0J,KAAoBzI,IACtB4H,GAAQ0D,kBAAoBtL,IAGzByJ,IAAc9J,KAAcC,GAA0B,KAAnBA,EAAID,GAC1C,OAAOZ,EACLuB,EAAiBX,EAAa,oBAAsBkC,EAAU,SAK7B,GAAlC7B,EAAiBmJ,QAAQ,OACxB,aAAanH,KAAKhC,IACnBuI,IAEDxJ,EACE,mBACEiB,EACA,SACA6B,EACA,0BAON,IACI0J,GAiDAC,GAlDA3D,GAAO,GAaP4D,IARCvL,EAAIuL,UAAY,IACdlI,QAAQvD,EAAkByI,IAC1BlF,QAAQ,sDAAuD,MAC/DA,QAAQ,YAAa,OAASvE,EAYjC0M,GAAW,EAEXC,GAAc,SAAUC,EAAIC,GAC9B,IAEIC,EAFCjB,KAEDiB,EAAS1H,EAAOsE,GAAa,CAC/BI,KAAM,SACNiD,YAAaF,EAAOD,EAAKhE,GAAQoD,UAI/BjG,GAAsB,OACxB+G,EAAOE,SAAWhG,KAAKiG,OAAO9G,KAAQmE,GAAQoC,IAhfnC,MAkfbA,GAAW,EACXpC,GAAQnE,KAGJJ,GAAsB,UACxB+G,EAAOvC,SAAWvD,KAAKkG,IAAI,EAAG3C,GAAU4C,OAGtCN,IAASjM,EAAIwM,WAEf3E,GAASqE,EAAQ9M,EAAcE,GAE/BU,EAAIwM,WAAWpL,EAAa,UAAWJ,EAAUkL,MAKrDhL,EACE,mBACA,WACMZ,EAAImM,QACA,KAAO3K,KAAY/C,GAASgN,KAClCH,GAAcrG,MACTuG,IAAYvG,KAAQqG,IAE7BrM,GAGF2B,EAAqBY,EAAUiK,GAAaxM,GAE5C,IAAImN,GAAOpM,EAAIoM,MAAQ,GACnBH,GAAW,WACb,IACE,IAAII,EAAuBtL,EAAgBQ,IAAiB,EACxD+K,EAASxG,KAAKkG,IAChBI,GAAK/K,IAAiB,EACtB+K,GAAK9K,IAAiB,EACtBP,EAAgBQ,IAAiB,EACjCR,EAAgBM,IAAiB,EACjCN,EAAgBO,IAAiB,GAEnC,OAAOwE,KAAKyG,IACV,IAKI,EAJJzG,KAAKiG,MACF,MAAQhL,EAAgByL,WAAa,GAAKH,GACzCC,EACA,IAGN,MAAOzJ,IAEP,OADAhE,EAAKgE,IACE,IAIXjC,EAAqB,OAAQ,WAC3ByI,GAAW4C,KACXrL,EACEM,EACA,WACMmI,GAAW4C,OAAY5C,GAAW4C,OAExChN,KAQJ,IAgCIwN,GA6BAC,GAAUC,GA7DVC,GAAU,SAAUC,GACtB,IAAIhE,EAAO,GAIX,IACEA,EAAOgE,GAAarM,EAAuBZ,EAAIkJ,UAC/C,MAAOjG,IACPhE,EAAKgE,IAGP,IAAIiK,EAAyBrO,EAAOqL,IACpC,GAAI9D,GAAW8G,GACb,IACEjE,EAAOiE,EAAuBzK,KAAK5D,EAAQ,CAAEoK,KAAMA,KAAWA,EAC9D,MAAOhG,IACPF,EAAe,OAAQE,IAK3B,IAlYiB,SAAUgG,GAC3B,IAAK,IAAIkE,KAAKnD,GAAa,CACzB,IAAIoD,EAAgBpD,GAAYmD,GAChC,GAAKC,EAAL,CAGA,IAAIC,EAhOI,KAiOND,EAAc,GAAcA,EAjOtB,IAiO8CA,EAEtD,GACEC,IAAepE,GACf,IAAI7D,OACF,IAAM7B,EAAY8J,GAAY5J,QAAQ,SAAU,QAAU,IAC1D,KACAvB,KAAK+G,GAEP,OAAO7J,GAEX,OAAOC,EAgXHiO,CAAarE,GAQjB,MAFY,QAARS,IAAkB1J,EAAIuN,OAAMtE,GAAQjJ,EAAIuN,KAAKrJ,MAAM,KAAK,IAErD+E,EAPLhK,EAAKuB,EAAiB,YAAcyI,IAyCpCuE,GAAW,SAAUC,EAAaC,EAAehH,GAEnD,IAAIuC,EAAO+D,GAAQU,GAGnB,GAAKzE,GAAQwC,IAAgBxC,EAA7B,CAEAwC,GAAexC,EACflB,GAAKkB,KAAOA,EAGRhE,GAAsB,OACxB8C,GAAK4F,eACHzH,KAAKkG,IAAIjL,EAA2B,aAAK,EAAGtC,EAAO+O,YAAc,IACjE,KACF7F,GAAK8F,gBACH3H,KAAKkG,IACHjL,EAAgBQ,IAAiB,EACjC9C,EAAOiP,aAAe,IACnB,MAIL7I,GAAsB,MACpBnF,EAAIsB,KAAW2G,GAAK3G,GAAYtB,EAAIsB,IAItCe,GAAU8C,GAAsB,QAClC8C,GAAKgG,aAAe5L,EAAO6L,MAC3BjG,GAAKkG,cAAgB9L,EAAOuK,QAI9B,IAIIwB,EAJAC,EAAOtP,EAAOuP,YACdC,EAAiB,aAIrB,IACEH,EAAsBC,EAAKG,iBAAiBD,GAAgB,GAAGrF,KAC/D,MAAO/F,IACPhE,EAAKgE,IAGP8J,GAAgBmB,GAC+C,EAA3D,CAAC,SAAU,gBAAgB7E,QAAQ6E,GAGnCC,GACAA,EAAKE,KACwC,EAA7C,CAAC,EAAG,GAAGhF,QAAQ8E,EAAKE,GAAgBrF,MAGxC,IAAIuF,EAA0B5C,GAC1BA,GAASzH,MA7rBH,KA6rBgB,GACtBhF,EACJ4N,GAAWnB,IACgD,EAAvD1B,GAAmBZ,QAAQkF,IAC3BA,GAA2BrO,EAC3Bb,EAGJ0I,GAAKyG,OAASf,GAAeV,GAAgB1N,GAAYyN,GAEzDpG,EAAWD,GAAeC,EAAU,CAClCsC,KAAMxJ,EACNyJ,KAAMlB,GAAKkB,OAGb,IAAIwF,EAAsB,WACxBhO,EAA2BrB,EAnGZ,SACjBqO,EACAiB,EACA5B,EACApG,GAEI+G,GAAa5B,GAAY,GAAK/D,GAAQoD,QAAS9L,GAC/C2L,KAAoBjD,GAAQoD,QAAU3F,MAE1C,IAAIoJ,EAAchG,GAAkBqE,KAEpCrF,GAAS,CACPmE,GAAIhE,GAAQoD,QACZlC,KAAMxJ,EACNmM,UAAW+C,GAAoB5B,EAAWnB,GAAW,KACrDiD,MAAO7H,GAAe2H,GAEtBhI,SAAU5F,EAAU4F,KAGtBmG,GAAmBlB,GACnBA,GAAWgD,EAEX3M,IA6EE6M,CACEpB,EACAA,GAAeV,KAAkB9H,GAAsB,KACvD6H,GACApG,IAIJ,GAAKjG,EAmBHgO,SAjBA,IACMlN,GAAU6E,GAAW7E,EAAOuN,sBAC9BvN,EACGuN,qBAAqB,CAACjN,EAAcC,IACpCiN,KAAK,SAAUC,GACdlH,GAAQmH,QAAUD,EAAkBnN,GACpCiG,GAAQoH,WAAaF,EAAkBlN,GACvC2M,MAEDU,SAAMV,GAETA,IAEF,MAAOW,GACPX,OAWFY,GAAMxQ,EAAOyQ,QACbC,GAAeF,GAAMA,GAAIG,UAAYtQ,EACrCuQ,GAAM5Q,EAAO6Q,cACbC,GAAgB,YAIhB9F,IAAe0F,IAAgBK,OAASH,KAqB1CJ,GAAIG,WAnBEK,GAAOR,GADiBrG,GAoBA2G,IAlBrB,WACL,IAEIxG,EAFA3E,EAAM9B,UACNoN,EAAKD,GAAK/M,MAAMiN,KAAMvL,GAY1B,OAVI4B,GAAWwJ,OACbzG,EAAQ,IAAIyG,MAAM5G,KAIlBG,EAAQ/I,EAAI4P,YAAY,UAClBC,UAAUjH,GAAM5J,EAASA,GAEjC+J,EAAMzG,UAAY8B,EAClBiL,GAAItG,GACG2G,IAMX9O,EACE2O,GACA,WACEnC,GAAS,IAEXnO,GAGF2B,EACE,WACA,WACEwM,GAAS,IAEXnO,IAKAwK,IAAuB,QAARH,IAAkB,iBAAkB7K,GACrDmC,EACE,aACA,WACEwM,GAAS,IAEXnO,GAIAwK,GAAa2D,KAEf3O,EAAOqR,YAAc,SAAUjH,EAAMvC,GACnC8G,GAAS,EAAGvE,EAAMvC,IAQtB,IAAIyJ,GAAa,CAAC,SAAU,UAExBC,GAAY,SAAUjH,EAAOzC,EAAU2J,IACpCA,GAAejK,GAAWM,KAAW2J,EAAc3J,GAExD,IAAI4J,EAAkBlK,GAAW+C,GAC7BvB,EAAWxB,GAAWiK,GAAeA,EAAc,aACnDE,SAAmBpH,EAEvB,GAAIgH,GAAW9G,QAAQkH,GAAa,IAAMD,EAExC,OADAvN,EAAe+G,GAAmBrK,EAAY,aAAe8Q,GACtD3I,IAGT,IACE,GAAI0I,EAAiB,CACnB,IAAIE,EAAcrH,IAClB,GAAIgH,GAAW9G,eAAemH,GAAe,EAK3C,OAJAzN,EACE+G,GACAX,EAAQ,uBAAyBqH,GAE5B5I,IAETuB,EAAQqH,GAEV,MAAOvN,IAEP,OADAF,EAAe+G,GAAmB7G,IAC3B2E,IAGTuB,GAAS,GAAKA,GAAO1F,QAAQ,eAAgB,KAAKA,QAAQ,WAAY,IAEtE,IAAIgN,EAAc,CAAEzH,KAAMvJ,EAAW0J,MAAOA,GACxCuH,GAAa3D,IAAiB/K,EAAQ,EAE1C0E,EAAWD,GAAeC,EAAU+J,GAEhCtH,GACFxB,GACErD,EAAOmM,EAAa,CAClB3E,GAAIvG,KACJqJ,MAAO7H,IAAgB2J,GACvB/E,UACG+E,GAAa5D,KAAa7H,GAAsB,KAC7C4H,GACA,KAENnG,SAAU5F,EAAU4F,KAEtBkB,IAKF+I,GAAmB,SAAUxH,EAAOzC,EAAUkB,GAChDwI,GAAUjH,EAAOzC,EAAUkB,IAIxB/I,EAAOiL,MACVjL,EAAOiL,IAAqB6G,IAE9B,IAAIC,GAAY/R,EAAOiL,IAGnB+G,GAAQD,IAAaA,GAAUE,EAAIF,GAAUE,EAAI,GAMrD,IAAK,IAAI3H,MAHTtK,EAAOiL,IAAqB6G,GAGVE,GACZ3N,EAAQ2N,GAAO1H,MACjBpF,MAAMC,QAAQ6M,GAAM1H,KAChBiH,GAAUtN,MAAM,KAAM+N,GAAM1H,KAC5BiH,GAAUS,GAAM1H,MAGxB,MAAOiG,IACPpQ,EAAUoQ,IA7IY,IAAUpG,GACxB6G,GAvkBkBjG,GA7M9B,CAm6BE/K,OACA,uBACA"} \ No newline at end of file +{"version":3,"file":"latest.source.js","sources":["latest.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_latest_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","protocol","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue"],"mappings":";;CAEA,SACEA,EACAC,EACAC,EAIAC,EACAC,GAEA,IAQE,IAAIC,EAAeC,UACfC,GAAU,EACVC,GAAW,EACXC,EAAW,OACXC,EAAQ,SACRC,EAAe,WACfC,EAAY,QACZC,EAAY,QAGZC,EAAMd,EAAOe,QACbC,EAAa,aACbC,EAAMjB,EAAOkB,UACbC,EAAMnB,EAAOoB,SACbC,EAAmBF,EAAIG,KACvBC,EAAMvB,EAAOwB,SACbC,EAAYR,EAAIQ,UAChBC,EAAa,uBACbC,EAAiBD,EAAa,QAC9BE,EAA2BpB,EAC3BqB,EAAyBC,mBACzBC,EAAyBC,mBACzBC,EAAYC,KAAKD,UAEjBE,EAAuBnC,EAAOoC,iBAC9BC,EAhBW3B,WAgB4BR,EACvCoC,EAAkBf,EAAIe,iBAAmB,GACzCC,EAAW,WACXC,EAAS,SAETC,EAAS,SACTC,EAASzB,EAAI0B,cACbC,EAAeH,EAASD,EACxBK,EAAe,SAAWL,EAC1BM,EAAe,SAAWN,EAE1BO,EAAW,WACXC,EAAe,WACfC,EAAsB,kBACtBC,EAAU,mCACVC,EAAQ,EACRC,EACF,sBAAsBC,KAAK5B,KAAe,WAAW4B,KAAK5B,GACxD6B,EAAStD,EAAOsD,OAIhBC,EACFhC,EAAIiC,eAAiBjC,EAAIkC,cAAc,gBAAkBvD,EAAU,MAOrEE,EAAO,WAEL,IAAIsD,EAAO,GAAGC,MAAMC,KAAKC,WAOzB,OAJAH,EAAKI,QAAQ,qBAINC,SAASC,UAAUC,MAAML,KAAK9C,EAAIV,KAAMU,EAAK4C,IAGtD,IAAIQ,EAAiB,SAAUC,EAAMC,GACnChE,EAAK,iBAAmB+D,EAAO,aAAcC,IAG3CC,EAAU,SAAUC,EAAKC,GAC3B,OAAOC,OAAOR,UAAUS,eAAeb,KAAKU,EAAKC,IAG/CG,EAAW,SAAUC,GACvB,MAAwB,iBAAVA,GAGZC,EAAc,SAAUC,GAC1B,OAAOA,EAAKC,QAAQ,sBAAuB,SAGzCC,EAAO,SAAUxB,EAAeyB,GAClC,OAAOzB,GAAiBA,EAAc0B,aAAa,QAAUD,IAG3DE,EAA+B,SAAUC,GAC3C,OAAOC,MAAMC,QAAQF,GACjBA,EACAT,EAASS,IAAQA,EAAIG,OACnBH,EAAII,MAAM,OACV,IAGJC,EAAW,SAAUC,GACvB,OAAOA,GAAUA,EAAOC,cAAgBlB,QAGtCmB,EAAS,WAGX,IAFA,IAAIC,EAAK,GACLC,EAAMhC,UACDiC,EAAQ,EAAGA,EAAQD,EAAIP,OAAQQ,IAAS,CAC/C,IAAIC,EAAaF,EAAIC,GACrB,GAAIN,EAASO,GACX,IAAK,IAAIC,KAAWD,EACd1B,EAAQ0B,EAAYC,KACtBJ,EAAGI,GAAWD,EAAWC,IAKjC,OAAOJ,GAGLK,EAAWjG,EAAOkG,YAClBC,EAAcF,GAAYzB,OAAO4B,KAAKnG,GAAkBqF,OAG5DrF,EAAmB0F,EAAO1F,EAAkBgG,GAExCE,GAAa/F,EAAK,WAAYH,GAGlC,IA+EIoG,GA/EAC,GAAgBpB,EAClBjF,EAAiBqG,eAAiBvB,EAAKxB,EAAe,mBAGpDgD,GAAwB,SAAUC,GAEpC,OAGgB,IAFdF,GAAcG,OAAO,SAAU5B,GAC7B,OAAO,IAAI6B,OAAO,IAAMF,GAAoBnD,KAAKwB,KAChDS,QAIHqB,GAAMC,KAAKD,IAEXE,GAAO,WACT,IAAIC,EAAe9G,EAAO+G,QAAU/G,EAAOgH,SACvCC,EAAY,CAAC,MAAQ,KAAO,KAAO,KAAO,KAC1CC,EAAY,SAEhB,IACE,OAAOD,EAAUnC,QAAQoC,EAAW,SAAUC,GAC5C,OACEA,EACCL,EAAaM,gBAAgB,IAAIC,WAAW,IAAI,GAC9C,IAAOF,EAAI,GACdG,SAAS,MAEb,MAAOlD,GACP,OAAO6C,EAAUnC,QAAQoC,EAAW,SAAUC,GAC5C,IAAII,EAAqB,GAAhBC,KAAKC,SAAiB,EAE/B,OADMN,EAAI,EAAII,EAAS,EAAJA,EAAW,GACrBD,SAAS,QAKpBI,GAAa,SAAUC,GACzB,MAAsB,mBAARA,GAIZC,GAAgB,YAChBC,GACF5H,EAAiB2H,KACjB7C,EAAKxB,EAAeqE,KAiyBxB,KA9xBME,GAAiB,SAAUC,EAAUC,GACvC,IAAIC,EAAiBjI,EAAO6H,GAAY,aACpCrC,EAASyC,KAAiBF,EAAWpC,EAAOoC,EAAUE,IAC1D,IAAIC,EAA4BlI,EAAOmI,IACvC,IAAKT,GAAWQ,GAKd,OAJIC,IACF/H,EACE+H,GAAoB,0BAA4BA,IAE7CJ,EAET,IACE,OAAOpC,EACLoC,EACAG,EAA0BtE,KAAK5D,EAAQ2F,EAAOoC,EAAUC,KAE1D,MAAO5D,GACPF,EAAe,WAAYE,KAU3BgE,GACFnI,EAAiBmI,WACjBrD,EAAKxB,EAAe,eAAiB9C,EAInC4H,GAAiB,SAAUC,EAAcC,GAC3ClC,IAAKiC,GAAgB/B,GAAsB,KAAO,GAAK/F,EACvD,IAAIgI,GAAKD,GAAmBpH,EAAIsH,QAC7B9E,MAAM,GACN4B,MAAM,KACNkB,OAAO,SAAUiC,GAChB,IAAIC,EAAID,EAASE,QAAQ,KACrBvC,KAAM7F,GAAgB,EAAJmI,GAASD,EAAS/E,MAAMgF,EAAI,KAChDtC,KAAMA,GAAI,IAAM,IAAMqC,EAAS/E,MAAM,EAAGgF,IAE1C,IAAIE,EAASP,IAAiB/B,GAAsB,MAEhDuC,EAAkBC,GAAYC,IAAIpE,GAAaqE,KAAK,KACpDC,EAAQL,EACR,KAAOC,EAAkB,KACzB,YACCV,GAAY,GAAK,KAClB,yCACCA,GAAY,GAAK,QAClB,IACAU,EACA,KACJ,OAAID,IAAWE,GAAYzD,OAAe9E,EAInC,IAAIkG,OAAOwC,EAAO,KAAK7F,KAAKqF,KAEpCO,KAAK,KAGR,OADA5C,GAAIA,IAAKhG,EACFmI,GAAKnI,GA+BV8I,GAAiBtB,GAAY,UACjC,GAAI7H,EAAOmJ,KAAmB5I,EAAS,OAAOH,EAAKsB,EAAa,SAChE1B,EAAOoJ,gBAAkB7I,EACzBP,EAAOmJ,IAAkB5I,EAOzB,IAAI8I,GAAW,SAAUrB,EAAMsB,EAAUC,GACvCvB,EAAOuB,EAAevB,EAAOrC,EAAO6D,GAASC,GAAMzB,GAE/C/G,EAAIyI,QAAUH,IAAcvB,EAAK0B,MAAQnJ,GACzCU,EAAI0I,qBAAuBJ,IAAcvB,EAAK4B,KAAOrJ,GAGzD,IAAIsJ,EAAQ,IAAIC,MACZR,IACFO,EAAME,QAAUT,EAChBO,EAAMG,OAASV,GAEjBO,EAAMI,IACJ5H,EACA,eACAmC,OAAO4B,KAAK4B,GACTvB,OAAO,SAAUyD,GAChB,OAAOlC,EAAKkC,IAAQ7J,IAErB2I,IAAI,SAAUkB,GACb,OACErI,EAAuBqI,GACvB,IACArI,EAAuBmG,EAAKkC,MAG/BjB,KAAK,KACR,SACArC,KAAKD,OAILwD,GACFlK,EAAiBmK,UAAYrF,EAAKxB,EAAe,YAC/C8G,GAAkBF,IAAuB9I,EAEzCiJ,GAAc,CAChBC,QA+oBJ,mBA9oBIH,SAAUC,IASZlK,EAAY,SAAUqK,GACpBA,EAAiBA,EAAeC,MAC5BD,EAAiB,IAAMA,EAAeC,MACtCD,EACJpK,EAAKoK,GACLnB,GACE1D,EAAO2E,GAAa,CAClBI,KAAM7J,EACNuD,MAAOoG,EACPG,KAAMxJ,EAAIyJ,WAEZvK,EACAE,IAMJ4B,EACEtB,EACA,SAAUgK,GACJA,EAAMC,WAA+C,EAAnCD,EAAMC,SAASlC,QAAQ1I,IAC3CC,EAAU0K,EAAME,UAGpBvK,GAOF,IAwDIwK,GAxDAC,GAAQtE,KAERuE,GAAW,EAOXC,GAAOlL,EAAiBkL,MAAQpG,EAAKxB,EAAe,QAGpD6H,MA/KsBC,GA+KCpL,EAAiBmL,cA9KvBC,GA+KjBpL,EAAiBmL,WACjBrG,EAAKxB,EAAe,eAAiB9C,GACrCsE,EAAKxB,EAAe,aAAe9C,GACnCsE,EAAKxB,EAAe,gBAAkB9C,EAGtC6K,KACqC,SAAvCvG,EAAKxB,EAAe,iBACpBtD,EAAiBqL,cAAgB9K,GAI/B+K,GACFtL,EAAiBuL,UACjBzG,EAAKxB,EAAe,cACpBsE,GAAY,IAAMjH,EAGhB6K,GAAcvG,EAChBjF,EAAiBwL,aAAe1G,EAAKxB,EAAe,iBAIlDwF,GAAc7D,EAChBjF,EAAiB8I,aAAehE,EAAKxB,EAAe,iBAIlDmI,GAAqBxG,EACvBjF,EAAiByL,oBACf3G,EAAKxB,EAAe,yBAIpBoI,GACF1L,EAAiB0L,gBAAkB5G,EAAKxB,EAAe,mBAGrD4E,GACFlI,EAAiBkI,mBACjBpD,EAAKxB,EAAe,sBAItB,IAEEyH,GAAWzE,GAAsB,KAC7BqF,KAAKC,iBAAiBC,kBAAkBC,SACxC1L,EACJ,MAAO+D,IACPhE,EAAKgE,IAOP,IAAI4H,GAAUhM,EAAOgM,QACjBC,GACFhL,EAAIiL,WACJlM,EAAOmM,aACPnM,EAAOoM,aACPpM,EAAOqM,UACNL,KAAYA,GAAQM,QACrBtM,EAAOuM,YACPvM,EAAOwM,MACPpJ,GACAoE,KAAKC,UAAYD,KAAKC,SAGpBgF,GACFlG,GAAsB,MAAQA,GAAsB,QAElD0F,KAAK3B,GAAY2B,IAAM1L,GAE3B,IAAIiJ,GAAU7D,EAAO2E,GAAa,CAEhCoC,GAAInG,GAAsB,MAAQ9E,EAAYpB,EAE9CK,MAAOS,EAAIwL,UAAYjM,EACvBsK,SAAUA,GACV4B,QAASH,GAAqB5F,KAASxG,EAGvCwM,WAAYtG,GAAsB,MAAQM,KAASxG,IA0BrD,GAvBAmJ,GAAQsD,IAAMtM,EAIVkC,IACF8G,GAAQuD,OAASrK,EAAOqK,OACxBvD,GAAQwD,OAAS/K,EAAUS,EAAOsK,SAS/BzL,EAAI0L,SAAS7M,EAAK,4CAInBiK,KAAoBhJ,IACtBmI,GAAQ0D,kBAAoB7L,IAGzB+J,IAAcpK,KAAcC,GAA0B,KAAnBA,EAAID,GAC1C,OAAOZ,EACLuB,EAAiBX,EAAa,oBAAsBkC,EAAU,SAK7B,GAAlC7B,EAAiBuH,QAAQ,OACxB,aAAavF,KAAKhC,IACnB8I,IAED/J,EACE,mBACEiB,EACA,SACA6B,EACA,0BAON,IACIiK,GA0DAC,GA3DA3D,GAAO,GAGP4D,GAAc,WAKhB,OAFEpN,EAAiBqN,UAAYvI,EAAKxB,EAAe,aAGzBhC,EAAI+L,UAAY,IACrCxI,QAAQzD,EAAkBgJ,IAC1BvF,QAAQ,sDAAuD,MAC/DA,QAAQ,YAAa,OAASzE,GAKjCiN,GAAWD,KAOXE,GAAW,EAEXC,GAAc,SAAUC,EAAIC,GAC9B,GAAKjB,GAAL,CAEA,IAAIkB,EAAShI,EAAO2E,GAAa,CAC/BI,KAAM,SACNkD,YAAaF,EAAOD,EAAKjE,GAAQoD,UAenC,GAXIrG,GAAsB,OACxBoH,EAAOE,SAAWrG,KAAKsG,OAAOnH,KAAQsE,GAAQsC,IAngBnC,MAqgBbA,GAAW,EACXtC,GAAQtE,KAGJJ,GAAsB,UACxBoH,EAAOzC,SAAW1D,KAAKuG,IAAI,EAAG7C,GAAU8C,OAGtCN,IAASzM,EAAIgN,WAEf5E,GAASsE,EAAQtN,EAAcE,QAE/B,IACEU,EAAIgN,WAAWC,KAAKjN,EAApBA,CAAyBoB,EAAa,UAAWJ,EAAU0L,IAC3D,MAAOQ,GAEP9E,GAASsE,EAAQtN,EAAcE,MAMrC4B,EACE,mBACA,WACMZ,EAAI6M,QACA,KAAOrL,KAAY/C,GAASwN,KAClCJ,GAAczG,MACT4G,IAAY5G,KAAQyG,IAE7B5M,GAGF2B,EAAqBY,EAAUyK,GAAahN,GAE5C,IAAI6N,GAAO9M,EAAI8M,MAAQ,GACnBL,GAAW,WACb,IACE,IAAIM,EAAuBhM,EAAgBQ,IAAiB,EACxDyL,EAAS/G,KAAKuG,IAChBM,GAAKzL,IAAiB,EACtByL,GAAKxL,IAAiB,EACtBP,EAAgBQ,IAAiB,EACjCR,EAAgBM,IAAiB,EACjCN,EAAgBO,IAAiB,GAEnC,OAAO2E,KAAKgH,IACV,IAKI,EAJJhH,KAAKsG,MACF,MAAQxL,EAAgBmM,WAAa,GAAKH,GACzCC,EACA,IAGN,MAAOnK,IAEP,OADAhE,EAAKgE,IACE,IAIXjC,EAAqB,OAAQ,WAC3B+I,GAAW8C,KACX7L,EACEM,EACA,WACMyI,GAAW8C,OAAY9C,GAAW8C,OAExCxN,KAQJ,IAgCIkO,GAoCAC,GAAUC,GApEVC,GAAU,SAAUC,GACtB,IAAInE,EAAO,GAIX,IACEA,EAAOmE,GAAa/M,EAAuBZ,EAAIyJ,UAC/C,MAAOxG,IACPhE,EAAKgE,IAGP,IAAI2K,EAAyB/O,EAAO2L,IACpC,GAAIjE,GAAWqH,GACb,IACEpE,EAAOoE,EAAuBnL,KAAK5D,EAAQ,CAAE2K,KAAMA,KAAWA,EAC9D,MAAOvG,IACPF,EAAe,OAAQE,IAK3B,IA5YiB,SAAUuG,GAC3B,IAAK,IAAIhC,KAAK8C,GAAa,CACzB,IAAIuD,EAAgBvD,GAAY9C,GAChC,GAAKqG,EAAL,CAGA,IAAIC,EA9OI,KA+OND,EAAc,GAAcA,EA/OtB,IA+O8CA,EAEtD,GACEC,IAAetE,GACf,IAAIjE,OACF,IAAM9B,EAAYqK,GAAYnK,QAAQ,SAAU,QAAU,IAC1D,KACAzB,KAAKsH,GAEP,OAAOpK,GAEX,OAAOC,EA0XH0O,CAAavE,GAQjB,MAFY,QAARQ,IAAkBhK,EAAIgO,OAAMxE,GAAQxJ,EAAIgO,KAAK5J,MAAM,KAAK,IAErDoF,EAPLvK,EAAKuB,EAAiB,YAAcgJ,IAgDpCyE,GAAW,SACbC,EACAC,EACAvH,EACAwH,IAEKA,GAAe7H,GAAWK,KAAWwH,EAAcxH,GACxD,IACIyH,EAGEC,EAJFnG,EAAW5B,GAAW6H,GAAeA,EAAc,aAEnD7K,EAAS4K,KAAgD,EAA9BA,EAAc1G,QAAQ,OAGnD0G,GADIG,EAAQH,EAAc/J,MAAM,MACVmK,QACtBF,EAAc,IAAMC,EAAMxG,KAAK,MAGjC,IAAI0B,EAAOkE,GAAQS,GAGnB,GAAK3E,GAAQwC,IAAgBxC,EAA7B,CAEAwC,GAAexC,EACflB,GAAKkB,KAAOA,EAGRpE,GAAsB,OACxBkD,GAAKkG,eACHnI,KAAKuG,IAAIzL,EAA2B,aAAK,EAAGtC,EAAO4P,YAAc,IACjE,KACFnG,GAAKoG,gBACHrI,KAAKuG,IACHzL,EAAgBQ,IAAiB,EACjC9C,EAAO8P,aAAe,IACnB,MAILvJ,GAAsB,MACpBtF,EAAIsB,KAAWkH,GAAKlH,GAAYtB,EAAIsB,IAItCe,GAAUiD,GAAsB,QAClCkD,GAAKsG,aAAezM,EAAO0M,MAC3BvG,GAAKwG,cAAgB3M,EAAOiL,QAI9B,IAII2B,EAJAC,EAAOnQ,EAAOoQ,YACdC,EAAiB,aAIrB,IACEH,EAAsBC,EAAKG,iBAAiBD,GAAgB,GAAG3F,KAC/D,MAAOtG,IACPhE,EAAKgE,IAGPwK,GAAgBsB,GAC+C,EAA3D,CAAC,SAAU,gBAAgBtH,QAAQsH,GAGnCC,GACAA,EAAKE,KACwC,EAA7C,CAAC,EAAG,GAAGzH,QAAQuH,EAAKE,GAAgB3F,MAGxC,IAAI6F,EAA0BjD,GAC1BA,GAAS/H,MA1uBH,KA0uBgB,GACtBlF,EACJsO,GAAWrB,IACgD,EAAvD5B,GAAmB9C,QAAQ2H,IAC3BA,GAA2BlP,EAC3Bb,EAGJiJ,GAAK+G,OACH,QAAQnN,KAAKgK,OAAkBgC,GAAeT,GAC1CpO,GACCmO,GAEP5G,EAAWD,GAAeC,EAAU,CAClC2C,KAAM/J,EACNgK,KAAMlB,GAAKkB,OAGb,IAAI8F,EAAsB,WACxB7O,EAA2BrB,EAC3B,IAAImQ,EACFrB,GAAeT,KAAkBrI,GAAsB,MA7H1C,SACjB8I,EACAsB,EACAhC,EACAlG,EACAV,EACAuB,GAEI+F,GAAa7B,GAAY,GAAKhE,GAAQoD,QAASrM,GAC/CkM,KAAoBjD,GAAQoD,QAAU/F,MAE1C,IAAI+J,EAAcvG,GAAkBwE,KAChCgC,EAAQxI,GAAesI,EAAkBlI,GAE7CY,GACE,CACEoE,GAAIjE,GAAQoD,QACZlC,KAAM/J,EACN2M,UAAWqD,GAAoBhC,EAAWrB,GAAW,KACrDuD,MAAOA,EACPxK,EAAGA,GAEH0B,SAAU9F,EAAU8F,IAEtBuB,GAGFoF,GAAmBpB,GACnBA,GAAWsD,EAEXzN,IAgGE2N,CACEzB,EACAqB,EACA/B,GACAa,EACAzH,EACAuB,IAIJ,GAAK1H,EAmBH6O,SAjBA,IACM/N,GAAUgF,GAAWhF,EAAOqO,sBAC9BrO,EACGqO,qBAAqB,CAAC/N,EAAcC,IACpC+N,KAAK,SAAUC,GACdzH,GAAQ0H,QAAUD,EAAkBjO,GACpCwG,GAAQ2H,WAAaF,EAAkBhO,GACvCwN,MAEDW,SAAMX,GAETA,IAEF,MAAOtC,GACPsC,OAWFY,GAAMrR,EAAOsR,QACbC,GAAeF,GAAMA,GAAIG,UAAYnR,EACrCoR,GAAMzR,EAAO0R,cACbC,GAAgB,YAIhBrG,IAAeiG,IAAgBK,OAASH,KAqB1CJ,GAAIG,WAnBEK,GAAOR,GADiB3G,GAoBAiH,IAlBrB,WACL,IAEI9G,EAFAhF,EAAMhC,UACNiO,EAAKD,GAAK5N,MAAM8N,KAAMlM,GAY1B,OAVI6B,GAAWkK,OACb/G,EAAQ,IAAI+G,MAAMlH,KAIlBG,EAAQtJ,EAAIyQ,YAAY,UAClBC,UAAUvH,GAAMnK,EAASA,GAEjCsK,EAAMhH,UAAYgC,EAClB4L,GAAI5G,GACGiH,IAMX3P,EACEwP,GACA,WACEvC,GAAS,IAEX5O,GAGF2B,EACE,WACA,WACEiN,GAAS,IAEX5O,IAKA8K,IAAuB,QAARH,IAAkB,iBAAkBnL,GACrDmC,EACE,aACA,WACEiN,GAAS,IAEX5O,GAIA8K,IAAa8D,KAEjBpP,EAAOkS,YAAc,SAAUvH,EAAM5C,EAAUuB,GAC7C8F,GAAS,EAAGzE,EAAM5C,EAAUuB,IAQ9B,IAAI6I,GAAa,CAAC,SAAU,UAExBC,GAAY,SAAUvH,EAAO9C,EAAUwH,IACpCA,GAAe7H,GAAWK,KAAWwH,EAAcxH,GAExD,IAAIsK,EAAkB3K,GAAWmD,GAC7BvB,EAAW5B,GAAW6H,GAAeA,EAAc,aACnD+C,SAAmBzH,EAEvB,GAAIsH,GAAWvJ,QAAQ0J,GAAa,IAAMD,EAExC,OADAnO,EAAeqH,GAAmB3K,EAAY,aAAe0R,GACtDhJ,IAGT,IACE,GAAI+I,EAAiB,CACnB,IAAIE,EAAc1H,IAClB,GAAIsH,GAAWvJ,eAAe2J,GAAe,EAK3C,OAJArO,EACEqH,GACAV,EAAQ,uBAAyB0H,GAE5BjJ,IAETuB,EAAQ0H,GAEV,MAAOnO,IAEP,OADAF,EAAeqH,GAAmBnH,IAC3BkF,IAGTuB,GAAS,GAAKA,GAAO/F,QAAQ,eAAgB,KAAKA,QAAQ,WAAY,IAEtE,IAAI0N,EAAc,CAAE9H,KAAM9J,EAAWiK,MAAOA,GACxC4H,GAAa7D,IAAiBzL,EAAQ,EAE1C4E,EAAWD,GAAeC,EAAUyK,GAEhC3H,GACFxB,GACE1D,EAAO6M,EAAa,CAClB/E,GAAI5G,KACJgK,MAAOxI,IAAgBoK,GACvBnF,UACGmF,GAAa9D,KAAapI,GAAsB,KAC7CmI,GACA,KAEN3G,SAAU9F,EAAU8F,KAEtBuB,IAKFoJ,GAAmB,SAAU7H,EAAO9C,EAAUuB,GAChD8I,GAAUvH,EAAO9C,EAAUuB,IAIxBtJ,EAAOuL,MACVvL,EAAOuL,IAAqBmH,IAE9B,IAAIC,GAAY3S,EAAOuL,IAGnBqH,GAAQD,IAAaA,GAAUnK,EAAImK,GAAUnK,EAAI,GAMrD,IAAK,IAAIqC,MAHT7K,EAAOuL,IAAqBmH,GAGVE,GACZvO,EAAQuO,GAAO/H,MACjBzF,MAAMC,QAAQuN,GAAM/H,KAChBuH,GAAUnO,MAAM,KAAM2O,GAAM/H,KAC5BuH,GAAUQ,GAAM/H,MAGxB,MAAOsD,IACPhO,EAAUgO,IA7IY,IAAUzD,GACxBmH,GArnBkBxG,GAnN9B,CAu9BErL,OACA,uBACA"} \ No newline at end of file diff --git a/dist/latest/custom/light.js b/dist/latest/custom/light.js index 4c6f493b..f32008e5 100644 --- a/dist/latest/custom/light.js +++ b/dist/latest/custom/light.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy friendly analytics (docs.simpleanalytics.com/script; 2026-08-17; 98d5; v11) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-16; 1b6a; v12) */ -!function(s,e,t,u){try{var i=undefined,n="https:",r=s.console,a="doNotTrack",p=s.navigator,c=s.location,d=c.host,o=s.document,l=p.userAgent,m="Not sending request ",f=!1,g=encodeURIComponent,h=decodeURIComponent,v=JSON.stringify,y=s.addEventListener,_="https://"+t,w=(o.documentElement,"language"),b=p.userAgentData,O="platform",S="platformVersion",k="https://docs.simpleanalytics.com",j=/(bot|spider|crawl)/i.test(l)&&!/(cubot)/i.test(l),E=o.currentScript||o.querySelector('script[src*="'+t+'"]');u=function(){var e=[].slice.call(arguments);return e.unshift("Simple Analytics:"),Function.prototype.apply.call(r.warn,r,e)};var x=function(e,t){return e&&e.getAttribute("data-"+t)},A=function(){for(var e,t,n,r={},a=arguments,o=0;o>e/4).toString(16)})}catch(r){return e.replace(n,function(e){var t=16*Math.random()|0;return(e<2?t:3&t|8).toString(16)})}},I="namespace",N=e[I]||x(E,I)||"sa",R=e.strictUtm||"true"==x(E,"strict-utm"),U=N+"_loaded";if(1==s[U])return u(m+"twice");s.sa_event_loaded=!0,s[U]=!0;var V,B=function(t,e,n){t=n?t:A(F,J,t),p.brave&&!n&&(t.brave=!0),p._duckduckgoloader_&&!n&&(t.duck=!0),(new Image).src=_+"/simple.gif?"+Object.keys(t).filter(function(e){return t[e]!=i}).map(function(e){return g(e)+"="+g(t[e])}).join("&")+"&time="+Date.now()},C=e.hostname||x(E,"hostname"),H=C||d,T={version:"custom_light_11",hostname:H};e.mode||x(E,"mode");try{V=Intl.DateTimeFormat().resolvedOptions().timeZone}catch(Q){u(Q)}j&&(T.bot=!0);var F=A(T,{ua:l,https:c.protocol==n,timezone:V,page_id:D(),session_id:D()});if(F.sri=!1,b&&(F.mobile=b.mobile,F.brands=v(b.brands)),H!==d&&(F.hostname_original=d),a in p&&"1"==p[a])return u("Not sending request when "+a+" is enabled. See "+k+"/dnt");-1!=d.indexOf(".")&&!/^[0-9.:]+$/.test(d)||C||u("Set hostname on "+d+". See "+k+"/overwrite-domain-name");var z,J={},L=(o.referrer||"").replace(d,H).replace(/^https?:\/\/((m|l|w{2,3}([0-9]+)?)\.)?([^?#]+)(.*)$/,"$4").replace(/^([^/]+)$/,"$1")||i,M=function(e,t){var n=A(T,{type:"append",original_id:t?e:F.page_id});t||!p.sendBeacon?B(n,0,!0):p.sendBeacon(_+"/append",v(n))};y("pagehide",M,!1);var P,Z,G=function(e){var t="";try{t=e||h(c.pathname)}catch(Q){u(Q)}return t},K=function(e,t,n,r){e&&M(""+F.page_id,!0),F.page_id=D();var a,o=H+G();B({id:F.page_id,type:"pageview",referrer:!t||n?L:null,query:(a=t,c.search.slice(1).split("&").filter(function(e){return!a&&new RegExp("^((utm_)"+(R?"":"?")+"(source|medium|content|term|campaign)"+(R?"":"|ref")+")=").test(e)}).join("&")||i)}),L=o,0};!function(e,t){var n=G(t);if(n&&z!=n){z=n,J.path=n,p[w]&&(J[w]=p[w]);var r,a=s.performance,o="navigation";try{r=a.getEntriesByType(o)[0].type}catch(Q){u(Q)}Z=r?-1<["reload","back_forward"].indexOf(r):a&&a[o]&&-1<[1,2].indexOf(a[o].type),P=!!L&&L.split("/")[0]==d;var i=function(){f=!0,K(e,e||Z||!1,P)};if(f)i();else try{b&&"function"==typeof b.getHighEntropyValues?b.getHighEntropyValues([O,S]).then(function(e){F.os_name=e[O],F.os_version=e[S],i()})["catch"](i):i()}catch(c){i()}}}()}catch(W){u(W)}}(window,{},""); +!function(l,e,t,f){try{var u=undefined,n="https:",r=l.console,i="doNotTrack",m=l.navigator,p=l.location,g=p.host,a=l.document,o=m.userAgent,c="Not sending request ",h=!1,s=encodeURIComponent,d=decodeURIComponent,v=JSON.stringify,y=l.addEventListener,_="https://"+t,b=(a.documentElement,"language"),w=m.userAgentData,O="platform",S="platformVersion",j="https://docs.simpleanalytics.com",k=/(bot|spider|crawl)/i.test(o)&&!/(cubot)/i.test(o),x=a.currentScript||a.querySelector('script[src*="'+t+'"]');f=function(){var e=[].slice.call(arguments);return e.unshift("Simple Analytics:"),Function.prototype.apply.call(r.warn,r,e)};var E=function(e){return"string"==typeof e},A=function(e,t){return e&&e.getAttribute("data-"+t)},$=function(){for(var e,t,n,r={},i=arguments,a=0;a>e/4).toString(16)})}catch(r){return e.replace(n,function(e){var t=16*Math.random()|0;return(e<2?t:3&t|8).toString(16)})}},N=function(e){return"function"==typeof e},R="namespace",U=e[R]||A(x,R)||"sa",V=e.strictUtm||"true"==A(x,"strict-utm"),B=U+"_loaded";if(1==l[B])return f(c+"twice");l.sa_event_loaded=!0,l[B]=!0;var C,H=function(t,e,n){t=n?t:$(J,M,t),m.brave&&!n&&(t.brave=!0),m._duckduckgoloader_&&!n&&(t.duck=!0),(new Image).src=_+"/simple.gif?"+Object.keys(t).filter(function(e){return t[e]!=u}).map(function(e){return s(e)+"="+s(t[e])}).join("&")+"&time="+Date.now()},T=e.hostname||A(x,"hostname"),F=T||g,z={version:"custom_light_12",hostname:F};e.mode||A(x,"mode");try{C=Intl.DateTimeFormat().resolvedOptions().timeZone}catch(X){f(X)}k&&(z.bot=!0);var J=$(z,{ua:o,https:p.protocol==n,timezone:C,page_id:I(),session_id:I()});if(J.sri=!1,w&&(J.mobile=w.mobile,J.brands=v(w.brands)),F!==g&&(J.hostname_original=g),i in m&&"1"==m[i])return f("Not sending request when "+i+" is enabled. See "+j+"/dnt");-1!=g.indexOf(".")&&!/^[0-9.:]+$/.test(g)||T||f("Set hostname on "+g+". See "+j+"/overwrite-domain-name");var L,M={},P=(e.referrer||A(x,"referrer")||a.referrer||"").replace(g,F).replace(/^https?:\/\/((m|l|w{2,3}([0-9]+)?)\.)?([^?#]+)(.*)$/,"$4").replace(/^([^/]+)$/,"$1")||u,Z=function(e,t){var n=$(z,{type:"append",original_id:t?e:J.page_id});if(t||!m.sendBeacon)H(n,0,!0);else try{m.sendBeacon.bind(m)(_+"/append",v(n))}catch(r){H(n,0,!0)}};y("pagehide",Z,!1);var G,K,Q=function(e){var t="";try{t=e||d(p.pathname)}catch(X){f(X)}return t},W=function(e,t,n,r,i,a){e&&Z(""+J.page_id,!0),J.page_id=I();var o,c=F+Q(),s=(o=t,(r||p.search).slice(1).split("&").filter(function(e){return!o&&new RegExp("^((utm_)"+(V?"":"?")+"(source|medium|content|term|campaign)"+(V?"":"|ref")+")=","i").test(e)}).join("&")||u);H({id:J.page_id,type:"pageview",referrer:!t||n?P:null,query:s}),P=c,0};!function(e,t,n,r){!r&&N(n)&&(r=n);var i,a;N(r);E(t)&&-1"); //# sourceMappingURL=light.js.map \ No newline at end of file diff --git a/dist/latest/custom/light.js.map b/dist/latest/custom/light.js.map index 146d92d4..a65fce3e 100644 --- a/dist/latest/custom/light.js.map +++ b/dist/latest/custom/light.js.map @@ -1 +1 @@ -{"version":3,"file":"light.source.js","sources":["light.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n\n var collectMetricByString = function (metricAbbreviation) {\n return true;\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var getQueryParams = function (ignoreSource) {\n return (\n loc.search\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n if (ignore) return falseVar;\n var regex =\n \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \")=\";\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex).test(keyValue);\n })\n .join(\"&\") || undefinedVar\n );\n };\n\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n\n\n\n\n\n\n\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var bot = isBotAgent;\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n return (\n (doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n nav.sendBeacon(fullApiUrl + \"/append\", stringify(append));\n }\n };\n\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n\n\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n metadata\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n\n sendData({\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: getQueryParams(deleteSourceInfo),\n\n });\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (isPushState, pathOverwrite, metadata) {\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n sameSite = referrer\n ? referrer.split(slash)[0] == locationHostname\n : falseVar;\n\n\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n sendPageView(\n isPushState,\n isPushState || userNavigated || !collectMetricByString(\"r\"), // r = referrers\n sameSite,\n metadata\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n\n\n pageview();\n\n } catch (e) {\n warn(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_light_11\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","warn","undefinedVar","undefined","https","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","language","documentElement","uaData","userAgentData","platformText","platformVersionText","docsUrl","isBotAgent","test","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","attr","attribute","getAttribute","assign","obj","prop","object","to","arg","index","length","nextSource","constructor","Object","nextKey","hasOwnProperty","settings","sa_settings","logSettings","keys","Date","now","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","replace","c","getRandomValues","Uint8Array","toString","error","r","Math","random","namespaceText","namespace","strictUtm","loadedVariable","sa_event_loaded","timezone","sendData","data","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","Image","src","filter","key","map","join","overwrittenHostname","hostname","definedHostname","basePayload","version","mode","Intl","DateTimeFormat","resolvedOptions","timeZone","bot","ua","protocol","page_id","session_id","sri","mobile","brands","hostname_original","indexOf","lastSendPath","referrer","sendOnLeave","id","push","append","type","original_id","sendBeacon","sameSite","userNavigated","getPath","overwrite","path","pathname","sendPageView","isPushState","deleteSourceInfo","metadata","ignoreSource","currentPage","query","search","split","keyValue","RegExp","pages","pathOverwrite","performaceEntryType","perf","performance","navigationText","getEntriesByType","triggerSendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","e","pageview"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"light.source.js","sources":["light.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n\n var collectMetricByString = function (metricAbbreviation) {\n // eslint-disable-next-line no-unreachable\n return true;\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n if (ignore) return falseVar;\n // eslint-disable-next-line no-redeclare\n var regex =\n \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \")=\";\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n return q || undefinedVar;\n };\n\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n\n\n\n\n\n\n\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n // eslint-disable-next-line no-redeclare\n var bot = isBotAgent;\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n\n\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n sameSite = referrer\n ? referrer.split(slash)[0] == locationHostname\n : falseVar;\n\n\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n\n\n pageview();\n\n } catch (e) {\n warn(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_light_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","warn","undefinedVar","undefined","https","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","language","documentElement","uaData","userAgentData","platformText","platformVersionText","docsUrl","isBotAgent","test","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","isString","string","attr","attribute","getAttribute","assign","obj","prop","object","to","arg","index","length","nextSource","constructor","Object","nextKey","hasOwnProperty","settings","sa_settings","logSettings","keys","Date","now","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","replace","c","getRandomValues","Uint8Array","toString","error","r","Math","random","isFunction","func","namespaceText","namespace","strictUtm","loadedVariable","sa_event_loaded","timezone","sendData","data","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","Image","src","filter","key","map","join","overwrittenHostname","hostname","definedHostname","basePayload","version","mode","Intl","DateTimeFormat","resolvedOptions","timeZone","bot","ua","protocol","page_id","session_id","sri","mobile","brands","hostname_original","indexOf","lastSendPath","referrer","sendOnLeave","id","push","append","type","original_id","sendBeacon","bind","e","sameSite","userNavigated","getPath","overwrite","path","pathname","sendPageView","isPushState","deleteSourceInfo","search","metadata","ignoreSource","currentPage","query","split","keyValue","RegExp","pages","pathOverwrite","callbackRaw","querySearch","parts","shift","performaceEntryType","perf","performance","navigationText","getEntriesByType","triggerSendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","pageview"],"mappings":"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"} \ No newline at end of file diff --git a/dist/latest/custom/proxy.js b/dist/latest/custom/proxy.js index 67940588..67ce58bf 100644 --- a/dist/latest/custom/proxy.js +++ b/dist/latest/custom/proxy.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy friendly analytics (docs.simpleanalytics.com/script; 2026-08-17; 9e79; v11) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-16; 3faa; v12) */ -!function(l,t,e,n,p){try{var h=undefined,f=!0,d=!1,r="true",a="https:",m="pageview",u="event",i="error",o=l.console,c="doNotTrack",g=l.navigator,s=l.location,v=s.host,y=l.document,_=g.userAgent,w="Not sending request ",b=w+"when ",x=d,E=encodeURIComponent,O=decodeURIComponent,S=JSON.stringify,M=l.addEventListener,k="https://"+e,A=y.documentElement||{},q="language",$="Height",j="scroll",D=g.userAgentData,C=j+$,H="offset"+$,P="client"+$,R="pagehide",T="platform",U="platformVersion",I="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(_)&&!/(cubot)/i.test(_),N=l.screen,z=y.currentScript||y.querySelector('script[src*="'+e+'"]');p=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){p("Error in your "+t+" function:",e)},W=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},G=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},J=function(t,e){return t&&t.getAttribute("data-"+e)},L=function(t){return Array.isArray(t)?t:"string"==typeof t&&t.length?t.split(/, ?/):[]},Y=function(t){return t&&t.constructor===Object},Z=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},rt=function(t){return"function"==typeof t},at="namespace",it=t[at]||J(z,at)||"sa",ot=l[it+"_metadata"],ct=function(t,e){Y(ot)&&(t=Z(t,ot));var n=l[Mt];if(!rt(n))return t;try{return Z(t,n.call(l,Z(t,e)))}catch(r){F("metadata",r)}},st=t.strictUtm||J(z,"strict-utm")==r,ut=function(a){return s.search.slice(1).split("&").filter(function(t){var e=a||!tt("ut"),n=Et.map(G).join("|"),r=e?"^("+n+")=":"^((utm_)"+(st?"":"?")+"(source|medium|content|term|campaign)"+(st?"":"|ref")+"|"+n+")=";return e&&!Et.length?d:new RegExp(r).test(t)}).join("&")||h},lt=it+"_loaded";if(l[lt]==f)return p(w+"twice");l.sa_event_loaded=f,l[lt]=f;var pt=function(e,t,n){e=n?e:Z(qt,Dt,e),g.brave&&!n&&(e.brave=f),g._duckduckgoloader_&&!n&&(e.duck=f);var r=new Image;t&&(r.onerror=t,r.onload=t),r.src=k+"/simple.gif?"+Object.keys(e).filter(function(t){return e[t]!=h}).map(function(t){return E(t)+"="+E(e[t])}).join("&")+"&time="+Date.now()},ht=t.hostname||J(z,"hostname"),ft=ht||v,dt={version:"custom_proxy_11",hostname:ft};n=function(t){t=t.stack?t+" "+t.stack:t,p(t),pt(Z(dt,{type:i,error:t,path:s.pathname}),h,f)},M(i,function(t){t.filename&&-1"); +!function(d,t,e,n,m){try{var v=undefined,g=!0,y=!1,r="true",a="https:",_="pageview",u="event",i="error",o=d.console,c="doNotTrack",w=d.navigator,s=d.location,b=s.host,l=d.document,p=w.userAgent,f="Not sending request ",h=f+"when ",x=y,O=encodeURIComponent,E=decodeURIComponent,S=JSON.stringify,k=d.addEventListener,M="https://"+e,q=l.documentElement||{},A="language",$="Height",j="scroll",D=w.userAgentData,C=j+$,H="offset"+$,P="client"+$,R="pagehide",T="platform",U="platformVersion",I="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),N=d.screen,z=l.currentScript||l.querySelector('script[src*="'+e+'"]');m=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){m("Error in your "+t+" function:",e)},W=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},G=function(t){return"string"==typeof t},J=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},L=function(t,e){return t&&t.getAttribute("data-"+e)},Y=function(t){return Array.isArray(t)?t:G(t)&&t.length?t.split(/, ?/):[]},Z=function(t){return t&&t.constructor===Object},K=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},it=function(t){return"function"==typeof t},ot="namespace",ct=t[ot]||L(z,ot)||"sa",st=function(t,e){var n=d[ct+"_metadata"];Z(n)&&(t=K(t,n));var r=d[Mt];if(!it(r))return Mt&&m(Mt+" not found, set window."+Mt),t;try{return K(t,r.call(d,K(t,e)))}catch(a){F("metadata",a)}},ut=t.strictUtm||L(z,"strict-utm")==r,lt=function(i,t){tt=!i&&nt("q")?"":y;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");tt!==y&&0"); //# sourceMappingURL=proxy.js.map \ No newline at end of file diff --git a/dist/latest/custom/proxy.js.map b/dist/latest/custom/proxy.js.map index 0f4461e7..f859b43f 100644 --- a/dist/latest/custom/proxy.js.map +++ b/dist/latest/custom/proxy.js.map @@ -1 +1 @@ -{"version":3,"file":"proxy.source.js","sources":["proxy.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var metadataObject = window[namespace + \"_metadata\"];\n var appendMetadata = function (metadata, data) {\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) return metadata;\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var getQueryParams = function (ignoreSource) {\n return (\n loc.search\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex).test(keyValue);\n })\n .join(\"&\") || undefinedVar\n );\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n window.phantom ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n return (\n (doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n nav.sendBeacon(fullApiUrl + \"/append\", stringify(append));\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n metadata\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n\n sendData({\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: getQueryParams(deleteSourceInfo),\n\n metadata: stringify(metadata),\n });\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (isPushState, pathOverwrite, metadata) {\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique = isPushState || userNavigated ? falseVar : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n sendPageView(\n isPushState,\n isPushState || userNavigated || !collectMetricByString(\"r\"), // r = referrers\n sameSite,\n metadata\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n else {\n window.sa_pageview = function (path, metadata) {\n pageview(0, path, metadata);\n };\n }\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_proxy_11\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","metadataObject","appendMetadata","metadata","data","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","search","keyValue","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","indexOf","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","bot","webdriver","__nightmare","callPhantom","_phantom","phantom","__polypane","_bot","collectDataOnLeave","ua","protocol","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","i","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","e","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","callbackRaw","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue","q"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"proxy.source.js","sources":["proxy.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_proxy_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","protocol","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue"],"mappings":"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"} \ No newline at end of file diff --git a/dist/latest/hello.js b/dist/latest/hello.js index ba75a8d3..b9dc364b 100644 --- a/dist/latest/hello.js +++ b/dist/latest/hello.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy friendly analytics (docs.simpleanalytics.com/script; 2026-08-17; 016a) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-16; e718) */ -!function(l,t,e,n,p){try{var h=undefined,f=!0,d=!1,r="true",a="https:",m="pageview",u="event",i="error",o=l.console,c="doNotTrack",g=l.navigator,s=l.location,v=s.host,y=l.document,_=g.userAgent,w="Not sending request ",b=w+"when ",E=d,O=encodeURIComponent,x=decodeURIComponent,S=JSON.stringify,M=l.addEventListener,k="https://queue."+e,q=y.documentElement||{},A="language",$="Height",j="scroll",D=g.userAgentData,C=j+$,R="offset"+$,H="client"+$,P="pagehide",T="platform",U="platformVersion",I="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(_)&&!/(cubot)/i.test(_),N=l.screen,z=y.currentScript||y.querySelector('script[src*="'+e+'"]');p=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){p("Error in your "+t+" function:",e)},W=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},G=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},J=function(t,e){return t&&t.getAttribute("data-"+e)},L=function(t){return Array.isArray(t)?t:"string"==typeof t&&t.length?t.split(/, ?/):[]},Y=function(t){return t&&t.constructor===Object},Z=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},rt=function(t){return"function"==typeof t},at="namespace",it=t[at]||J(z,at)||"sa",ot=l[it+"_metadata"],ct=function(t,e){Y(ot)&&(t=Z(t,ot));var n=l[Mt];if(!rt(n))return t;try{return Z(t,n.call(l,Z(t,e)))}catch(r){F("metadata",r)}},st=t.strictUtm||J(z,"strict-utm")==r,ut=function(a){return s.search.slice(1).split("&").filter(function(t){var e=a||!tt("ut"),n=Ot.map(G).join("|"),r=e?"^("+n+")=":"^((utm_)"+(st?"":"?")+"(source|medium|content|term|campaign)"+(st?"":"|ref")+"|"+n+")=";return e&&!Ot.length?d:new RegExp(r).test(t)}).join("&")||h},lt=it+"_loaded";if(l[lt]==f)return p(w+"twice");l.sa_event_loaded=f,l[lt]=f;var pt=function(e,t,n){e=n?e:Z(At,Dt,e),g.brave&&!n&&(e.brave=f),g._duckduckgoloader_&&!n&&(e.duck=f);var r=new Image;t&&(r.onerror=t,r.onload=t),r.src=k+"/simple.gif?"+Object.keys(e).filter(function(t){return e[t]!=h}).map(function(t){return O(t)+"="+O(e[t])}).join("&")+"&time="+Date.now()},ht=t.hostname||J(z,"hostname"),ft=ht||v,dt={version:"cdn_hello_11",hostname:ft};n=function(t){t=t.stack?t+" "+t.stack:t,p(t),pt(Z(dt,{type:i,error:t,path:s.pathname}),h,f)},M(i,function(t){t.filename&&-1>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},it=function(t){return"function"==typeof t},ot="namespace",ct=t[ot]||L(z,ot)||"sa",st=function(t,e){var n=d[ct+"_metadata"];Z(n)&&(t=K(t,n));var r=d[qt];if(!it(r))return qt&&m(qt+" not found, set window."+qt),t;try{return K(t,r.call(d,K(t,e)))}catch(a){F("metadata",a)}},ut=t.strictUtm||L(z,"strict-utm")==r,lt=function(i,t){tt=!i&&nt("q")?"":y;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");tt!==y&&0> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var metadataObject = window[namespace + \"_metadata\"];\n var appendMetadata = function (metadata, data) {\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) return metadata;\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var getQueryParams = function (ignoreSource) {\n return (\n loc.search\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex).test(keyValue);\n })\n .join(\"&\") || undefinedVar\n );\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n window.phantom ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n return (\n (doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n nav.sendBeacon(fullApiUrl + \"/append\", stringify(append));\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n metadata\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n\n sendData({\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: getQueryParams(deleteSourceInfo),\n\n metadata: stringify(metadata),\n });\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (isPushState, pathOverwrite, metadata) {\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique = isPushState || userNavigated ? falseVar : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n sendPageView(\n isPushState,\n isPushState || userNavigated || !collectMetricByString(\"r\"), // r = referrers\n sameSite,\n metadata\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n else {\n window.sa_pageview = function (path, metadata) {\n pageview(0, path, metadata);\n };\n }\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"simpleanalyticscdn.com\",\n \"queue.\",\n \"cdn_hello_11\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","protocol","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","metadataObject","appendMetadata","metadata","data","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","search","keyValue","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","indexOf","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","bot","webdriver","__nightmare","callPhantom","_phantom","phantom","__polypane","_bot","collectDataOnLeave","ua","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","i","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","e","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","callbackRaw","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue","q"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"hello.source.js","sources":["hello.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"simpleanalyticscdn.com\",\n \"queue.\",\n \"cdn_hello_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","protocol","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue"],"mappings":"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"} \ No newline at end of file diff --git a/dist/latest/latest.dev.js b/dist/latest/latest.dev.js index 93496d68..57f7f5dd 100644 --- a/dist/latest/latest.dev.js +++ b/dist/latest/latest.dev.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy friendly analytics (docs.simpleanalytics.com/script; 2026-08-17; 2483; v11) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-16; 4ae9; v12) */ /* eslint-env browser */ (function ( @@ -191,11 +191,17 @@ attr(scriptElement, namespaceText) || defaultNamespace; - var metadataObject = window[namespace + "_metadata"]; var appendMetadata = function (metadata, data) { + var metadataObject = window[namespace + "_metadata"]; if (isObject(metadataObject)) metadata = assign(metadata, metadataObject); var metadataCollectorFunction = window[metadataCollector]; - if (!isFunction(metadataCollectorFunction)) return metadata; + if (!isFunction(metadataCollectorFunction)) { + if (metadataCollector) + warn( + metadataCollector + " not found, set window." + metadataCollector + ); + return metadata; + } try { return assign( metadata, @@ -216,32 +222,40 @@ overwriteOptions.strictUtm || attr(scriptElement, "strict-utm") == trueText; - var getQueryParams = function (ignoreSource) { - return ( - loc.search - .slice(1) - .split("&") - .filter(function (keyValue) { - var ignore = ignoreSource || !collectMetricByString("ut"); - - var paramsRegexList = allowParams.map(filterRegex).join("|"); - var regex = ignore - ? "^(" + paramsRegexList + ")=" - : "^((utm_)" + - (strictUtm ? "" : "?") + - "(source|medium|content|term|campaign)" + - (strictUtm ? "" : "|ref") + - "|" + - paramsRegexList + - ")="; - if (ignore && !allowParams.length) return falseVar; - - // The prefix "utm_" is optional with "strictUtm" disabled - // "ref" is only collected when "strictUtm" is disabled - return new RegExp(regex).test(keyValue); - }) - .join("&") || undefinedVar - ); + var k; + + var getQueryParams = function (ignoreSource, overwriteSearch) { + k = !ignoreSource && collectMetricByString("q") ? "" : falseVar; + var q = (overwriteSearch || loc.search) + .slice(1) + .split("&") + .filter(function (keyValue) { + var i = keyValue.indexOf("="); + if (k !== falseVar && i > 0 && keyValue.slice(i + 1)) + k += (k ? "," : "") + keyValue.slice(0, i); + + var ignore = ignoreSource || !collectMetricByString("ut"); + + var paramsRegexList = allowParams.map(filterRegex).join("|"); + var regex = ignore + ? "^(" + paramsRegexList + ")=" + : "^((utm_)" + + (strictUtm ? "" : "?") + + "(source|medium|content|term|campaign)" + + (strictUtm ? "" : "|ref") + + "|" + + paramsRegexList + + ")="; + if (ignore && !allowParams.length) return falseVar; + + // The prefix "utm_" is optional with "strictUtm" disabled + // "ref" is only collected when "strictUtm" is disabled + return new RegExp(regex, "i").test(keyValue); + }) + .join("&"); + + k = k || undefinedVar; + return q || undefinedVar; }; // Ignore pages specified in data-ignore-pages @@ -432,12 +446,13 @@ // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS // + var phantom = window.phantom; var bot = nav.webdriver || window.__nightmare || window.callPhantom || window._phantom || - window.phantom || + (phantom && !phantom.solana) || window.__polypane || window._bot || isBotAgent || @@ -512,8 +527,12 @@ var lastSendPath; var getReferrer = function () { + // Customers can overwrite their referrer, here we check for that + var overwrittenReferrer = + overwriteOptions.referrer || attr(scriptElement, "referrer"); + return ( - (doc.referrer || "") + (overwrittenReferrer || doc.referrer || "") .replace(locationHostname, definedHostname) .replace(/^https?:\/\/((m|l|w{2,3}([0-9]+)?)\.)?([^?#]+)(.*)$/, "$4") .replace(/^([^/]+)$/, "$1") || undefinedVar @@ -554,7 +573,12 @@ // sendData will assign payload to request sendData(append, undefinedVar, trueVar); } else { - nav.sendBeacon(fullApiUrl + "/append", stringify(append)); + try { + nav.sendBeacon.bind(nav)(fullApiUrl + "/append", stringify(append)); + } catch (e) { + // Fallback for browsers throwing "Illegal invocation" when the URL is invalid + sendData(append, undefinedVar, trueVar); + } } }; @@ -651,21 +675,28 @@ isPushState, deleteSourceInfo, sameSite, - metadata + search, + metadata, + callback ) { if (isPushState) sendOnLeave("" + payload.page_id, trueVar); if (collectDataOnLeave) payload.page_id = uuid(); var currentPage = definedHostname + getPath(); + var query = getQueryParams(deleteSourceInfo, search); - sendData({ - id: payload.page_id, - type: pageviewText, - referrer: !deleteSourceInfo || sameSite ? referrer : null, - query: getQueryParams(deleteSourceInfo), - - metadata: stringify(metadata), - }); + sendData( + { + id: payload.page_id, + type: pageviewText, + referrer: !deleteSourceInfo || sameSite ? referrer : null, + query: query, + k: k, + + metadata: stringify(metadata), + }, + callback + ); previousReferrer = referrer; referrer = currentPage; @@ -675,7 +706,21 @@ var sameSite, userNavigated; - var pageview = function (isPushState, pathOverwrite, metadata) { + var pageview = function ( + isPushState, + pathOverwrite, + metadata, + callbackRaw + ) { + if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata; + var callback = isFunction(callbackRaw) ? callbackRaw : function () {}; + var querySearch; + if (isString(pathOverwrite) && pathOverwrite.indexOf("?") > -1) { + // keep query from manual path + var parts = pathOverwrite.split("?"); + pathOverwrite = parts.shift(); + querySearch = "?" + parts.join("?"); + } // Obfuscate personal data in URL by dropping the search and hash var path = getPath(pathOverwrite); @@ -738,7 +783,10 @@ : falseVar; // We set unique variable based on pushstate or back navigation, if no match we check the referrer - page.unique = isPushState || userNavigated ? falseVar : !sameSite; + page.unique = + /__cf_/.test(getReferrer()) || isPushState || userNavigated + ? falseVar + : !sameSite; metadata = appendMetadata(metadata, { type: pageviewText, @@ -747,11 +795,15 @@ var triggerSendPageView = function () { fetchedHighEntropyValues = trueVar; + var delSrc = + isPushState || userNavigated || !collectMetricByString("r"); sendPageView( isPushState, - isPushState || userNavigated || !collectMetricByString("r"), // r = referrers + delSrc, // r = referrers sameSite, - metadata + querySearch, + metadata, + callback ); }; @@ -841,11 +893,11 @@ } if (autoCollect) pageview(); - else { - window.sa_pageview = function (path, metadata) { - pageview(0, path, metadata); - }; - } + + window.sa_pageview = function (path, metadata, callback) { + pageview(0, path, metadata, callback); + }; + ///////////////////// // EVENTS @@ -938,6 +990,6 @@ {}, "simpleanalyticscdn.com", "queue.", - "cdn_latest_dev_11", + "cdn_latest_dev_12", "sa" ); diff --git a/dist/latest/latest.js b/dist/latest/latest.js index 555b6282..d4e8c8eb 100644 --- a/dist/latest/latest.js +++ b/dist/latest/latest.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy friendly analytics (docs.simpleanalytics.com/script; 2026-08-17; 3761; v11) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-16; dbab; v12) */ -!function(l,t,e,n,p){try{var h=undefined,f=!0,d=!1,r="true",a="https:",m="pageview",u="event",i="error",o=l.console,c="doNotTrack",g=l.navigator,s=l.location,v=s.host,y=l.document,_=g.userAgent,w="Not sending request ",b=w+"when ",E=d,O=encodeURIComponent,x=decodeURIComponent,S=JSON.stringify,M=l.addEventListener,k="https://queue."+e,q=y.documentElement||{},A="language",$="Height",j="scroll",D=g.userAgentData,C=j+$,R="offset"+$,H="client"+$,P="pagehide",T="platform",U="platformVersion",I="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(_)&&!/(cubot)/i.test(_),N=l.screen,z=y.currentScript||y.querySelector('script[src*="'+e+'"]');p=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){p("Error in your "+t+" function:",e)},W=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},G=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},J=function(t,e){return t&&t.getAttribute("data-"+e)},L=function(t){return Array.isArray(t)?t:"string"==typeof t&&t.length?t.split(/, ?/):[]},Y=function(t){return t&&t.constructor===Object},Z=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},rt=function(t){return"function"==typeof t},at="namespace",it=t[at]||J(z,at)||"sa",ot=l[it+"_metadata"],ct=function(t,e){Y(ot)&&(t=Z(t,ot));var n=l[Mt];if(!rt(n))return t;try{return Z(t,n.call(l,Z(t,e)))}catch(r){F("metadata",r)}},st=t.strictUtm||J(z,"strict-utm")==r,ut=function(a){return s.search.slice(1).split("&").filter(function(t){var e=a||!tt("ut"),n=Ot.map(G).join("|"),r=e?"^("+n+")=":"^((utm_)"+(st?"":"?")+"(source|medium|content|term|campaign)"+(st?"":"|ref")+"|"+n+")=";return e&&!Ot.length?d:new RegExp(r).test(t)}).join("&")||h},lt=it+"_loaded";if(l[lt]==f)return p(w+"twice");l.sa_event_loaded=f,l[lt]=f;var pt=function(e,t,n){e=n?e:Z(At,Dt,e),g.brave&&!n&&(e.brave=f),g._duckduckgoloader_&&!n&&(e.duck=f);var r=new Image;t&&(r.onerror=t,r.onload=t),r.src=k+"/simple.gif?"+Object.keys(e).filter(function(t){return e[t]!=h}).map(function(t){return O(t)+"="+O(e[t])}).join("&")+"&time="+Date.now()},ht=t.hostname||J(z,"hostname"),ft=ht||v,dt={version:"cdn_latest_11",hostname:ft};n=function(t){t=t.stack?t+" "+t.stack:t,p(t),pt(Z(dt,{type:i,error:t,path:s.pathname}),h,f)},M(i,function(t){t.filename&&-1>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},it=function(t){return"function"==typeof t},ot="namespace",ct=t[ot]||L(z,ot)||"sa",st=function(t,e){var n=d[ct+"_metadata"];Z(n)&&(t=K(t,n));var r=d[qt];if(!it(r))return qt&&m(qt+" not found, set window."+qt),t;try{return K(t,r.call(d,K(t,e)))}catch(a){F("metadata",a)}},ut=t.strictUtm||L(z,"strict-utm")==r,lt=function(i,t){tt=!i&&nt("q")?"":y;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");tt!==y&&0> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var metadataObject = window[namespace + \"_metadata\"];\n var appendMetadata = function (metadata, data) {\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) return metadata;\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var getQueryParams = function (ignoreSource) {\n return (\n loc.search\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex).test(keyValue);\n })\n .join(\"&\") || undefinedVar\n );\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n window.phantom ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n return (\n (doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n nav.sendBeacon(fullApiUrl + \"/append\", stringify(append));\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n metadata\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n\n sendData({\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: getQueryParams(deleteSourceInfo),\n\n metadata: stringify(metadata),\n });\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (isPushState, pathOverwrite, metadata) {\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique = isPushState || userNavigated ? falseVar : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n sendPageView(\n isPushState,\n isPushState || userNavigated || !collectMetricByString(\"r\"), // r = referrers\n sameSite,\n metadata\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n else {\n window.sa_pageview = function (path, metadata) {\n pageview(0, path, metadata);\n };\n }\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"simpleanalyticscdn.com\",\n \"queue.\",\n \"cdn_latest_11\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","protocol","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","metadataObject","appendMetadata","metadata","data","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","search","keyValue","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","indexOf","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","bot","webdriver","__nightmare","callPhantom","_phantom","phantom","__polypane","_bot","collectDataOnLeave","ua","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","i","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","e","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","callbackRaw","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue","q"],"mappings":";;CAEA,SACEA,EACAC,EACAC,EAIAC,EACAC,GAEA,IAQE,IAAIC,EAAeC,UACfC,GAAU,EACVC,GAAW,EACXC,EAAW,OACXC,EAAQ,SACRC,EAAe,WACfC,EAAY,QACZC,EAAY,QAGZC,EAAMd,EAAOe,QACbC,EAAa,aACbC,EAAMjB,EAAOkB,UACbC,EAAMnB,EAAOoB,SACbC,EAAmBF,EAAIG,KACvBC,EAAMvB,EAAOwB,SACbC,EAAYR,EAAIQ,UAChBC,EAAa,uBACbC,EAAiBD,EAAa,QAC9BE,EAA2BpB,EAC3BqB,EAAyBC,mBACzBC,EAAyBC,mBACzBC,EAAYC,KAAKD,UAEjBE,EAAuBnC,EAAOoC,iBAC9BC,EAAaC,iBAA0BpC,EACvCqC,EAAkBhB,EAAIgB,iBAAmB,GACzCC,EAAW,WACXC,EAAS,SAETC,EAAS,SACTC,EAAS1B,EAAI2B,cACbC,EAAeH,EAASD,EACxBK,EAAe,SAAWL,EAC1BM,EAAe,SAAWN,EAE1BO,EAAW,WACXC,EAAe,WACfC,EAAsB,kBACtBC,EAAU,mCACVC,EAAQ,EACRC,EACF,sBAAsBC,KAAK7B,KAAe,WAAW6B,KAAK7B,GACxD8B,EAASvD,EAAOuD,OAIhBC,EACFjC,EAAIkC,eAAiBlC,EAAImC,cAAc,gBAAkBxD,EAAU,MAOrEE,EAAO,WAEL,IAAIuD,EAAO,GAAGC,MAAMC,KAAKC,WAOzB,OAJAH,EAAKI,QAAQ,qBAINC,SAASC,UAAUC,MAAML,KAAK/C,EAAIV,KAAMU,EAAK6C,IAGtD,IAAIQ,EAAiB,SAAUC,EAAMC,GACnCjE,EAAK,iBAAmBgE,EAAO,aAAcC,IAG3CC,EAAU,SAAUC,EAAKC,GAC3B,OAAOC,OAAOR,UAAUS,eAAeb,KAAKU,EAAKC,IAO/CG,EAAc,SAAUC,GAC1B,OAAOA,EAAKC,QAAQ,sBAAuB,SAGzCC,EAAO,SAAUtB,EAAeuB,GAClC,OAAOvB,GAAiBA,EAAcwB,aAAa,QAAUD,IAG3DE,EAA+B,SAAUC,GAC3C,OAAOC,MAAMC,QAAQF,GACjBA,EAboB,iBAcXA,GAAQA,EAAIG,OACnBH,EAAII,MAAM,OACV,IAGJC,EAAW,SAAUC,GACvB,OAAOA,GAAUA,EAAOC,cAAgBhB,QAGtCiB,EAAS,WAGX,IAFA,IAAIC,EAAK,GACLC,EAAM9B,UACD+B,EAAQ,EAAGA,EAAQD,EAAIP,OAAQQ,IAAS,CAC/C,IAAIC,EAAaF,EAAIC,GACrB,GAAIN,EAASO,GACX,IAAK,IAAIC,KAAWD,EACdxB,EAAQwB,EAAYC,KACtBJ,EAAGI,GAAWD,EAAWC,IAKjC,OAAOJ,GAGLK,EAAWhG,EAAOiG,YAClBC,EAAcF,GAAYvB,OAAO0B,KAAKlG,GAAkBoF,OAG5DpF,EAAmByF,EAAOzF,EAAkB+F,GAExCE,GAAa9F,EAAK,WAAYH,GAGlC,IAAImG,EAAgBnB,EAClBhF,EAAiBmG,eAAiBtB,EAAKtB,EAAe,mBAGpD6C,GAAwB,SAAUC,GAEpC,OAGgB,IAFdF,EAAcG,OAAO,SAAU3B,GAC7B,OAAO,IAAI4B,OAAO,IAAMF,GAAoBhD,KAAKsB,KAChDS,QAIHoB,GAAMC,KAAKD,IAEXE,GAAO,WACT,IAAIC,EAAe5G,EAAO6G,QAAU7G,EAAO8G,SACvCC,EAAY,CAAC,MAAQ,KAAO,KAAO,KAAO,KAC1CC,EAAY,SAEhB,IACE,OAAOD,EAAUlC,QAAQmC,EAAW,SAAUC,GAC5C,OACEA,EACCL,EAAaM,gBAAgB,IAAIC,WAAW,IAAI,GAC9C,IAAOF,EAAI,GACdG,SAAS,MAEb,MAAO/C,GACP,OAAO0C,EAAUlC,QAAQmC,EAAW,SAAUC,GAC5C,IAAII,EAAqB,GAAhBC,KAAKC,SAAiB,EAE/B,OADMN,EAAI,EAAII,EAAS,EAAJA,EAAW,GACrBD,SAAS,QAKpBI,GAAa,SAAUC,GACzB,MAAsB,mBAARA,GAIZC,GAAgB,YAChBC,GACF1H,EAAiByH,KACjB5C,EAAKtB,EAAekE,KA6uBxB,KA1uBME,GAAiB5H,EAAO2H,GAAY,aACpCE,GAAiB,SAAUC,EAAUC,GACnCxC,EAASqC,MAAiBE,EAAWpC,EAAOoC,EAAUF,KAC1D,IAAII,EAA4BhI,EAAOiI,IACvC,IAAKT,GAAWQ,GAA4B,OAAOF,EACnD,IACE,OAAOpC,EACLoC,EACAE,EAA0BnE,KAAK7D,EAAQ0F,EAAOoC,EAAUC,KAE1D,MAAO1D,GACPF,EAAe,WAAYE,KAU3B6D,GACFjI,EAAiBiI,WACjBpD,EAAKtB,EAAe,eAAiB/C,EAEnC0H,GAAiB,SAAUC,GAC7B,OACEjH,EAAIkH,OACDzE,MAAM,GACN0B,MAAM,KACNiB,OAAO,SAAU+B,GAChB,IAAIC,EAASH,IAAiB/B,GAAsB,MAEhDmC,EAAkBC,GAAYC,IAAI/D,GAAagE,KAAK,KACpDC,EAAQL,EACR,KAAOC,EAAkB,KACzB,YACCN,GAAY,GAAK,KAClB,yCACCA,GAAY,GAAK,QAClB,IACAM,EACA,KACJ,OAAID,IAAWE,GAAYpD,OAAe7E,EAInC,IAAIgG,OAAOoC,GAAOtF,KAAKgF,KAE/BK,KAAK,MAAQtI,GAgChBwI,GAAiBlB,GAAY,UACjC,GAAI3H,EAAO6I,KAAmBtI,EAAS,OAAOH,EAAKsB,EAAa,SAChE1B,EAAO8I,gBAAkBvI,EACzBP,EAAO6I,IAAkBtI,EAOzB,IAAIwI,GAAW,SAAUhB,EAAMiB,EAAUC,GACvClB,EAAOkB,EAAelB,EAAOrC,EAAOwD,GAASC,GAAMpB,GAE/C9G,EAAImI,QAAUH,IAAclB,EAAKqB,MAAQ7I,GACzCU,EAAIoI,qBAAuBJ,IAAclB,EAAKuB,KAAO/I,GAGzD,IAAIgJ,EAAQ,IAAIC,MACZR,IACFO,EAAME,QAAUT,EAChBO,EAAMG,OAASV,GAEjBO,EAAMI,IACJtH,EACA,eACAoC,OAAO0B,KAAK4B,GACTxB,OAAO,SAAUqD,GAChB,OAAO7B,EAAK6B,IAAQvJ,IAErBqI,IAAI,SAAUkB,GACb,OACE/H,EAAuB+H,GACvB,IACA/H,EAAuBkG,EAAK6B,MAG/BjB,KAAK,KACR,SACAjC,KAAKD,OAILoD,GACF5J,EAAiB6J,UAAYhF,EAAKtB,EAAe,YAC/CuG,GAAkBF,IAAuBxI,EAEzC2I,GAAc,CAChBC,QAymBJ,gBAxmBIH,SAAUC,IASZ5J,EAAY,SAAU+J,GACpBA,EAAiBA,EAAeC,MAC5BD,EAAiB,IAAMA,EAAeC,MACtCD,EACJ9J,EAAK8J,GACLnB,GACErD,EAAOsE,GAAa,CAClBI,KAAMvJ,EACNwD,MAAO6F,EACPG,KAAMlJ,EAAImJ,WAEZjK,EACAE,IAMJ4B,EACEtB,EACA,SAAU0J,GACJA,EAAMC,WAA+C,EAAnCD,EAAMC,SAASC,QAAQvK,IAC3CC,EAAUoK,EAAMG,UAGpBlK,GAOF,IAwDImK,GAxDAC,GAAQnE,KAERoE,GAAW,EAOXC,GAAO7K,EAAiB6K,MAAQhG,EAAKtB,EAAe,QAGpDuH,MAvKsBC,GAuKC/K,EAAiB8K,cAtKvBC,GAuKjB/K,EAAiB8K,WACjBjG,EAAKtB,EAAe,eAAiB/C,GACrCqE,EAAKtB,EAAe,aAAe/C,GACnCqE,EAAKtB,EAAe,gBAAkB/C,EAGtCwK,KACqC,SAAvCnG,EAAKtB,EAAe,iBACpBvD,EAAiBgL,cAAgBzK,GAI/B0K,GACFjL,EAAiBkL,UACjBrG,EAAKtB,EAAe,cACpBmE,GAAY,IAAM/G,EAGhBwK,GAAcnG,EAChBhF,EAAiBmL,aAAetG,EAAKtB,EAAe,iBAIlDiF,GAAcxD,EAChBhF,EAAiBwI,aAAe3D,EAAKtB,EAAe,iBAIlD6H,GAAqBpG,EACvBhF,EAAiBoL,oBACfvG,EAAKtB,EAAe,yBAIpB8H,GACFrL,EAAiBqL,gBAAkBxG,EAAKtB,EAAe,mBAGrDyE,GACFhI,EAAiBgI,mBACjBnD,EAAKtB,EAAe,sBAItB,IAEEmH,GAAWtE,GAAsB,KAC7BkF,KAAKC,iBAAiBC,kBAAkBC,SACxCrL,EACJ,MAAOgE,IACPjE,EAAKiE,IAOP,IAAIsH,GACF1K,EAAI2K,WACJ5L,EAAO6L,aACP7L,EAAO8L,aACP9L,EAAO+L,UACP/L,EAAOgM,SACPhM,EAAOiM,YACPjM,EAAOkM,MACP7I,GACAiE,KAAKC,UAAYD,KAAKC,SAGpB4E,GACF9F,GAAsB,MAAQA,GAAsB,QAElDsF,KAAK3B,GAAY2B,IAAMpL,GAE3B,IAAI2I,GAAUxD,EAAOsE,GAAa,CAEhCoC,GAAI/F,GAAsB,MAAQ5E,EAAYpB,EAE9CK,MAAOS,EAAImB,UAAY5B,EACvBiK,SAAUA,GACV0B,QAASF,GAAqBxF,KAAStG,EAGvCiM,WAAYjG,GAAsB,MAAQM,KAAStG,IA0BrD,GAvBA6I,GAAQqD,IAAM/L,EAIVmC,IACFuG,GAAQsD,OAAS7J,EAAO6J,OACxBtD,GAAQuD,OAASxK,EAAUU,EAAO8J,SAS/BlL,EAAImL,SAAStM,EAAK,4CAInB2J,KAAoB1I,IACtB6H,GAAQyD,kBAAoBtL,IAGzB0J,IAAc/J,KAAcC,GAA0B,KAAnBA,EAAID,GAC1C,OAAOZ,EACLuB,EAAiBX,EAAa,oBAAsBmC,EAAU,SAK7B,GAAlC9B,EAAiBoJ,QAAQ,OACxB,aAAanH,KAAKjC,IACnBwI,IAEDzJ,EACE,mBACEiB,EACA,SACA8B,EACA,0BAON,IACIyJ,GAiDAC,GAlDA1D,GAAO,GAaP2D,IARCvL,EAAIuL,UAAY,IACdjI,QAAQxD,EAAkB0I,IAC1BlF,QAAQ,sDAAuD,MAC/DA,QAAQ,YAAa,OAASxE,EAYjC0M,GAAW,EAEXC,GAAc,SAAUC,EAAIC,GAC9B,IAEIC,EAFChB,KAEDgB,EAASzH,EAAOsE,GAAa,CAC/BI,KAAM,SACNgD,YAAaF,EAAOD,EAAK/D,GAAQmD,UAI/BhG,GAAsB,OACxB8G,EAAOE,SAAW/F,KAAKgG,OAAO7G,KAAQmE,GAAQmC,IAhfnC,MAkfbA,GAAW,EACXnC,GAAQnE,KAGJJ,GAAsB,UACxB8G,EAAOtC,SAAWvD,KAAKiG,IAAI,EAAG1C,GAAU2C,OAGtCN,IAASjM,EAAIwM,WAEf1E,GAASoE,EAAQ9M,EAAcE,GAE/BU,EAAIwM,WAAWpL,EAAa,UAAWJ,EAAUkL,MAKrDhL,EACE,mBACA,WACMZ,EAAImM,QACA,KAAO1K,KAAYhD,GAASgN,KAClCH,GAAcpG,MACTsG,IAAYtG,KAAQoG,IAE7BrM,GAGF2B,EAAqBa,EAAUgK,GAAaxM,GAE5C,IAAImN,GAAOpM,EAAIoM,MAAQ,GACnBH,GAAW,WACb,IACE,IAAII,EAAuBrL,EAAgBQ,IAAiB,EACxD8K,EAASvG,KAAKiG,IAChBI,GAAK9K,IAAiB,EACtB8K,GAAK7K,IAAiB,EACtBP,EAAgBQ,IAAiB,EACjCR,EAAgBM,IAAiB,EACjCN,EAAgBO,IAAiB,GAEnC,OAAOwE,KAAKwG,IACV,IAKI,EAJJxG,KAAKgG,MACF,MAAQ/K,EAAgBwL,WAAa,GAAKH,GACzCC,EACA,IAGN,MAAOxJ,IAEP,OADAjE,EAAKiE,IACE,IAIXlC,EAAqB,OAAQ,WAC3B0I,GAAW2C,KACXrL,EACEO,EACA,WACMmI,GAAW2C,OAAY3C,GAAW2C,OAExChN,KAQJ,IAgCIwN,GA6BAC,GAAUC,GA7DVC,GAAU,SAAUC,GACtB,IAAI/D,EAAO,GAIX,IACEA,EAAO+D,GAAarM,EAAuBZ,EAAImJ,UAC/C,MAAOjG,IACPjE,EAAKiE,IAGP,IAAIgK,EAAyBrO,EAAOsL,IACpC,GAAI9D,GAAW6G,GACb,IACEhE,EAAOgE,EAAuBxK,KAAK7D,EAAQ,CAAEqK,KAAMA,KAAWA,EAC9D,MAAOhG,IACPF,EAAe,OAAQE,IAK3B,IAlYiB,SAAUgG,GAC3B,IAAK,IAAIiE,KAAKlD,GAAa,CACzB,IAAImD,EAAgBnD,GAAYkD,GAChC,GAAKC,EAAL,CAGA,IAAIC,EAhOI,KAiOND,EAAc,GAAcA,EAjOtB,IAiO8CA,EAEtD,GACEC,IAAenE,GACf,IAAI7D,OACF,IAAM7B,EAAY6J,GAAY3J,QAAQ,SAAU,QAAU,IAC1D,KACAvB,KAAK+G,GAEP,OAAO9J,GAEX,OAAOC,EAgXHiO,CAAapE,GAQjB,MAFY,QAARS,IAAkB3J,EAAIuN,OAAMrE,GAAQlJ,EAAIuN,KAAKpJ,MAAM,KAAK,IAErD+E,EAPLjK,EAAKuB,EAAiB,YAAc0I,IAyCpCsE,GAAW,SAAUC,EAAaC,EAAe/G,GAEnD,IAAIuC,EAAO8D,GAAQU,GAGnB,GAAKxE,GAAQuC,IAAgBvC,EAA7B,CAEAuC,GAAevC,EACflB,GAAKkB,KAAOA,EAGRhE,GAAsB,OACxB8C,GAAK2F,eACHxH,KAAKiG,IAAIhL,EAA2B,aAAK,EAAGvC,EAAO+O,YAAc,IACjE,KACF5F,GAAK6F,gBACH1H,KAAKiG,IACHhL,EAAgBQ,IAAiB,EACjC/C,EAAOiP,aAAe,IACnB,MAIL5I,GAAsB,MACpBpF,EAAIuB,KAAW2G,GAAK3G,GAAYvB,EAAIuB,IAItCe,GAAU8C,GAAsB,QAClC8C,GAAK+F,aAAe3L,EAAO4L,MAC3BhG,GAAKiG,cAAgB7L,EAAOsK,QAI9B,IAIIwB,EAJAC,EAAOtP,EAAOuP,YACdC,EAAiB,aAIrB,IACEH,EAAsBC,EAAKG,iBAAiBD,GAAgB,GAAGpF,KAC/D,MAAO/F,IACPjE,EAAKiE,IAGP6J,GAAgBmB,GAC+C,EAA3D,CAAC,SAAU,gBAAgB5E,QAAQ4E,GAGnCC,GACAA,EAAKE,KACwC,EAA7C,CAAC,EAAG,GAAG/E,QAAQ6E,EAAKE,GAAgBpF,MAGxC,IAAIsF,EAA0B5C,GAC1BA,GAASxH,MA7rBH,KA6rBgB,GACtBjF,EACJ4N,GAAWnB,IACgD,EAAvDzB,GAAmBZ,QAAQiF,IAC3BA,GAA2BrO,EAC3Bb,EAGJ2I,GAAKwG,OAASf,GAAeV,GAAgB1N,GAAYyN,GAEzDnG,EAAWD,GAAeC,EAAU,CAClCsC,KAAMzJ,EACN0J,KAAMlB,GAAKkB,OAGb,IAAIuF,EAAsB,WACxBhO,EAA2BrB,EAnGZ,SACjBqO,EACAiB,EACA5B,EACAnG,GAEI8G,GAAa5B,GAAY,GAAK9D,GAAQmD,QAAS9L,GAC/C4L,KAAoBjD,GAAQmD,QAAU1F,MAE1C,IAAImJ,EAAc/F,GAAkBoE,KAEpCpF,GAAS,CACPkE,GAAI/D,GAAQmD,QACZjC,KAAMzJ,EACNmM,UAAW+C,GAAoB5B,EAAWnB,GAAW,KACrDiD,MAAO5H,GAAe0H,GAEtB/H,SAAU7F,EAAU6F,KAGtBkG,GAAmBlB,GACnBA,GAAWgD,EAEX1M,IA6EE4M,CACEpB,EACAA,GAAeV,KAAkB7H,GAAsB,KACvD4H,GACAnG,IAIJ,GAAKlG,EAmBHgO,SAjBA,IACMjN,GAAU6E,GAAW7E,EAAOsN,sBAC9BtN,EACGsN,qBAAqB,CAAChN,EAAcC,IACpCgN,KAAK,SAAUC,GACdjH,GAAQkH,QAAUD,EAAkBlN,GACpCiG,GAAQmH,WAAaF,EAAkBjN,GACvC0M,MAEDU,SAAMV,GAETA,IAEF,MAAOW,GACPX,OAWFY,GAAMxQ,EAAOyQ,QACbC,GAAeF,GAAMA,GAAIG,UAAYtQ,EACrCuQ,GAAM5Q,EAAO6Q,cACbC,GAAgB,YAIhB7F,IAAeyF,IAAgBK,OAASH,KAqB1CJ,GAAIG,WAnBEK,GAAOR,GADiBpG,GAoBA0G,IAlBrB,WACL,IAEIvG,EAFA3E,EAAM9B,UACNmN,EAAKD,GAAK9M,MAAMgN,KAAMtL,GAY1B,OAVI4B,GAAWuJ,OACbxG,EAAQ,IAAIwG,MAAM3G,KAIlBG,EAAQhJ,EAAI4P,YAAY,UAClBC,UAAUhH,GAAM7J,EAASA,GAEjCgK,EAAMzG,UAAY8B,EAClBgL,GAAIrG,GACG0G,IAMX9O,EACE2O,GACA,WACEnC,GAAS,IAEXnO,GAGF2B,EACE,WACA,WACEwM,GAAS,IAEXnO,IAKAyK,IAAuB,QAARH,IAAkB,iBAAkB9K,GACrDmC,EACE,aACA,WACEwM,GAAS,IAEXnO,GAIAyK,GAAa0D,KAEf3O,EAAOqR,YAAc,SAAUhH,EAAMvC,GACnC6G,GAAS,EAAGtE,EAAMvC,IAQtB,IAAIwJ,GAAa,CAAC,SAAU,UAExBC,GAAY,SAAUhH,EAAOzC,EAAU0J,IACpCA,GAAehK,GAAWM,KAAW0J,EAAc1J,GAExD,IAAI2J,EAAkBjK,GAAW+C,GAC7BvB,EAAWxB,GAAWgK,GAAeA,EAAc,aACnDE,SAAmBnH,EAEvB,GAAI+G,GAAW7G,QAAQiH,GAAa,IAAMD,EAExC,OADAtN,EAAe+G,GAAmBtK,EAAY,aAAe8Q,GACtD1I,IAGT,IACE,GAAIyI,EAAiB,CACnB,IAAIE,EAAcpH,IAClB,GAAI+G,GAAW7G,eAAekH,GAAe,EAK3C,OAJAxN,EACE+G,GACAX,EAAQ,uBAAyBoH,GAE5B3I,IAETuB,EAAQoH,GAEV,MAAOtN,IAEP,OADAF,EAAe+G,GAAmB7G,IAC3B2E,IAGTuB,GAAS,GAAKA,GAAO1F,QAAQ,eAAgB,KAAKA,QAAQ,WAAY,IAEtE,IAAI+M,EAAc,CAAExH,KAAMxJ,EAAW2J,MAAOA,GACxCsH,GAAa3D,IAAiB9K,EAAQ,EAE1C0E,EAAWD,GAAeC,EAAU8J,GAEhCrH,GACFxB,GACErD,EAAOkM,EAAa,CAClB3E,GAAItG,KACJoJ,MAAO5H,IAAgB0J,GACvB/E,UACG+E,GAAa5D,KAAa5H,GAAsB,KAC7C2H,GACA,KAENlG,SAAU7F,EAAU6F,KAEtBkB,IAKF8I,GAAmB,SAAUvH,EAAOzC,EAAUkB,GAChDuI,GAAUhH,EAAOzC,EAAUkB,IAIxBhJ,EAAOkL,MACVlL,EAAOkL,IAAqB4G,IAE9B,IAAIC,GAAY/R,EAAOkL,IAGnB8G,GAAQD,IAAaA,GAAUE,EAAIF,GAAUE,EAAI,GAMrD,IAAK,IAAI1H,MAHTvK,EAAOkL,IAAqB4G,GAGVE,GACZ1N,EAAQ0N,GAAOzH,MACjBpF,MAAMC,QAAQ4M,GAAMzH,KAChBgH,GAAUrN,MAAM,KAAM8N,GAAMzH,KAC5BgH,GAAUS,GAAMzH,MAGxB,MAAOgG,IACPpQ,EAAUoQ,IA7IY,IAAUnG,GACxB4G,GAvkBkBhG,GA7M9B,CAm6BEhL,OACA,uBACA"} \ No newline at end of file +{"version":3,"file":"latest.source.js","sources":["latest.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"simpleanalyticscdn.com\",\n \"queue.\",\n \"cdn_latest_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","protocol","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue"],"mappings":"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"} \ No newline at end of file diff --git a/dist/latest/light.js b/dist/latest/light.js index 12325346..8f61160b 100644 --- a/dist/latest/light.js +++ b/dist/latest/light.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy friendly analytics (docs.simpleanalytics.com/script; 2026-08-17; 630c; v11) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-16; 5f98; v12) */ -!function(s,e,t,u){try{var i=undefined,n="https:",r=s.console,a="doNotTrack",p=s.navigator,c=s.location,d=c.host,o=s.document,l=p.userAgent,m="Not sending request ",f=!1,g=encodeURIComponent,h=decodeURIComponent,v=JSON.stringify,y=s.addEventListener,_="https://queue."+t,w=(o.documentElement,"language"),b=p.userAgentData,O="platform",S="platformVersion",k="https://docs.simpleanalytics.com",j=/(bot|spider|crawl)/i.test(l)&&!/(cubot)/i.test(l),E=o.currentScript||o.querySelector('script[src*="'+t+'"]');u=function(){var e=[].slice.call(arguments);return e.unshift("Simple Analytics:"),Function.prototype.apply.call(r.warn,r,e)};var q=function(e,t){return e&&e.getAttribute("data-"+t)},A=function(){for(var e,t,n,r={},a=arguments,o=0;o>e/4).toString(16)})}catch(r){return e.replace(n,function(e){var t=16*Math.random()|0;return(e<2?t:3&t|8).toString(16)})}},I="namespace",N=e[I]||q(E,I)||"sa",R=e.strictUtm||"true"==q(E,"strict-utm"),U=N+"_loaded";if(1==s[U])return u(m+"twice");s.sa_event_loaded=!0,s[U]=!0;var V,B=function(t,e,n){t=n?t:A(H,J,t),p.brave&&!n&&(t.brave=!0),p._duckduckgoloader_&&!n&&(t.duck=!0),(new Image).src=_+"/simple.gif?"+Object.keys(t).filter(function(e){return t[e]!=i}).map(function(e){return g(e)+"="+g(t[e])}).join("&")+"&time="+Date.now()},C=e.hostname||q(E,"hostname"),T=C||d,F={version:"cdn_light_11",hostname:T};e.mode||q(E,"mode");try{V=Intl.DateTimeFormat().resolvedOptions().timeZone}catch(Q){u(Q)}j&&(F.bot=!0);var H=A(F,{ua:l,https:c.protocol==n,timezone:V,page_id:D(),session_id:D()});if(H.sri=!1,b&&(H.mobile=b.mobile,H.brands=v(b.brands)),T!==d&&(H.hostname_original=d),a in p&&"1"==p[a])return u("Not sending request when "+a+" is enabled. See "+k+"/dnt");-1!=d.indexOf(".")&&!/^[0-9.:]+$/.test(d)||C||u("Set hostname on "+d+". See "+k+"/overwrite-domain-name");var z,J={},L=(o.referrer||"").replace(d,T).replace(/^https?:\/\/((m|l|w{2,3}([0-9]+)?)\.)?([^?#]+)(.*)$/,"$4").replace(/^([^/]+)$/,"$1")||i,M=function(e,t){var n=A(F,{type:"append",original_id:t?e:H.page_id});t||!p.sendBeacon?B(n,0,!0):p.sendBeacon(_+"/append",v(n))};y("pagehide",M,!1);var P,Z,G=function(e){var t="";try{t=e||h(c.pathname)}catch(Q){u(Q)}return t},K=function(e,t,n,r){e&&M(""+H.page_id,!0),H.page_id=D();var a,o=T+G();B({id:H.page_id,type:"pageview",referrer:!t||n?L:null,query:(a=t,c.search.slice(1).split("&").filter(function(e){return!a&&new RegExp("^((utm_)"+(R?"":"?")+"(source|medium|content|term|campaign)"+(R?"":"|ref")+")=").test(e)}).join("&")||i)}),L=o,0};!function(e,t){var n=G(t);if(n&&z!=n){z=n,J.path=n,p[w]&&(J[w]=p[w]);var r,a=s.performance,o="navigation";try{r=a.getEntriesByType(o)[0].type}catch(Q){u(Q)}Z=r?-1<["reload","back_forward"].indexOf(r):a&&a[o]&&-1<[1,2].indexOf(a[o].type),P=!!L&&L.split("/")[0]==d;var i=function(){f=!0,K(e,e||Z||!1,P)};if(f)i();else try{b&&"function"==typeof b.getHighEntropyValues?b.getHighEntropyValues([O,S]).then(function(e){H.os_name=e[O],H.os_version=e[S],i()})["catch"](i):i()}catch(c){i()}}}()}catch(W){u(W)}}(window,{},"simpleanalyticscdn.com"); +!function(l,e,t,f){try{var u=undefined,n="https:",r=l.console,a="doNotTrack",m=l.navigator,p=l.location,g=p.host,i=l.document,o=m.userAgent,c="Not sending request ",h=!1,s=encodeURIComponent,d=decodeURIComponent,v=JSON.stringify,y=l.addEventListener,_="https://queue."+t,b=(i.documentElement,"language"),w=m.userAgentData,O="platform",S="platformVersion",j="https://docs.simpleanalytics.com",k=/(bot|spider|crawl)/i.test(o)&&!/(cubot)/i.test(o),E=i.currentScript||i.querySelector('script[src*="'+t+'"]');f=function(){var e=[].slice.call(arguments);return e.unshift("Simple Analytics:"),Function.prototype.apply.call(r.warn,r,e)};var q=function(e){return"string"==typeof e},x=function(e,t){return e&&e.getAttribute("data-"+t)},A=function(){for(var e,t,n,r={},a=arguments,i=0;i>e/4).toString(16)})}catch(r){return e.replace(n,function(e){var t=16*Math.random()|0;return(e<2?t:3&t|8).toString(16)})}},N=function(e){return"function"==typeof e},R="namespace",U=e[R]||x(E,R)||"sa",V=e.strictUtm||"true"==x(E,"strict-utm"),B=U+"_loaded";if(1==l[B])return f(c+"twice");l.sa_event_loaded=!0,l[B]=!0;var C,T=function(t,e,n){t=n?t:A(J,M,t),m.brave&&!n&&(t.brave=!0),m._duckduckgoloader_&&!n&&(t.duck=!0),(new Image).src=_+"/simple.gif?"+Object.keys(t).filter(function(e){return t[e]!=u}).map(function(e){return s(e)+"="+s(t[e])}).join("&")+"&time="+Date.now()},F=e.hostname||x(E,"hostname"),H=F||g,z={version:"cdn_light_12",hostname:H};e.mode||x(E,"mode");try{C=Intl.DateTimeFormat().resolvedOptions().timeZone}catch(X){f(X)}k&&(z.bot=!0);var J=A(z,{ua:o,https:p.protocol==n,timezone:C,page_id:I(),session_id:I()});if(J.sri=!1,w&&(J.mobile=w.mobile,J.brands=v(w.brands)),H!==g&&(J.hostname_original=g),a in m&&"1"==m[a])return f("Not sending request when "+a+" is enabled. See "+j+"/dnt");-1!=g.indexOf(".")&&!/^[0-9.:]+$/.test(g)||F||f("Set hostname on "+g+". See "+j+"/overwrite-domain-name");var L,M={},P=(e.referrer||x(E,"referrer")||i.referrer||"").replace(g,H).replace(/^https?:\/\/((m|l|w{2,3}([0-9]+)?)\.)?([^?#]+)(.*)$/,"$4").replace(/^([^/]+)$/,"$1")||u,Z=function(e,t){var n=A(z,{type:"append",original_id:t?e:J.page_id});if(t||!m.sendBeacon)T(n,0,!0);else try{m.sendBeacon.bind(m)(_+"/append",v(n))}catch(r){T(n,0,!0)}};y("pagehide",Z,!1);var G,K,Q=function(e){var t="";try{t=e||d(p.pathname)}catch(X){f(X)}return t},W=function(e,t,n,r,a,i){e&&Z(""+J.page_id,!0),J.page_id=I();var o,c=H+Q(),s=(o=t,(r||p.search).slice(1).split("&").filter(function(e){return!o&&new RegExp("^((utm_)"+(V?"":"?")+"(source|medium|content|term|campaign)"+(V?"":"|ref")+")=","i").test(e)}).join("&")||u);T({id:J.page_id,type:"pageview",referrer:!t||n?P:null,query:s}),P=c,0};!function(e,t,n,r){!r&&N(n)&&(r=n);var a,i;N(r);q(t)&&-1> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var getQueryParams = function (ignoreSource) {\n return (\n loc.search\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n if (ignore) return falseVar;\n var regex =\n \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \")=\";\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex).test(keyValue);\n })\n .join(\"&\") || undefinedVar\n );\n };\n\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n\n\n\n\n\n\n\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var bot = isBotAgent;\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n return (\n (doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n nav.sendBeacon(fullApiUrl + \"/append\", stringify(append));\n }\n };\n\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n\n\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n metadata\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n\n sendData({\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: getQueryParams(deleteSourceInfo),\n\n });\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (isPushState, pathOverwrite, metadata) {\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n sameSite = referrer\n ? referrer.split(slash)[0] == locationHostname\n : falseVar;\n\n\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n sendPageView(\n isPushState,\n isPushState || userNavigated || !collectMetricByString(\"r\"), // r = referrers\n sameSite,\n metadata\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n\n\n pageview();\n\n } catch (e) {\n warn(e);\n }\n})(\n window,\n {},\n \"simpleanalyticscdn.com\",\n \"queue.\",\n \"cdn_light_11\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","warn","undefinedVar","undefined","https","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","protocol","language","documentElement","uaData","userAgentData","platformText","platformVersionText","docsUrl","isBotAgent","test","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","attr","attribute","getAttribute","assign","obj","prop","object","to","arg","index","length","nextSource","constructor","Object","nextKey","hasOwnProperty","settings","sa_settings","logSettings","keys","Date","now","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","replace","c","getRandomValues","Uint8Array","toString","error","r","Math","random","namespaceText","namespace","strictUtm","loadedVariable","sa_event_loaded","timezone","sendData","data","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","Image","src","filter","key","map","join","overwrittenHostname","hostname","definedHostname","basePayload","version","mode","Intl","DateTimeFormat","resolvedOptions","timeZone","bot","ua","page_id","session_id","sri","mobile","brands","hostname_original","indexOf","lastSendPath","referrer","sendOnLeave","id","push","append","type","original_id","sendBeacon","sameSite","userNavigated","getPath","overwrite","path","pathname","sendPageView","isPushState","deleteSourceInfo","metadata","ignoreSource","currentPage","query","search","split","keyValue","RegExp","pages","pathOverwrite","performaceEntryType","perf","performance","navigationText","getEntriesByType","triggerSendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","e","pageview"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"light.source.js","sources":["light.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n\n var collectMetricByString = function (metricAbbreviation) {\n // eslint-disable-next-line no-unreachable\n return true;\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n if (ignore) return falseVar;\n // eslint-disable-next-line no-redeclare\n var regex =\n \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \")=\";\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n return q || undefinedVar;\n };\n\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n\n\n\n\n\n\n\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n // eslint-disable-next-line no-redeclare\n var bot = isBotAgent;\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n\n\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n sameSite = referrer\n ? referrer.split(slash)[0] == locationHostname\n : falseVar;\n\n\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n\n\n pageview();\n\n } catch (e) {\n warn(e);\n }\n})(\n window,\n {},\n \"simpleanalyticscdn.com\",\n \"queue.\",\n \"cdn_light_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","warn","undefinedVar","undefined","https","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","protocol","language","documentElement","uaData","userAgentData","platformText","platformVersionText","docsUrl","isBotAgent","test","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","isString","string","attr","attribute","getAttribute","assign","obj","prop","object","to","arg","index","length","nextSource","constructor","Object","nextKey","hasOwnProperty","settings","sa_settings","logSettings","keys","Date","now","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","replace","c","getRandomValues","Uint8Array","toString","error","r","Math","random","isFunction","func","namespaceText","namespace","strictUtm","loadedVariable","sa_event_loaded","timezone","sendData","data","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","Image","src","filter","key","map","join","overwrittenHostname","hostname","definedHostname","basePayload","version","mode","Intl","DateTimeFormat","resolvedOptions","timeZone","bot","ua","page_id","session_id","sri","mobile","brands","hostname_original","indexOf","lastSendPath","referrer","sendOnLeave","id","push","append","type","original_id","sendBeacon","bind","e","sameSite","userNavigated","getPath","overwrite","path","pathname","sendPageView","isPushState","deleteSourceInfo","search","metadata","ignoreSource","currentPage","query","split","keyValue","RegExp","pages","pathOverwrite","callbackRaw","querySearch","parts","shift","performaceEntryType","perf","performance","navigationText","getEntriesByType","triggerSendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","pageview"],"mappings":"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"} \ No newline at end of file diff --git a/dist/v12/app.js b/dist/v12/app.js index 7a25a549..a428f099 100644 --- a/dist/v12/app.js +++ b/dist/v12/app.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-08-12; 0715; SRI-version; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-16; ac4d; SRI-version; v12) */ -!function(d,t,e,n,m){try{var v=undefined,g=!0,y=!1,r="true",a="https:",_="pageview",u="event",i="error",o=d.console,c="doNotTrack",w=d.navigator,s=d.location,b=s.host,l=d.document,p=w.userAgent,f="Not sending request ",h=f+"when ",O=y,E=encodeURIComponent,x=decodeURIComponent,S=JSON.stringify,M=d.addEventListener,k="https://queue."+e,q=l.documentElement||{},A="language",$="Height",j="scroll",D=w.userAgentData,C=j+$,R="offset"+$,H="client"+$,P="pagehide",T="platform",U="platformVersion",I="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),N=d.screen,z=l.currentScript||l.querySelector('script[src*="'+e+'"]');m=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){m("Error in your "+t+" function:",e)},W=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},G=function(t){return"string"==typeof t},J=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},L=function(t,e){return t&&t.getAttribute("data-"+e)},Y=function(t){return Array.isArray(t)?t:G(t)&&t.length?t.split(/, ?/):[]},Z=function(t){return t&&t.constructor===Object},K=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},it=function(t){return"function"==typeof t},ot="namespace",ct=t[ot]||L(z,ot)||"sa",st=function(t,e){var n=d[ct+"_metadata"];Z(n)&&(t=K(t,n));var r=d[kt];if(!it(r))return kt&&m(kt+" not found, set window."+kt),t;try{return K(t,r.call(d,K(t,e)))}catch(a){F("metadata",a)}},ut=t.strictUtm||L(z,"strict-utm")==r,lt=function(i,t){tt=!i&&nt("p")?"":y;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");tt!==y&&0>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},it=function(t){return"function"==typeof t},ot="namespace",ct=t[ot]||L(z,ot)||"sa",st=function(t,e){var n=d[ct+"_metadata"];Z(n)&&(t=K(t,n));var r=d[qt];if(!it(r))return qt&&m(qt+" not found, set window."+qt),t;try{return K(t,r.call(d,K(t,e)))}catch(a){F("metadata",a)}},ut=t.strictUtm||L(z,"strict-utm")==r,lt=function(i,t){tt=!i&&nt("q")?"":y;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");tt!==y&&0> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var p;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n p = !ignoreSource && collectMetricByString(\"p\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (p !== falseVar && i > 0 && keyValue.slice(i + 1))\n p += (p ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n p = p || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = trueVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n p: p,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"simpleanalyticscdn.com\",\n \"queue.\",\n \"cdn_latest_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","protocol","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","p","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"app.js","sources":["app.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = trueVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"simpleanalyticscdn.com\",\n \"queue.\",\n \"cdn_latest_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","protocol","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue"],"mappings":";;CAEA,SACEA,EACAC,EACAC,EAIAC,EACAC,GAEA,IAQE,IAAIC,EAAeC,UACfC,GAAU,EACVC,GAAW,EACXC,EAAW,OACXC,EAAQ,SACRC,EAAe,WACfC,EAAY,QACZC,EAAY,QAGZC,EAAMd,EAAOe,QACbC,EAAa,aACbC,EAAMjB,EAAOkB,UACbC,EAAMnB,EAAOoB,SACbC,EAAmBF,EAAIG,KACvBC,EAAMvB,EAAOwB,SACbC,EAAYR,EAAIQ,UAChBC,EAAa,uBACbC,EAAiBD,EAAa,QAC9BE,EAA2BpB,EAC3BqB,EAAyBC,mBACzBC,EAAyBC,mBACzBC,EAAYC,KAAKD,UAEjBE,EAAuBnC,EAAOoC,iBAC9BC,EAAaC,iBAA0BpC,EACvCqC,EAAkBhB,EAAIgB,iBAAmB,GACzCC,EAAW,WACXC,EAAS,SAETC,EAAS,SACTC,EAAS1B,EAAI2B,cACbC,EAAeH,EAASD,EACxBK,EAAe,SAAWL,EAC1BM,EAAe,SAAWN,EAE1BO,EAAW,WACXC,EAAe,WACfC,EAAsB,kBACtBC,EAAU,mCACVC,EAAQ,EACRC,EACF,sBAAsBC,KAAK7B,KAAe,WAAW6B,KAAK7B,GACxD8B,EAASvD,EAAOuD,OAIhBC,EACFjC,EAAIkC,eAAiBlC,EAAImC,cAAc,gBAAkBxD,EAAU,MAOrEE,EAAO,WAEL,IAAIuD,EAAO,GAAGC,MAAMC,KAAKC,WAOzB,OAJAH,EAAKI,QAAQ,qBAINC,SAASC,UAAUC,MAAML,KAAK/C,EAAIV,KAAMU,EAAK6C,IAGtD,IAAIQ,EAAiB,SAAUC,EAAMC,GACnCjE,EAAK,iBAAmBgE,EAAO,aAAcC,IAG3CC,EAAU,SAAUC,EAAKC,GAC3B,OAAOC,OAAOR,UAAUS,eAAeb,KAAKU,EAAKC,IAG/CG,EAAW,SAAUC,GACvB,MAAwB,iBAAVA,GAGZC,EAAc,SAAUC,GAC1B,OAAOA,EAAKC,QAAQ,sBAAuB,SAGzCC,EAAO,SAAUxB,EAAeyB,GAClC,OAAOzB,GAAiBA,EAAc0B,aAAa,QAAUD,IAG3DE,EAA+B,SAAUC,GAC3C,OAAOC,MAAMC,QAAQF,GACjBA,EACAT,EAASS,IAAQA,EAAIG,OACnBH,EAAII,MAAM,OACV,IAGJC,EAAW,SAAUC,GACvB,OAAOA,GAAUA,EAAOC,cAAgBlB,QAGtCmB,EAAS,WAGX,IAFA,IAAIC,EAAK,GACLC,EAAMhC,UACDiC,EAAQ,EAAGA,EAAQD,EAAIP,OAAQQ,IAAS,CAC/C,IAAIC,EAAaF,EAAIC,GACrB,GAAIN,EAASO,GACX,IAAK,IAAIC,KAAWD,EACd1B,EAAQ0B,EAAYC,KACtBJ,EAAGI,GAAWD,EAAWC,IAKjC,OAAOJ,GAGLK,EAAWlG,EAAOmG,YAClBC,EAAcF,GAAYzB,OAAO4B,KAAKpG,GAAkBsF,OAG5DtF,EAAmB2F,EAAO3F,EAAkBiG,GAExCE,GAAahG,EAAK,WAAYH,GAGlC,IA+EIqG,GA/EAC,GAAgBpB,EAClBlF,EAAiBsG,eAAiBvB,EAAKxB,EAAe,mBAGpDgD,GAAwB,SAAUC,GAEpC,OAGgB,IAFdF,GAAcG,OAAO,SAAU5B,GAC7B,OAAO,IAAI6B,OAAO,IAAMF,GAAoBnD,KAAKwB,KAChDS,QAIHqB,GAAMC,KAAKD,IAEXE,GAAO,WACT,IAAIC,EAAe/G,EAAOgH,QAAUhH,EAAOiH,SACvCC,EAAY,CAAC,MAAQ,KAAO,KAAO,KAAO,KAC1CC,EAAY,SAEhB,IACE,OAAOD,EAAUnC,QAAQoC,EAAW,SAAUC,GAC5C,OACEA,EACCL,EAAaM,gBAAgB,IAAIC,WAAW,IAAI,GAC9C,IAAOF,EAAI,GACdG,SAAS,MAEb,MAAOlD,GACP,OAAO6C,EAAUnC,QAAQoC,EAAW,SAAUC,GAC5C,IAAII,EAAqB,GAAhBC,KAAKC,SAAiB,EAE/B,OADMN,EAAI,EAAII,EAAS,EAAJA,EAAW,GACrBD,SAAS,QAKpBI,GAAa,SAAUC,GACzB,MAAsB,mBAARA,GAIZC,GAAgB,YAChBC,GACF7H,EAAiB4H,KACjB7C,EAAKxB,EAAeqE,KAiyBxB,KA9xBME,GAAiB,SAAUC,EAAUC,GACvC,IAAIC,EAAiBlI,EAAO8H,GAAY,aACpCrC,EAASyC,KAAiBF,EAAWpC,EAAOoC,EAAUE,IAC1D,IAAIC,EAA4BnI,EAAOoI,IACvC,IAAKT,GAAWQ,GAKd,OAJIC,IACFhI,EACEgI,GAAoB,0BAA4BA,IAE7CJ,EAET,IACE,OAAOpC,EACLoC,EACAG,EAA0BtE,KAAK7D,EAAQ4F,EAAOoC,EAAUC,KAE1D,MAAO5D,GACPF,EAAe,WAAYE,KAU3BgE,GACFpI,EAAiBoI,WACjBrD,EAAKxB,EAAe,eAAiB/C,EAInC6H,GAAiB,SAAUC,EAAcC,GAC3ClC,IAAKiC,GAAgB/B,GAAsB,KAAO,GAAKhG,EACvD,IAAIiI,GAAKD,GAAmBrH,EAAIuH,QAC7B9E,MAAM,GACN4B,MAAM,KACNkB,OAAO,SAAUiC,GAChB,IAAIC,EAAID,EAASE,QAAQ,KACrBvC,KAAM9F,GAAgB,EAAJoI,GAASD,EAAS/E,MAAMgF,EAAI,KAChDtC,KAAMA,GAAI,IAAM,IAAMqC,EAAS/E,MAAM,EAAGgF,IAE1C,IAAIE,EAASP,IAAiB/B,GAAsB,MAEhDuC,EAAkBC,GAAYC,IAAIpE,GAAaqE,KAAK,KACpDC,EAAQL,EACR,KAAOC,EAAkB,KACzB,YACCV,GAAY,GAAK,KAClB,yCACCA,GAAY,GAAK,QAClB,IACAU,EACA,KACJ,OAAID,IAAWE,GAAYzD,OAAe/E,EAInC,IAAImG,OAAOwC,EAAO,KAAK7F,KAAKqF,KAEpCO,KAAK,KAGR,OADA5C,GAAIA,IAAKjG,EACFoI,GAAKpI,GA+BV+I,GAAiBtB,GAAY,UACjC,GAAI9H,EAAOoJ,KAAmB7I,EAAS,OAAOH,EAAKsB,EAAa,SAChE1B,EAAOqJ,gBAAkB9I,EACzBP,EAAOoJ,IAAkB7I,EAOzB,IAAI+I,GAAW,SAAUrB,EAAMsB,EAAUC,GACvCvB,EAAOuB,EAAevB,EAAOrC,EAAO6D,GAASC,GAAMzB,GAE/ChH,EAAI0I,QAAUH,IAAcvB,EAAK0B,MAAQpJ,GACzCU,EAAI2I,qBAAuBJ,IAAcvB,EAAK4B,KAAOtJ,GAGzD,IAAIuJ,EAAQ,IAAIC,MACZR,IACFO,EAAME,QAAUT,EAChBO,EAAMG,OAASV,GAEjBO,EAAMI,IACJ7H,EACA,eACAoC,OAAO4B,KAAK4B,GACTvB,OAAO,SAAUyD,GAChB,OAAOlC,EAAKkC,IAAQ9J,IAErB4I,IAAI,SAAUkB,GACb,OACEtI,EAAuBsI,GACvB,IACAtI,EAAuBoG,EAAKkC,MAG/BjB,KAAK,KACR,SACArC,KAAKD,OAILwD,GACFnK,EAAiBoK,UAAYrF,EAAKxB,EAAe,YAC/C8G,GAAkBF,IAAuB/I,EAEzCkJ,GAAc,CAChBC,QA+oBJ,gBA9oBIH,SAAUC,IASZnK,EAAY,SAAUsK,GACpBA,EAAiBA,EAAeC,MAC5BD,EAAiB,IAAMA,EAAeC,MACtCD,EACJrK,EAAKqK,GACLnB,GACE1D,EAAO2E,GAAa,CAClBI,KAAM9J,EACNwD,MAAOoG,EACPG,KAAMzJ,EAAI0J,WAEZxK,EACAE,IAMJ4B,EACEtB,EACA,SAAUiK,GACJA,EAAMC,WAA+C,EAAnCD,EAAMC,SAASlC,QAAQ3I,IAC3CC,EAAU2K,EAAME,UAGpBxK,GAOF,IAwDIyK,GAxDAC,GAAQtE,KAERuE,GAAW,EAOXC,GAAOnL,EAAiBmL,MAAQpG,EAAKxB,EAAe,QAGpD6H,MA/KsBC,GA+KCrL,EAAiBoL,cA9KvBC,GA+KjBrL,EAAiBoL,WACjBrG,EAAKxB,EAAe,eAAiB/C,GACrCuE,EAAKxB,EAAe,aAAe/C,GACnCuE,EAAKxB,EAAe,gBAAkB/C,EAGtC8K,KACqC,SAAvCvG,EAAKxB,EAAe,iBACpBvD,EAAiBsL,cAAgB/K,GAI/BgL,GACFvL,EAAiBwL,UACjBzG,EAAKxB,EAAe,cACpBsE,GAAY,IAAMlH,EAGhB8K,GAAcvG,EAChBlF,EAAiByL,aAAe1G,EAAKxB,EAAe,iBAIlDwF,GAAc7D,EAChBlF,EAAiB+I,aAAehE,EAAKxB,EAAe,iBAIlDmI,GAAqBxG,EACvBlF,EAAiB0L,oBACf3G,EAAKxB,EAAe,yBAIpBoI,GACF3L,EAAiB2L,gBAAkB5G,EAAKxB,EAAe,mBAGrD4E,GACFnI,EAAiBmI,mBACjBpD,EAAKxB,EAAe,sBAItB,IAEEyH,GAAWzE,GAAsB,KAC7BqF,KAAKC,iBAAiBC,kBAAkBC,SACxC3L,EACJ,MAAOgE,IACPjE,EAAKiE,IAOP,IAAI4H,GAAUjM,EAAOiM,QACjBC,GACFjL,EAAIkL,WACJnM,EAAOoM,aACPpM,EAAOqM,aACPrM,EAAOsM,UACNL,KAAYA,GAAQM,QACrBvM,EAAOwM,YACPxM,EAAOyM,MACPpJ,GACAoE,KAAKC,UAAYD,KAAKC,SAGpBgF,GACFlG,GAAsB,MAAQA,GAAsB,QAElD0F,KAAK3B,GAAY2B,IAAM3L,GAE3B,IAAIkJ,GAAU7D,EAAO2E,GAAa,CAEhCoC,GAAInG,GAAsB,MAAQ/E,EAAYpB,EAE9CK,MAAOS,EAAImB,UAAY5B,EACvBuK,SAAUA,GACV2B,QAASF,GAAqB5F,KAASzG,EAGvCwM,WAAYrG,GAAsB,MAAQM,KAASzG,IA0BrD,GAvBAoJ,GAAQqD,IAAMvM,EAIVoC,IACF8G,GAAQsD,OAASpK,EAAOoK,OACxBtD,GAAQuD,OAAS/K,EAAUU,EAAOqK,SAS/BzL,EAAI0L,SAAS7M,EAAK,4CAInBkK,KAAoBjJ,IACtBoI,GAAQyD,kBAAoB7L,IAGzBgK,IAAcrK,KAAcC,GAA0B,KAAnBA,EAAID,GAC1C,OAAOZ,EACLuB,EAAiBX,EAAa,oBAAsBmC,EAAU,SAK7B,GAAlC9B,EAAiBwH,QAAQ,OACxB,aAAavF,KAAKjC,IACnB+I,IAEDhK,EACE,mBACEiB,EACA,SACA8B,EACA,0BAON,IACIgK,GA0DAC,GA3DA1D,GAAO,GAGP2D,GAAc,WAKhB,OAFEpN,EAAiBqN,UAAYtI,EAAKxB,EAAe,aAGzBjC,EAAI+L,UAAY,IACrCvI,QAAQ1D,EAAkBiJ,IAC1BvF,QAAQ,sDAAuD,MAC/DA,QAAQ,YAAa,OAAS1E,GAKjCiN,GAAWD,KAOXE,GAAW,EAEXC,GAAc,SAAUC,EAAIC,GAC9B,GAAKhB,GAAL,CAEA,IAAIiB,EAAS/H,EAAO2E,GAAa,CAC/BI,KAAM,SACNiD,YAAaF,EAAOD,EAAKhE,GAAQmD,UAenC,GAXIpG,GAAsB,OACxBmH,EAAOE,SAAWpG,KAAKqG,OAAOlH,KAAQsE,GAAQqC,IAngBnC,MAqgBbA,GAAW,EACXrC,GAAQtE,KAGJJ,GAAsB,UACxBmH,EAAOxC,SAAW1D,KAAKsG,IAAI,EAAG5C,GAAU6C,OAGtCN,IAASzM,EAAIgN,WAEf3E,GAASqE,EAAQtN,EAAcE,QAE/B,IACEU,EAAIgN,WAAWC,KAAKjN,EAApBA,CAAyBoB,EAAa,UAAWJ,EAAU0L,IAC3D,MAAOQ,GAEP7E,GAASqE,EAAQtN,EAAcE,MAMrC4B,EACE,mBACA,WACMZ,EAAI6M,QACA,KAAOpL,KAAYhD,GAASwN,KAClCJ,GAAcxG,MACT2G,IAAY3G,KAAQwG,IAE7B5M,GAGF2B,EAAqBa,EAAUwK,GAAahN,GAE5C,IAAI6N,GAAO9M,EAAI8M,MAAQ,GACnBL,GAAW,WACb,IACE,IAAIM,EAAuB/L,EAAgBQ,IAAiB,EACxDwL,EAAS9G,KAAKsG,IAChBM,GAAKxL,IAAiB,EACtBwL,GAAKvL,IAAiB,EACtBP,EAAgBQ,IAAiB,EACjCR,EAAgBM,IAAiB,EACjCN,EAAgBO,IAAiB,GAEnC,OAAO2E,KAAK+G,IACV,IAKI,EAJJ/G,KAAKqG,MACF,MAAQvL,EAAgBkM,WAAa,GAAKH,GACzCC,EACA,IAGN,MAAOlK,IAEP,OADAjE,EAAKiE,IACE,IAIXlC,EAAqB,OAAQ,WAC3BgJ,GAAW6C,KACX7L,EACEO,EACA,WACMyI,GAAW6C,OAAY7C,GAAW6C,OAExCxN,KAQJ,IAgCIkO,GAoCAC,GAAUC,GApEVC,GAAU,SAAUC,GACtB,IAAIlE,EAAO,GAIX,IACEA,EAAOkE,GAAa/M,EAAuBZ,EAAI0J,UAC/C,MAAOxG,IACPjE,EAAKiE,IAGP,IAAI0K,EAAyB/O,EAAO4L,IACpC,GAAIjE,GAAWoH,GACb,IACEnE,EAAOmE,EAAuBlL,KAAK7D,EAAQ,CAAE4K,KAAMA,KAAWA,EAC9D,MAAOvG,IACPF,EAAe,OAAQE,IAK3B,IA5YiB,SAAUuG,GAC3B,IAAK,IAAIhC,KAAK8C,GAAa,CACzB,IAAIsD,EAAgBtD,GAAY9C,GAChC,GAAKoG,EAAL,CAGA,IAAIC,EA9OI,KA+OND,EAAc,GAAcA,EA/OtB,IA+O8CA,EAEtD,GACEC,IAAerE,GACf,IAAIjE,OACF,IAAM9B,EAAYoK,GAAYlK,QAAQ,SAAU,QAAU,IAC1D,KACAzB,KAAKsH,GAEP,OAAOrK,GAEX,OAAOC,EA0XH0O,CAAatE,GAQjB,MAFY,QAARQ,IAAkBjK,EAAIgO,OAAMvE,GAAQzJ,EAAIgO,KAAK3J,MAAM,KAAK,IAErDoF,EAPLxK,EAAKuB,EAAiB,YAAciJ,IAgDpCwE,GAAW,SACbC,EACAC,EACAtH,EACAuH,IAEKA,GAAe5H,GAAWK,KAAWuH,EAAcvH,GACxD,IACIwH,EAGEC,EAJFlG,EAAW5B,GAAW4H,GAAeA,EAAc,aAEnD5K,EAAS2K,KAAgD,EAA9BA,EAAczG,QAAQ,OAGnDyG,GADIG,EAAQH,EAAc9J,MAAM,MACVkK,QACtBF,EAAc,IAAMC,EAAMvG,KAAK,MAGjC,IAAI0B,EAAOiE,GAAQS,GAGnB,GAAK1E,GAAQuC,IAAgBvC,EAA7B,CAEAuC,GAAevC,EACflB,GAAKkB,KAAOA,EAGRpE,GAAsB,OACxBkD,GAAKiG,eACHlI,KAAKsG,IAAIxL,EAA2B,aAAK,EAAGvC,EAAO4P,YAAc,IACjE,KACFlG,GAAKmG,gBACHpI,KAAKsG,IACHxL,EAAgBQ,IAAiB,EACjC/C,EAAO8P,aAAe,IACnB,MAILtJ,GAAsB,MACpBvF,EAAIuB,KAAWkH,GAAKlH,GAAYvB,EAAIuB,IAItCe,GAAUiD,GAAsB,QAClCkD,GAAKqG,aAAexM,EAAOyM,MAC3BtG,GAAKuG,cAAgB1M,EAAOgL,QAI9B,IAII2B,EAJAC,EAAOnQ,EAAOoQ,YACdC,EAAiB,aAIrB,IACEH,EAAsBC,EAAKG,iBAAiBD,GAAgB,GAAG1F,KAC/D,MAAOtG,IACPjE,EAAKiE,IAGPuK,GAAgBsB,GAC+C,EAA3D,CAAC,SAAU,gBAAgBrH,QAAQqH,GAGnCC,GACAA,EAAKE,KACwC,EAA7C,CAAC,EAAG,GAAGxH,QAAQsH,EAAKE,GAAgB1F,MAGxC,IAAI4F,EAA0BjD,GAC1BA,GAAS9H,MA1uBH,KA0uBgB,GACtBnF,EACJsO,GAAWrB,IACgD,EAAvD3B,GAAmB9C,QAAQ0H,IAC3BA,GAA2BlP,EAC3Bb,EAGJkJ,GAAK8G,OACH,QAAQlN,KAAK+J,OAAkBgC,GAAeT,GAC1CpO,GACCmO,GAEP3G,EAAWD,GAAeC,EAAU,CAClC2C,KAAMhK,EACNiK,KAAMlB,GAAKkB,OAGb,IAAI6F,EAAsB,WACxB7O,EAA2BrB,EAC3B,IAAImQ,EACFrB,GAAeT,KAAkBpI,GAAsB,MA7H1C,SACjB6I,EACAsB,EACAhC,EACAjG,EACAV,EACAuB,GAEI8F,GAAa7B,GAAY,GAAK/D,GAAQmD,QAASrM,GAC/CmM,KAAoBjD,GAAQmD,QAAU9F,MAE1C,IAAI8J,EAActG,GAAkBuE,KAChCgC,EAAQvI,GAAeqI,EAAkBjI,GAE7CY,GACE,CACEmE,GAAIhE,GAAQmD,QACZjC,KAAMhK,EACN2M,UAAWqD,GAAoBhC,EAAWrB,GAAW,KACrDuD,MAAOA,EACPvK,EAAGA,GAEH0B,SAAU/F,EAAU+F,IAEtBuB,GAGFmF,GAAmBpB,GACnBA,GAAWsD,EAEXxN,IAgGE0N,CACEzB,EACAqB,EACA/B,GACAa,EACAxH,EACAuB,IAIJ,GAAK3H,EAmBH6O,SAjBA,IACM9N,GAAUgF,GAAWhF,EAAOoO,sBAC9BpO,EACGoO,qBAAqB,CAAC9N,EAAcC,IACpC8N,KAAK,SAAUC,GACdxH,GAAQyH,QAAUD,EAAkBhO,GACpCwG,GAAQ0H,WAAaF,EAAkB/N,GACvCuN,MAEDW,SAAMX,GAETA,IAEF,MAAOtC,GACPsC,OAWFY,GAAMrR,EAAOsR,QACbC,GAAeF,GAAMA,GAAIG,UAAYnR,EACrCoR,GAAMzR,EAAO0R,cACbC,GAAgB,YAIhBpG,IAAegG,IAAgBK,OAASH,KAqB1CJ,GAAIG,WAnBEK,GAAOR,GADiB1G,GAoBAgH,IAlBrB,WACL,IAEI7G,EAFAhF,EAAMhC,UACNgO,EAAKD,GAAK3N,MAAM6N,KAAMjM,GAY1B,OAVI6B,GAAWiK,OACb9G,EAAQ,IAAI8G,MAAMjH,KAIlBG,EAAQvJ,EAAIyQ,YAAY,UAClBC,UAAUtH,GAAMpK,EAASA,GAEjCuK,EAAMhH,UAAYgC,EAClB2L,GAAI3G,GACGgH,IAMX3P,EACEwP,GACA,WACEvC,GAAS,IAEX5O,GAGF2B,EACE,WACA,WACEiN,GAAS,IAEX5O,IAKA+K,IAAuB,QAARH,IAAkB,iBAAkBpL,GACrDmC,EACE,aACA,WACEiN,GAAS,IAEX5O,GAIA+K,IAAa6D,KAEjBpP,EAAOkS,YAAc,SAAUtH,EAAM5C,EAAUuB,GAC7C6F,GAAS,EAAGxE,EAAM5C,EAAUuB,IAQ9B,IAAI4I,GAAa,CAAC,SAAU,UAExBC,GAAY,SAAUtH,EAAO9C,EAAUuH,IACpCA,GAAe5H,GAAWK,KAAWuH,EAAcvH,GAExD,IAAIqK,EAAkB1K,GAAWmD,GAC7BvB,EAAW5B,GAAW4H,GAAeA,EAAc,aACnD+C,SAAmBxH,EAEvB,GAAIqH,GAAWtJ,QAAQyJ,GAAa,IAAMD,EAExC,OADAlO,EAAeqH,GAAmB5K,EAAY,aAAe0R,GACtD/I,IAGT,IACE,GAAI8I,EAAiB,CACnB,IAAIE,EAAczH,IAClB,GAAIqH,GAAWtJ,eAAe0J,GAAe,EAK3C,OAJApO,EACEqH,GACAV,EAAQ,uBAAyByH,GAE5BhJ,IAETuB,EAAQyH,GAEV,MAAOlO,IAEP,OADAF,EAAeqH,GAAmBnH,IAC3BkF,IAGTuB,GAAS,GAAKA,GAAO/F,QAAQ,eAAgB,KAAKA,QAAQ,WAAY,IAEtE,IAAIyN,EAAc,CAAE7H,KAAM/J,EAAWkK,MAAOA,GACxC2H,GAAa7D,IAAiBxL,EAAQ,EAE1C4E,EAAWD,GAAeC,EAAUwK,GAEhC1H,GACFxB,GACE1D,EAAO4M,EAAa,CAClB/E,GAAI3G,KACJ+J,MAAOvI,IAAgBmK,GACvBnF,UACGmF,GAAa9D,KAAanI,GAAsB,KAC7CkI,GACA,KAEN1G,SAAU/F,EAAU+F,KAEtBuB,IAKFmJ,GAAmB,SAAU5H,EAAO9C,EAAUuB,GAChD6I,GAAUtH,EAAO9C,EAAUuB,IAIxBvJ,EAAOwL,MACVxL,EAAOwL,IAAqBkH,IAE9B,IAAIC,GAAY3S,EAAOwL,IAGnBoH,GAAQD,IAAaA,GAAUlK,EAAIkK,GAAUlK,EAAI,GAMrD,IAAK,IAAIqC,MAHT9K,EAAOwL,IAAqBkH,GAGVE,GACZtO,EAAQsO,GAAO9H,MACjBzF,MAAMC,QAAQsN,GAAM9H,KAChBsH,GAAUlO,MAAM,KAAM0O,GAAM9H,KAC5BsH,GAAUQ,GAAM9H,MAGxB,MAAOqD,IACPhO,EAAUgO,IA7IY,IAAUxD,GACxBkH,GArnBkBvG,GAnN9B,CAu9BEtL,OACA,uBACA"} \ No newline at end of file diff --git a/dist/v12/auto-events.js b/dist/v12/auto-events.js index db284999..8fc14a1f 100644 --- a/dist/v12/auto-events.js +++ b/dist/v12/auto-events.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-08-12; e658; SRI-version; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-16; e658; SRI-version; v12) */ function r(t,e){var n,o;t.hasAttribute("data-simple-event")||(n=!1,b.downloads&&/^https?:\/\//i.test(t.href)&&new RegExp("\\.("+(b.downloadsExtensions||[]).join("|")+")$","i").test(t.pathname)?n="download":b.outbound&&/^https?:\/\//i.test(t.href)&&t.hostname!==h.location.hostname?n="outbound":b.emails&&/^mailto:/i.test(t.href)?n="email":b.phones&&/^tel:/i.test(t.href)&&(n="phone"),n&&(e?(o="saAutomatedLink(this, '"+n+"');",t.hasAttribute("target")&&"_self"!==t.getAttribute("target")||(o+=" return false;"),t.setAttribute("onclick",o)):t.addEventListener("click",function(){g(this,n)})))}function e(){try{for(var t=document.getElementsByTagName("a"),e=0;e>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},it=function(t){return"function"==typeof t},ot="namespace",ct=t[ot]||L(z,ot)||"sa",st=function(t,e){var n=d[ct+"_metadata"];Z(n)&&(t=K(t,n));var r=d[kt];if(!it(r))return kt&&m(kt+" not found, set window."+kt),t;try{return K(t,r.call(d,K(t,e)))}catch(a){F("metadata",a)}},ut=t.strictUtm||L(z,"strict-utm")==r,lt=function(i,t){tt=!i&&nt("p")?"":y;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");tt!==y&&0"); +!function(d,t,e,n,m){try{var v=undefined,g=!0,y=!1,r="true",a="https:",_="pageview",u="event",i="error",o=d.console,c="doNotTrack",w=d.navigator,s=d.location,b=s.host,l=d.document,p=w.userAgent,f="Not sending request ",h=f+"when ",O=y,x=encodeURIComponent,E=decodeURIComponent,S=JSON.stringify,k=d.addEventListener,M="https://"+e,q=l.documentElement||{},A="language",$="Height",j="scroll",D=w.userAgentData,C=j+$,H="offset"+$,R="client"+$,P="pagehide",T="platform",U="platformVersion",I="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),N=d.screen,z=l.currentScript||l.querySelector('script[src*="'+e+'"]');m=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){m("Error in your "+t+" function:",e)},W=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},G=function(t){return"string"==typeof t},J=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},L=function(t,e){return t&&t.getAttribute("data-"+e)},Y=function(t){return Array.isArray(t)?t:G(t)&&t.length?t.split(/, ?/):[]},Z=function(t){return t&&t.constructor===Object},K=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},it=function(t){return"function"==typeof t},ot="namespace",ct=t[ot]||L(z,ot)||"sa",st=function(t,e){var n=d[ct+"_metadata"];Z(n)&&(t=K(t,n));var r=d[Mt];if(!it(r))return Mt&&m(Mt+" not found, set window."+Mt),t;try{return K(t,r.call(d,K(t,e)))}catch(a){F("metadata",a)}},ut=t.strictUtm||L(z,"strict-utm")==r,lt=function(i,t){tt=!i&&nt("q")?"":y;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");tt!==y&&0"); //# sourceMappingURL=app.js.map \ No newline at end of file diff --git a/dist/v12/custom/app.js.map b/dist/v12/custom/app.js.map index 62fafdb1..4cd0921e 100644 --- a/dist/v12/custom/app.js.map +++ b/dist/v12/custom/app.js.map @@ -1 +1 @@ -{"version":3,"file":"app.source.js","sources":["app.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var p;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n p = !ignoreSource && collectMetricByString(\"p\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (p !== falseVar && i > 0 && keyValue.slice(i + 1))\n p += (p ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n p = p || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = trueVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n p: p,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_app_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","p","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","protocol","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"app.source.js","sources":["app.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = trueVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_app_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","protocol","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue"],"mappings":"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"} \ No newline at end of file diff --git a/dist/v12/custom/auto-events.js b/dist/v12/custom/auto-events.js index db284999..8fc14a1f 100644 --- a/dist/v12/custom/auto-events.js +++ b/dist/v12/custom/auto-events.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-08-12; e658; SRI-version; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-16; e658; SRI-version; v12) */ function r(t,e){var n,o;t.hasAttribute("data-simple-event")||(n=!1,b.downloads&&/^https?:\/\//i.test(t.href)&&new RegExp("\\.("+(b.downloadsExtensions||[]).join("|")+")$","i").test(t.pathname)?n="download":b.outbound&&/^https?:\/\//i.test(t.href)&&t.hostname!==h.location.hostname?n="outbound":b.emails&&/^mailto:/i.test(t.href)?n="email":b.phones&&/^tel:/i.test(t.href)&&(n="phone"),n&&(e?(o="saAutomatedLink(this, '"+n+"');",t.hasAttribute("target")&&"_self"!==t.getAttribute("target")||(o+=" return false;"),t.setAttribute("onclick",o)):t.addEventListener("click",function(){g(this,n)})))}function e(){try{for(var t=document.getElementsByTagName("a"),e=0;e>e/4).toString(16)})}catch(r){return e.replace(n,function(e){var t=16*Math.random()|0;return(e<2?t:3&t|8).toString(16)})}},N=function(e){return"function"==typeof e},R="namespace",U=e[R]||A(x,R)||"sa",V=e.strictUtm||"true"==A(x,"strict-utm"),B=U+"_loaded";if(1==l[B])return f(c+"twice");l.sa_event_loaded=!0,l[B]=!0;var C,H=function(t,e,n){t=n?t:$(J,M,t),m.brave&&!n&&(t.brave=!0),m._duckduckgoloader_&&!n&&(t.duck=!0),(new Image).src=_+"/simple.gif?"+Object.keys(t).filter(function(e){return t[e]!=u}).map(function(e){return s(e)+"="+s(t[e])}).join("&")+"&time="+Date.now()},T=e.hostname||A(x,"hostname"),F=T||g,z={version:"custom_light_12",hostname:F};e.mode||A(x,"mode");try{C=Intl.DateTimeFormat().resolvedOptions().timeZone}catch(X){f(X)}k&&(z.bot=!0);var J=$(z,{ua:o,https:p.protocol==n,timezone:C,page_id:I(),session_id:I()});if(J.sri=!0,w&&(J.mobile=w.mobile,J.brands=v(w.brands)),F!==g&&(J.hostname_original=g),i in m&&"1"==m[i])return f("Not sending request when "+i+" is enabled. See "+j+"/dnt");-1!=g.indexOf(".")&&!/^[0-9.:]+$/.test(g)||T||f("Set hostname on "+g+". See "+j+"/overwrite-domain-name");var L,M={},P=(e.referrer||A(x,"referrer")||a.referrer||"").replace(g,F).replace(/^https?:\/\/((m|l|w{2,3}([0-9]+)?)\.)?([^?#]+)(.*)$/,"$4").replace(/^([^/]+)$/,"$1")||u,Z=function(e,t){var n=$(z,{type:"append",original_id:t?e:J.page_id});if(t||!m.sendBeacon)H(n,0,!0);else try{m.sendBeacon.bind(m)(_+"/append",v(n))}catch(r){H(n,0,!0)}};y("pagehide",Z,!1);var G,K,Q=function(e){var t="";try{t=e||d(p.pathname)}catch(X){f(X)}return t},W=function(e,t,n,r,i,a){e&&Z(""+J.page_id,!0),J.page_id=I();var o,c=F+Q(),s=(o=t,(r||p.search).slice(1).split("&").filter(function(e){return!o&&new RegExp("^((utm_)"+(V?"":"?")+"(source|medium|content|term|campaign)"+(V?"":"|ref")+")=","i").test(e)}).join("&")||u);H({id:J.page_id,type:"pageview",referrer:!t||n?P:null,query:s}),P=c,0};!function(e,t,n,r){!r&&N(n)&&(r=n);var i,a;N(r);E(t)&&-1"); //# sourceMappingURL=light.js.map \ No newline at end of file diff --git a/dist/v12/custom/proxy.js b/dist/v12/custom/proxy.js index 705a296f..e8c67911 100644 --- a/dist/v12/custom/proxy.js +++ b/dist/v12/custom/proxy.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-08-12; 4adc; SRI-version; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-16; 6f40; SRI-version; v12) */ -!function(d,t,e,n,m){try{var v=undefined,g=!0,y=!1,r="true",a="https:",_="pageview",u="event",i="error",o=d.console,c="doNotTrack",w=d.navigator,s=d.location,b=s.host,l=d.document,p=w.userAgent,f="Not sending request ",h=f+"when ",x=y,O=encodeURIComponent,E=decodeURIComponent,S=JSON.stringify,M=d.addEventListener,k="https://"+e,A=l.documentElement||{},q="language",$="Height",j="scroll",D=w.userAgentData,C=j+$,H="offset"+$,P="client"+$,R="pagehide",T="platform",U="platformVersion",I="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),N=d.screen,z=l.currentScript||l.querySelector('script[src*="'+e+'"]');m=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){m("Error in your "+t+" function:",e)},W=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},G=function(t){return"string"==typeof t},J=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},L=function(t,e){return t&&t.getAttribute("data-"+e)},Y=function(t){return Array.isArray(t)?t:G(t)&&t.length?t.split(/, ?/):[]},Z=function(t){return t&&t.constructor===Object},K=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},it=function(t){return"function"==typeof t},ot="namespace",ct=t[ot]||L(z,ot)||"sa",st=function(t,e){var n=d[ct+"_metadata"];Z(n)&&(t=K(t,n));var r=d[kt];if(!it(r))return kt&&m(kt+" not found, set window."+kt),t;try{return K(t,r.call(d,K(t,e)))}catch(a){F("metadata",a)}},ut=t.strictUtm||L(z,"strict-utm")==r,lt=function(i,t){tt=!i&&nt("p")?"":y;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");tt!==y&&0"); +!function(d,t,e,n,m){try{var v=undefined,g=!0,y=!1,r="true",a="https:",_="pageview",u="event",i="error",o=d.console,c="doNotTrack",w=d.navigator,s=d.location,b=s.host,l=d.document,p=w.userAgent,f="Not sending request ",h=f+"when ",x=y,O=encodeURIComponent,E=decodeURIComponent,S=JSON.stringify,k=d.addEventListener,M="https://"+e,q=l.documentElement||{},A="language",$="Height",j="scroll",D=w.userAgentData,C=j+$,H="offset"+$,P="client"+$,R="pagehide",T="platform",U="platformVersion",I="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),N=d.screen,z=l.currentScript||l.querySelector('script[src*="'+e+'"]');m=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){m("Error in your "+t+" function:",e)},W=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},G=function(t){return"string"==typeof t},J=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},L=function(t,e){return t&&t.getAttribute("data-"+e)},Y=function(t){return Array.isArray(t)?t:G(t)&&t.length?t.split(/, ?/):[]},Z=function(t){return t&&t.constructor===Object},K=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},it=function(t){return"function"==typeof t},ot="namespace",ct=t[ot]||L(z,ot)||"sa",st=function(t,e){var n=d[ct+"_metadata"];Z(n)&&(t=K(t,n));var r=d[Mt];if(!it(r))return Mt&&m(Mt+" not found, set window."+Mt),t;try{return K(t,r.call(d,K(t,e)))}catch(a){F("metadata",a)}},ut=t.strictUtm||L(z,"strict-utm")==r,lt=function(i,t){tt=!i&&nt("q")?"":y;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");tt!==y&&0"); //# sourceMappingURL=proxy.js.map \ No newline at end of file diff --git a/dist/v12/custom/proxy.js.map b/dist/v12/custom/proxy.js.map index 255b099d..fe419aa0 100644 --- a/dist/v12/custom/proxy.js.map +++ b/dist/v12/custom/proxy.js.map @@ -1 +1 @@ -{"version":3,"file":"proxy.source.js","sources":["proxy.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var p;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n p = !ignoreSource && collectMetricByString(\"p\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (p !== falseVar && i > 0 && keyValue.slice(i + 1))\n p += (p ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n p = p || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = trueVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n p: p,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_proxy_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","p","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","protocol","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"proxy.source.js","sources":["proxy.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = trueVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_proxy_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","protocol","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue"],"mappings":"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"} \ No newline at end of file diff --git a/dist/v12/light.js b/dist/v12/light.js index 00e082d9..5ad37a9a 100644 --- a/dist/v12/light.js +++ b/dist/v12/light.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-08-12; 12b3; SRI-version; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-16; 12b3; SRI-version; v12) */ !function(l,e,t,f){try{var u=undefined,n="https:",r=l.console,a="doNotTrack",m=l.navigator,p=l.location,g=p.host,i=l.document,o=m.userAgent,c="Not sending request ",h=!1,s=encodeURIComponent,d=decodeURIComponent,v=JSON.stringify,y=l.addEventListener,_="https://queue."+t,b=(i.documentElement,"language"),w=m.userAgentData,O="platform",S="platformVersion",j="https://docs.simpleanalytics.com",k=/(bot|spider|crawl)/i.test(o)&&!/(cubot)/i.test(o),E=i.currentScript||i.querySelector('script[src*="'+t+'"]');f=function(){var e=[].slice.call(arguments);return e.unshift("Simple Analytics:"),Function.prototype.apply.call(r.warn,r,e)};var q=function(e){return"string"==typeof e},x=function(e,t){return e&&e.getAttribute("data-"+t)},A=function(){for(var e,t,n,r={},a=arguments,i=0;i>e/4).toString(16)})}catch(r){return e.replace(n,function(e){var t=16*Math.random()|0;return(e<2?t:3&t|8).toString(16)})}},N=function(e){return"function"==typeof e},R="namespace",U=e[R]||x(E,R)||"sa",V=e.strictUtm||"true"==x(E,"strict-utm"),B=U+"_loaded";if(1==l[B])return f(c+"twice");l.sa_event_loaded=!0,l[B]=!0;var C,T=function(t,e,n){t=n?t:A(J,M,t),m.brave&&!n&&(t.brave=!0),m._duckduckgoloader_&&!n&&(t.duck=!0),(new Image).src=_+"/simple.gif?"+Object.keys(t).filter(function(e){return t[e]!=u}).map(function(e){return s(e)+"="+s(t[e])}).join("&")+"&time="+Date.now()},F=e.hostname||x(E,"hostname"),H=F||g,z={version:"cdn_light_12",hostname:H};e.mode||x(E,"mode");try{C=Intl.DateTimeFormat().resolvedOptions().timeZone}catch(X){f(X)}k&&(z.bot=!0);var J=A(z,{ua:o,https:p.protocol==n,timezone:C,page_id:I(),session_id:I()});if(J.sri=!0,w&&(J.mobile=w.mobile,J.brands=v(w.brands)),H!==g&&(J.hostname_original=g),a in m&&"1"==m[a])return f("Not sending request when "+a+" is enabled. See "+j+"/dnt");-1!=g.indexOf(".")&&!/^[0-9.:]+$/.test(g)||F||f("Set hostname on "+g+". See "+j+"/overwrite-domain-name");var L,M={},P=(e.referrer||x(E,"referrer")||i.referrer||"").replace(g,H).replace(/^https?:\/\/((m|l|w{2,3}([0-9]+)?)\.)?([^?#]+)(.*)$/,"$4").replace(/^([^/]+)$/,"$1")||u,Z=function(e,t){var n=A(z,{type:"append",original_id:t?e:J.page_id});if(t||!m.sendBeacon)T(n,0,!0);else try{m.sendBeacon.bind(m)(_+"/append",v(n))}catch(r){T(n,0,!0)}};y("pagehide",Z,!1);var G,K,Q=function(e){var t="";try{t=e||d(p.pathname)}catch(X){f(X)}return t},W=function(e,t,n,r,a,i){e&&Z(""+J.page_id,!0),J.page_id=I();var o,c=H+Q(),s=(o=t,(r||p.search).slice(1).split("&").filter(function(e){return!o&&new RegExp("^((utm_)"+(V?"":"?")+"(source|medium|content|term|campaign)"+(V?"":"|ref")+")=","i").test(e)}).join("&")||u);T({id:J.page_id,type:"pageview",referrer:!t||n?P:null,query:s}),P=c,0};!function(e,t,n,r){!r&&N(n)&&(r=n);var a,i;N(r);q(t)&&-1 0 && keyValue.slice(i + 1)) - p += (p ? "," : "") + keyValue.slice(0, i); + if (k !== falseVar && i > 0 && keyValue.slice(i + 1)) + k += (k ? "," : "") + keyValue.slice(0, i); /** endif **/ var ignore = ignoreSource || !collectMetricByString("ut"); @@ -288,7 +288,7 @@ .join("&"); /** if ignoremetrics **/ - p = p || undefinedVar; + k = k || undefinedVar; /** endif **/ return q || undefinedVar; }; @@ -789,7 +789,7 @@ referrer: !deleteSourceInfo || sameSite ? referrer : null, query: query, /** if ignoremetrics **/ - p: p, + k: k, /** endif **/ /** if metadata **/ diff --git a/test/unit/pageview-query.test.js b/test/unit/pageview-query.test.js index 25a11f57..bccac339 100644 --- a/test/unit/pageview-query.test.js +++ b/test/unit/pageview-query.test.js @@ -51,7 +51,7 @@ describe("pageview query", function () { ); expect(req, "pageview request").to.exist; const url = new URL(req.url); - expect(url.searchParams.get("p")).to.equal("gclid,foo"); + expect(url.searchParams.get("k")).to.equal("gclid,foo"); expect(req.url).not.to.include("secret"); expect(req.url).not.to.include("another"); done(); @@ -60,7 +60,7 @@ describe("pageview query", function () { it("allows parameter name collection to be ignored", function (done) { const dom = createDOM({ - settings: { autoCollect: false, ignoreMetrics: "params" }, + settings: { autoCollect: false, ignoreMetrics: "querykeys" }, }); dom.window.sa_pageview("/manual?gclid=secret"); @@ -71,7 +71,7 @@ describe("pageview query", function () { ); expect(req, "pageview request").to.exist; const url = new URL(req.url); - expect(url.searchParams.has("p")).to.equal(false); + expect(url.searchParams.has("k")).to.equal(false); done(); }, 10); }); From 3a6d633342827fd64d45e17aa53e32ca7ca04aca Mon Sep 17 00:00:00 2001 From: Simple Analytics Codex Date: Wed, 16 Sep 2026 12:50:17 +0200 Subject: [PATCH 51/62] Fix v12 CI after main sync --- .github/workflows/testing.yml | 133 ---------------------------------- package.json | 1 + pnpm-lock.yaml | 10 +++ 3 files changed, 11 insertions(+), 133 deletions(-) delete mode 100644 .github/workflows/testing.yml diff --git a/.github/workflows/testing.yml b/.github/workflows/testing.yml deleted file mode 100644 index 27ff514b..00000000 --- a/.github/workflows/testing.yml +++ /dev/null @@ -1,133 +0,0 @@ -name: Testing Suite - -on: - pull_request: - types: [opened, synchronize] - push: - branches: - - main - workflow_dispatch: - -env: - NODE_VERSION: 22.16 - -jobs: - linting: - runs-on: ubuntu-latest - if: github.event_name == 'pull_request' - - steps: - - uses: actions/checkout@v4 - - - name: Use Node.js ${{ env.NODE_VERSION }} - uses: actions/setup-node@v4 - with: - node-version: ${{ env.NODE_VERSION }} - - - name: Run npm ci - run: npm ci - - - name: Run npm prettier - continue-on-error: true - run: | - ./node_modules/.bin/prettier --check . || echo "::warning::Prettier found formatting issues. Fix it locally by running './node_modules/.bin/prettier --write .'" - - - name: Run ESLint - run: ./node_modules/.bin/eslint --ext .js . - - unit-tests: - runs-on: ubuntu-latest - - steps: - - uses: actions/checkout@v4 - - - name: Use Node.js ${{ env.NODE_VERSION }} - uses: actions/setup-node@v4 - with: - node-version: ${{ env.NODE_VERSION }} - - - name: Run npm ci - run: npm ci - - - name: Build project - run: npm run build - - - name: Run unit tests - run: npm run test:unit - env: - CI: true - NODE_ENV: test - - build: - runs-on: ubuntu-latest - needs: unit-tests - if: (github.event_name == 'push' && github.ref == 'refs/heads/main') || github.event_name == 'workflow_dispatch' - - steps: - - uses: actions/checkout@v4 - - - name: Use Node.js ${{ env.NODE_VERSION }} - uses: actions/setup-node@v4 - with: - node-version: ${{ env.NODE_VERSION }} - - - name: Run npm ci - run: npm ci - - - name: Build project - run: npm run build - - - name: Commit build changes - run: | - git config --local user.email "action@github.com" - git config --local user.name "GitHub Action" - git add dist/ - git diff --staged --quiet || git commit -m "Update build artifacts [skip ci]" - git push - - browserstack: - runs-on: ubuntu-latest - needs: [unit-tests, linting, build] - if: (github.event_name == 'push' && github.ref == 'refs/heads/main') || github.event_name == 'workflow_dispatch' - - steps: - - name: "BrowserStack Env Setup" - uses: "browserstack/github-actions/setup-env@master" - with: - username: ${{ secrets.BROWSERSTACK_USERNAME }} - access-key: ${{ secrets.BROWSERSTACK_ACCESS_KEY }} - - - name: "Start BrowserStackLocal Tunnel" - uses: "browserstack/github-actions/setup-local@master" - with: - local-testing: "start" - local-logging-level: "all-logs" - local-identifier: "random" - - - uses: actions/checkout@v4 - - - name: Use Node.js ${{ env.NODE_VERSION }} - uses: actions/setup-node@v4 - with: - node-version: ${{ env.NODE_VERSION }} - - - name: Run npm ci - run: npm ci - - - name: Build project - run: npm run build - - - name: Run BrowserStack tests - run: node ./test/index.js - env: - CI: true - NODE_ENV: test - DEBUG: false - LOCATION: ${{ secrets.LOCATION }} - BROWSERSTACK_USERNAME: ${{ secrets.BROWSERSTACK_USERNAME }} - BROWSERSTACK_ACCESS_KEY: ${{ secrets.BROWSERSTACK_ACCESS_KEY }} - - - name: "Stop BrowserStackLocal" - uses: "browserstack/github-actions/setup-local@master" - with: - local-testing: "stop" diff --git a/package.json b/package.json index 5405eb66..639b29a9 100644 --- a/package.json +++ b/package.json @@ -38,6 +38,7 @@ }, "devDependencies": { "@types/node": "24.13.3", + "acorn": "^8.18.0", "browserstack-local": "^1.5.1", "chai": "^4.2.0", "dotenv": "^8.2.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index cd32086a..e88fece0 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -15,6 +15,9 @@ importers: '@types/node': specifier: 24.13.3 version: 24.13.3 + acorn: + specifier: ^8.18.0 + version: 8.18.0 browserstack-local: specifier: ^1.5.1 version: 1.5.1(supports-color@5.5.0) @@ -213,6 +216,11 @@ packages: engines: {node: '>=0.4.0'} hasBin: true + acorn@8.18.0: + resolution: {integrity: sha512-lGq+9yr1/GuAWaVYIHRjvvySG5/4VfKIvC8EWxStPdcDh/Ka7FG3twP6v4d5BkravUilhIAsG4Qj83t02LWUPQ==} + engines: {node: '>=0.4.0'} + hasBin: true + agent-base@6.0.2: resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} engines: {node: '>= 6.0.0'} @@ -1910,6 +1918,8 @@ snapshots: acorn@7.1.1: {} + acorn@8.18.0: {} + agent-base@6.0.2(supports-color@5.5.0): dependencies: debug: 4.3.4(supports-color@5.5.0) From a2a876cd1e1f03ff1ef595b37ae9ad75d5e160ab Mon Sep 17 00:00:00 2001 From: "simple-analytics-ai[bot]" <313929673+simple-analytics-ai[bot]@users.noreply.github.com> Date: Thu, 15 Oct 2026 15:08:11 +0200 Subject: [PATCH 52/62] Document tracker compatibility and size priorities for agents (#115) * Document tracker compatibility and size priorities for agents * Update AGENTS.md Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --------- Co-authored-by: Simple Analytics Codex Co-authored-by: Adriaan <1079135+adriaandotcom@users.noreply.github.com> Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- AGENTS.md | 30 ++++++++++++++++-------------- 1 file changed, 16 insertions(+), 14 deletions(-) diff --git a/AGENTS.md b/AGENTS.md index 57a07594..b785a1b5 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -1,21 +1,23 @@ -# Agent Instructions +# Agent instructions -This repository contains the public scripts for Simple Analytics. When making changes keep the following points in mind. +Before working here, read the shared [Simple Analytics instructions](https://github.com/simpleanalytics/ide-config/blob/main/AGENTS.md) through the approved GitHub access method. Apply them alongside applicable parent and nested instructions; more specific instructions take precedence. -## Development +## Tracker changes -- Use **Node.js 22.16** (see `.nvmrc`). -- Run `npm run build` to compile the scripts. This generates the files in `dist/` which should be committed. -- Format code with Prettier before committing. You can run `npx prettier -w .` or validate with `npm run prettier`. +1. **Minimize shipped bytes.** Keep changes small and reuse existing helpers and variables. Measure minified and gzip byte differences for affected scripts against the target branch using the same build and compression settings. Test proposed optimizations: extracting repeated strings can increase gzip size. -## Testing +2. **Preserve existing installations.** Unless the user explicitly accepts a behavior change, preserve existing settings and integrations. Check affected combinations against the [customer documentation](https://docs.simpleanalytics.com/), including manual pageviews, query handling, attribution, namespaces, ignored metrics, metadata, and automatic events. Report concrete before/after effects on customer data, event names, and counts, separately from additions that leave existing installations unchanged. -- Execute `npm run test:unit` to run the unit tests -- When adding a new feature or fixing a bug, please add a test. -- For every change, run `npm run build` to ensure the test uses the latest compiled version. -- Ignore most files in the `dist/` directory when checking for diffs, just check `dist/latest/latest.dev.js` and `dist/latest/auto-events.js` (whichever is relevant). -- Only tests in `test/unit/` are relevant for the AI and agents (it can run without internet access). +3. **Prefer simple implementations.** Add fallbacks, polling, abstractions, or compatibility layers only for a demonstrated requirement. Respect explicitly accepted tradeoffs, especially for unused beta helpers, rather than adding speculative compatibility machinery. -## References +4. **Preserve website behavior.** Tracking must respect cancelled actions, existing handlers, form validation, submitter settings, modified clicks, new tabs, and downloads. Let the browser or website own navigation and submission; send tracking without forcing either action. -Most work happens in `src/` with `compile.js` creating the distributable versions. Read `README.md` for more details about contributing and running scripts locally. +5. **Keep collection deliberate.** Honor collection settings and opt-outs. Distinguish query-parameter names from values when checking what is sent. Keep form field values out of automatic form tracking, sanitize automatically reported URLs, and keep extra diagnostic requests such as 404 confirmation opt-in. Make changes to collection defaults explicit for review. + +6. **Preserve browser and build compatibility.** Keep visitor-facing output ES5-compatible and respect feature boundaries such as event-free `light.js`. Build affected scripts from source and commit their generated distributions. Review source and build inputs first, using relevant generated output to verify those changes. Keep previously published pinned versions and their SRI bytes unchanged unless explicitly requested. + +## Validation and review + +7. **Verify affected behavior locally.** Use the Node and pnpm versions declared by the repository configuration and the commands available in `package.json`; see `README.md` for setup. For script changes, rebuild before focused before/after payload and browser-interaction checks. Prefer the offline suites in `test/unit/` for local runs. Follow the shared testing policy and ensure committed tests run with declared dependencies. Leave the full BrowserStack matrix to CI unless explicitly requested, and report local verification separately from remote CI. + +8. **Keep PRs easy to review.** Prefer one logical change per PR. Group related fixes under one issue, state dependencies and merge order, and branch from and target the integration branch requested by the user. Keep unrelated test-infrastructure repairs separate from tracker behavior changes. From 38248a0eda32803348106f8c5beef457e915ed4a Mon Sep 17 00:00:00 2001 From: "simple-analytics-ai[bot]" <313929673+simple-analytics-ai[bot]@users.noreply.github.com> Date: Thu, 15 Oct 2026 15:16:08 +0200 Subject: [PATCH 53/62] Support inline events in the main v12 script (#106) * Support inline event attributes in the main v12 tracker Requested: integrate documented inline events without overengineering, keep the script small and website behavior intact, and open a separate PR based on and targeting v12. Use delegated click/submit handlers and keepalive GETs with the existing image fallback. Preserve installed inline helpers and make confirmed 404 detection opt-in. Add focused tests and patch the vulnerable Handlebars build dependency. * Simplify inline events after review Requested: remove compatibility checks for the beta helper, measure repeated attribute strings, clarify the DOM alias, and shorten submit-button metadata extraction. Keep literals because sharing them increases gzip size. Prefer trimmed, capped submitter labels and scan title/body text for 404s. Address the related bot feedback by running the complete unit suite in CI. * Normalize inline submit button label whitespace Requested: address scripts PR #106 review comment 4282258759 so formatting a button across multiple lines does not fragment button_text metadata. Collapse whitespace before trimming and applying the existing 200-character limit. Add a regression for equivalent compact and indented button markup, and regenerate the affected tracker bundles. Verification: regression fails on the previous compiled tracker; all 33 unit tests pass after the fix. Build, formatting, and diff checks pass. --------- Co-authored-by: Simple Analytics Codex --- .github/workflows/browserstack.yml | 3 + dist/latest/cloudflare.js | 94 +++++++- dist/latest/custom/app.js | 4 +- dist/latest/custom/app.js.map | 2 +- dist/latest/custom/e.js | 4 +- dist/latest/custom/e.js.map | 2 +- dist/latest/custom/latest.dev.js | 94 +++++++- dist/latest/custom/latest.js | 4 +- dist/latest/custom/latest.js.map | 2 +- dist/latest/custom/light.js | 4 +- dist/latest/custom/light.js.map | 2 +- dist/latest/custom/proxy.js | 4 +- dist/latest/custom/proxy.js.map | 2 +- dist/latest/hello.js | 4 +- dist/latest/hello.js.map | 2 +- dist/latest/latest.dev.js | 94 +++++++- dist/latest/latest.js | 4 +- dist/latest/latest.js.map | 2 +- dist/latest/light.js | 4 +- dist/latest/light.js.map | 2 +- dist/v12/app.js | 4 +- dist/v12/app.js.map | 2 +- dist/v12/custom/app.js | 4 +- dist/v12/custom/app.js.map | 2 +- dist/v12/custom/light.js | 4 +- dist/v12/custom/light.js.map | 2 +- dist/v12/custom/proxy.js | 4 +- dist/v12/custom/proxy.js.map | 2 +- dist/v12/light.js | 4 +- dist/v12/light.js.map | 2 +- package.json | 4 +- pnpm-lock.yaml | 334 ++++++++++++++++++++++++++++- src/default.js | 94 +++++++- test/unit/inline-events.test.js | 316 +++++++++++++++++++++++++++ 34 files changed, 1042 insertions(+), 69 deletions(-) create mode 100644 test/unit/inline-events.test.js diff --git a/.github/workflows/browserstack.yml b/.github/workflows/browserstack.yml index 659668cd..5b0047cb 100644 --- a/.github/workflows/browserstack.yml +++ b/.github/workflows/browserstack.yml @@ -54,6 +54,9 @@ jobs: - name: Test BrowserStack matrix selection run: pnpm run test:matrix + - name: Run unit tests + run: pnpm run build && pnpm run test:unit + - name: Prettier check (report only, no writes or commits) if: always() run: | diff --git a/dist/latest/cloudflare.js b/dist/latest/cloudflare.js index c6c62a83..e6b4bf20 100644 --- a/dist/latest/cloudflare.js +++ b/dist/latest/cloudflare.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-16; b9db; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-15; 6cf3; v12) */ /* eslint-env browser */ (function ( @@ -298,7 +298,7 @@ // // Send data via image - var sendData = function (data, callback, onlyThisData) { + var sendData = function (data, callback, onlyThisData, keepalive) { data = onlyThisData ? data : assign(payload, page, data); if (nav.brave && !onlyThisData) data.brave = trueVar; @@ -310,7 +310,7 @@ image.onerror = callback; image.onload = callback; } - image.src = + var imageUrl = fullApiUrl + "/simple.gif?" + Object.keys(data) @@ -327,6 +327,23 @@ .join("&") + "&time=" + Date.now(); + + // Inline events must survive navigation without taking over links or forms. + if (keepalive && window.fetch) { + try { + window + .fetch(imageUrl, { + keepalive: trueVar, + mode: "no-cors", + credentials: "omit", + }) + .catch(function () { + image.src = imageUrl; + }); + return; + } catch (error) {} + } + image.src = imageUrl; }; // Customers can overwrite their hostname, here we check for that @@ -905,7 +922,7 @@ var validTypes = ["string", "number"]; - var sendEvent = function (event, metadata, callbackRaw) { + var sendEvent = function (event, metadata, callbackRaw, keepalive) { if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata; var eventIsFunction = isFunction(event); @@ -953,7 +970,9 @@ metadata: stringify(metadata), }), - callback + callback, + undefinedVar, + keepalive ); } }; @@ -982,6 +1001,71 @@ : sendEvent(queue[event]); } } + + var inlineEvent = function (event) { + var element = event.target; + while ( + element && + element !== doc && + (!element.getAttribute || attr(element, "simple-event") === null) + ) + element = element.parentNode; + + if (!element || element === doc) return; + var isForm = element.tagName === "FORM"; + var name = attr(element, "simple-event"); + if (!name || isForm !== (event.type === "submit")) return; + + var metadata = { tag: element.tagName.toLowerCase() }; + var attributes = element.attributes; + for (var i = 0; i < attributes.length; i++) { + var attribute = attributes[i]; + if (attribute.name.indexOf("data-simple-event-") === 0) + metadata[attribute.name.slice(18).replace(/-/g, "_")] = + attribute.value; + } + if (isForm) { + var button = event.submitter; + metadata.button_text = button + ? (button.textContent || button.value || "") + .replace(/\s+/g, " ") + .trim() + .slice(0, 200) + : ""; + } + sendEvent(name, metadata, undefinedVar, trueVar); + }; + + doc.addEventListener("click", inlineEvent, falseVar); + doc.addEventListener("submit", inlineEvent, falseVar); + + // 404 confirmation adds a request, so existing installs must opt in. + if ( + overwriteOptions.detect404 === trueVar || + attr(scriptElement, "detect-404") == trueText + ) { + var detect404 = function () { + if ( + !/\b404\b/.test(doc.title + " " + (doc.body && doc.body.textContent)) + ) + return; + try { + var request = new window.XMLHttpRequest(); + request.open("HEAD", loc.href, trueVar); + request.onload = function () { + if (request.status === 404) + sendEvent("page_404", { + url: loc.protocol + "//" + definedHostname + loc.pathname, + status: 404, + }); + }; + request.send(); + } catch (error) {} + }; + if (doc.readyState === "loading") + doc.addEventListener("DOMContentLoaded", detect404, falseVar); + else detect404(); + } } catch (e) { sendError(e); } diff --git a/dist/latest/custom/app.js b/dist/latest/custom/app.js index 50e7c3c7..80658aca 100644 --- a/dist/latest/custom/app.js +++ b/dist/latest/custom/app.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-16; 2be9; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-15; dced; v12) */ -!function(d,t,e,n,m){try{var v=undefined,g=!0,y=!1,r="true",a="https:",_="pageview",u="event",i="error",o=d.console,c="doNotTrack",w=d.navigator,s=d.location,b=s.host,l=d.document,p=w.userAgent,f="Not sending request ",h=f+"when ",O=y,x=encodeURIComponent,E=decodeURIComponent,S=JSON.stringify,k=d.addEventListener,M="https://"+e,q=l.documentElement||{},A="language",$="Height",j="scroll",D=w.userAgentData,C=j+$,H="offset"+$,R="client"+$,P="pagehide",T="platform",U="platformVersion",I="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),N=d.screen,z=l.currentScript||l.querySelector('script[src*="'+e+'"]');m=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){m("Error in your "+t+" function:",e)},W=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},G=function(t){return"string"==typeof t},J=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},L=function(t,e){return t&&t.getAttribute("data-"+e)},Y=function(t){return Array.isArray(t)?t:G(t)&&t.length?t.split(/, ?/):[]},Z=function(t){return t&&t.constructor===Object},K=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},it=function(t){return"function"==typeof t},ot="namespace",ct=t[ot]||L(z,ot)||"sa",st=function(t,e){var n=d[ct+"_metadata"];Z(n)&&(t=K(t,n));var r=d[Mt];if(!it(r))return Mt&&m(Mt+" not found, set window."+Mt),t;try{return K(t,r.call(d,K(t,e)))}catch(a){F("metadata",a)}},ut=t.strictUtm||L(z,"strict-utm")==r,lt=function(i,t){tt=!i&&nt("q")?"":y;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");tt!==y&&0"); +!function(h,t,e,n,m){try{var v=undefined,g=!0,y=!1,r="true",a="https:",_="pageview",l="event",i="error",o=h.console,c="doNotTrack",b=h.navigator,s=h.location,w=s.host,u=h.document,p=b.userAgent,f="Not sending request ",d=f+"when ",O=y,x=encodeURIComponent,E=decodeURIComponent,M=JSON.stringify,S=h.addEventListener,k="https://"+e,A=u.documentElement||{},q="language",C="Height",D="scroll",$=b.userAgentData,j=D+C,H="offset"+C,R="client"+C,L="pagehide",N="platform",P="platformVersion",T="https://docs.simpleanalytics.com",U=0,I=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),V=h.screen,B=u.currentScript||u.querySelector('script[src*="'+e+'"]');m=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){m("Error in your "+t+" function:",e)},z=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},W=function(t){return"string"==typeof t},G=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},J=function(t,e){return t&&t.getAttribute("data-"+e)},X=function(t){return Array.isArray(t)?t:W(t)&&t.length?t.split(/, ?/):[]},Y=function(t){return t&&t.constructor===Object},Z=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},it=function(t){return"function"==typeof t},ot="namespace",ct=t[ot]||J(B,ot)||"sa",st=function(t,e){var n=h[ct+"_metadata"];Y(n)&&(t=Z(t,n));var r=h[kt];if(!it(r))return kt&&m(kt+" not found, set window."+kt),t;try{return Z(t,r.call(h,Z(t,e)))}catch(a){F("metadata",a)}},ut=t.strictUtm||J(B,"strict-utm")==r,lt=function(i,t){tt=!i&&nt("q")?"":y;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");tt!==y&&0"); //# sourceMappingURL=app.js.map \ No newline at end of file diff --git a/dist/latest/custom/app.js.map b/dist/latest/custom/app.js.map index d49fd42a..81a83e2d 100644 --- a/dist/latest/custom/app.js.map +++ b/dist/latest/custom/app.js.map @@ -1 +1 @@ -{"version":3,"file":"app.source.js","sources":["app.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_app_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","protocol","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"app.source.js","sources":["app.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData, keepalive) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n var imageUrl =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n\n // Inline events must survive navigation without taking over links or forms.\n if (keepalive && window.fetch) {\n try {\n window\n .fetch(imageUrl, {\n keepalive: trueVar,\n mode: \"no-cors\",\n credentials: \"omit\",\n })\n .catch(function () {\n image.src = imageUrl;\n });\n return;\n } catch (error) {}\n }\n image.src = imageUrl;\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw, keepalive) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback,\n undefinedVar,\n keepalive\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n\n var inlineEvent = function (event) {\n var element = event.target;\n while (\n element &&\n element !== doc &&\n (!element.getAttribute || attr(element, \"simple-event\") === null)\n )\n element = element.parentNode;\n\n if (!element || element === doc) return;\n var isForm = element.tagName === \"FORM\";\n var name = attr(element, \"simple-event\");\n if (!name || isForm !== (event.type === \"submit\")) return;\n\n var metadata = { tag: element.tagName.toLowerCase() };\n var attributes = element.attributes;\n for (var i = 0; i < attributes.length; i++) {\n var attribute = attributes[i];\n if (attribute.name.indexOf(\"data-simple-event-\") === 0)\n metadata[attribute.name.slice(18).replace(/-/g, \"_\")] =\n attribute.value;\n }\n if (isForm) {\n var button = event.submitter;\n metadata.button_text = button\n ? (button.textContent || button.value || \"\")\n .replace(/\\s+/g, \" \")\n .trim()\n .slice(0, 200)\n : \"\";\n }\n sendEvent(name, metadata, undefinedVar, trueVar);\n };\n\n doc.addEventListener(\"click\", inlineEvent, falseVar);\n doc.addEventListener(\"submit\", inlineEvent, falseVar);\n\n // 404 confirmation adds a request, so existing installs must opt in.\n if (\n overwriteOptions.detect404 === trueVar ||\n attr(scriptElement, \"detect-404\") == trueText\n ) {\n var detect404 = function () {\n if (\n !/\\b404\\b/.test(doc.title + \" \" + (doc.body && doc.body.textContent))\n )\n return;\n try {\n var request = new window.XMLHttpRequest();\n request.open(\"HEAD\", loc.href, trueVar);\n request.onload = function () {\n if (request.status === 404)\n sendEvent(\"page_404\", {\n url: loc.protocol + \"//\" + definedHostname + loc.pathname,\n status: 404,\n });\n };\n request.send();\n } catch (error) {}\n };\n if (doc.readyState === \"loading\")\n doc.addEventListener(\"DOMContentLoaded\", detect404, falseVar);\n else detect404();\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_app_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","keepalive","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","imageUrl","key","fetch","mode","credentials","catch","src","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","protocol","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue","detect404","inlineEvent","element","target","parentNode","isForm","tagName","button","tag","toLowerCase","attributes","submitter","button_text","textContent","trim","title","request","XMLHttpRequest","open","href","status","url","send","readyState"],"mappings":"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"} \ No newline at end of file diff --git a/dist/latest/custom/e.js b/dist/latest/custom/e.js index 56af8e4a..edf0362a 100644 --- a/dist/latest/custom/e.js +++ b/dist/latest/custom/e.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-16; a33e; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-15; a84b; v12) */ -!function(d,t,e,n,m){try{var v=undefined,g=!0,y=!1,r="true",a="https:",_="pageview",u="event",i="error",o=d.console,c="doNotTrack",w=d.navigator,s=d.location,b=s.host,l=d.document,p=w.userAgent,f="Not sending request ",h=f+"when ",O=y,x=encodeURIComponent,E=decodeURIComponent,S=JSON.stringify,k=d.addEventListener,M="https://"+e,q=l.documentElement||{},A="language",$="Height",j="scroll",D=w.userAgentData,C=j+$,H="offset"+$,R="client"+$,P="pagehide",T="platform",U="platformVersion",I="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),N=d.screen,z=l.currentScript||l.querySelector('script[src*="'+e+'"]');m=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){m("Error in your "+t+" function:",e)},W=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},G=function(t){return"string"==typeof t},J=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},L=function(t,e){return t&&t.getAttribute("data-"+e)},Y=function(t){return Array.isArray(t)?t:G(t)&&t.length?t.split(/, ?/):[]},Z=function(t){return t&&t.constructor===Object},K=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},it=function(t){return"function"==typeof t},ot="namespace",ct=t[ot]||L(z,ot)||"sa",st=function(t,e){var n=d[ct+"_metadata"];Z(n)&&(t=K(t,n));var r=d[Mt];if(!it(r))return Mt&&m(Mt+" not found, set window."+Mt),t;try{return K(t,r.call(d,K(t,e)))}catch(a){F("metadata",a)}},ut=t.strictUtm||L(z,"strict-utm")==r,lt=function(i,t){tt=!i&&nt("q")?"":y;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");tt!==y&&0"); +!function(h,t,e,n,v){try{var m=undefined,g=!0,y=!1,r="true",a="https:",_="pageview",l="event",i="error",o=h.console,c="doNotTrack",b=h.navigator,s=h.location,w=s.host,u=h.document,f=b.userAgent,p="Not sending request ",d=p+"when ",O=y,x=encodeURIComponent,E=decodeURIComponent,M=JSON.stringify,S=h.addEventListener,k="https://"+e,A=u.documentElement||{},q="language",C="Height",D="scroll",$=b.userAgentData,j=D+C,H="offset"+C,R="client"+C,L="pagehide",N="platform",P="platformVersion",T="https://docs.simpleanalytics.com",U=0,I=/(bot|spider|crawl)/i.test(f)&&!/(cubot)/i.test(f),V=h.screen,B=u.currentScript||u.querySelector('script[src*="'+e+'"]');v=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){v("Error in your "+t+" function:",e)},z=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},W=function(t){return"string"==typeof t},G=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},J=function(t,e){return t&&t.getAttribute("data-"+e)},X=function(t){return Array.isArray(t)?t:W(t)&&t.length?t.split(/, ?/):[]},Y=function(t){return t&&t.constructor===Object},Z=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},it=function(t){return"function"==typeof t},ot="namespace",ct=t[ot]||J(B,ot)||"sa",st=function(t,e){var n=h[ct+"_metadata"];Y(n)&&(t=Z(t,n));var r=h[kt];if(!it(r))return kt&&v(kt+" not found, set window."+kt),t;try{return Z(t,r.call(h,Z(t,e)))}catch(a){F("metadata",a)}},ut=t.strictUtm||J(B,"strict-utm")==r,lt=function(i,t){tt=!i&&nt("q")?"":y;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");tt!==y&&0"); //# sourceMappingURL=e.js.map \ No newline at end of file diff --git a/dist/latest/custom/e.js.map b/dist/latest/custom/e.js.map index 7d67aee9..9bf41c9f 100644 --- a/dist/latest/custom/e.js.map +++ b/dist/latest/custom/e.js.map @@ -1 +1 @@ -{"version":3,"file":"e.source.js","sources":["e.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_events_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","protocol","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"e.source.js","sources":["e.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData, keepalive) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n var imageUrl =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n\n // Inline events must survive navigation without taking over links or forms.\n if (keepalive && window.fetch) {\n try {\n window\n .fetch(imageUrl, {\n keepalive: trueVar,\n mode: \"no-cors\",\n credentials: \"omit\",\n })\n .catch(function () {\n image.src = imageUrl;\n });\n return;\n } catch (error) {}\n }\n image.src = imageUrl;\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw, keepalive) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback,\n undefinedVar,\n keepalive\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n\n var inlineEvent = function (event) {\n var element = event.target;\n while (\n element &&\n element !== doc &&\n (!element.getAttribute || attr(element, \"simple-event\") === null)\n )\n element = element.parentNode;\n\n if (!element || element === doc) return;\n var isForm = element.tagName === \"FORM\";\n var name = attr(element, \"simple-event\");\n if (!name || isForm !== (event.type === \"submit\")) return;\n\n var metadata = { tag: element.tagName.toLowerCase() };\n var attributes = element.attributes;\n for (var i = 0; i < attributes.length; i++) {\n var attribute = attributes[i];\n if (attribute.name.indexOf(\"data-simple-event-\") === 0)\n metadata[attribute.name.slice(18).replace(/-/g, \"_\")] =\n attribute.value;\n }\n if (isForm) {\n var button = event.submitter;\n metadata.button_text = button\n ? (button.textContent || button.value || \"\")\n .replace(/\\s+/g, \" \")\n .trim()\n .slice(0, 200)\n : \"\";\n }\n sendEvent(name, metadata, undefinedVar, trueVar);\n };\n\n doc.addEventListener(\"click\", inlineEvent, falseVar);\n doc.addEventListener(\"submit\", inlineEvent, falseVar);\n\n // 404 confirmation adds a request, so existing installs must opt in.\n if (\n overwriteOptions.detect404 === trueVar ||\n attr(scriptElement, \"detect-404\") == trueText\n ) {\n var detect404 = function () {\n if (\n !/\\b404\\b/.test(doc.title + \" \" + (doc.body && doc.body.textContent))\n )\n return;\n try {\n var request = new window.XMLHttpRequest();\n request.open(\"HEAD\", loc.href, trueVar);\n request.onload = function () {\n if (request.status === 404)\n sendEvent(\"page_404\", {\n url: loc.protocol + \"//\" + definedHostname + loc.pathname,\n status: 404,\n });\n };\n request.send();\n } catch (error) {}\n };\n if (doc.readyState === \"loading\")\n doc.addEventListener(\"DOMContentLoaded\", detect404, falseVar);\n else detect404();\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_events_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","keepalive","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","imageUrl","key","fetch","mode","credentials","catch","src","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","protocol","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue","detect404","inlineEvent","element","target","parentNode","isForm","tagName","button","tag","toLowerCase","attributes","submitter","button_text","textContent","trim","title","request","XMLHttpRequest","open","href","status","url","send","readyState"],"mappings":"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"} \ No newline at end of file diff --git a/dist/latest/custom/latest.dev.js b/dist/latest/custom/latest.dev.js index 8dc894a5..3d22c764 100644 --- a/dist/latest/custom/latest.dev.js +++ b/dist/latest/custom/latest.dev.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-16; 3665; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-15; e9a1; v12) */ /* eslint-env browser */ (function ( @@ -296,7 +296,7 @@ // // Send data via image - var sendData = function (data, callback, onlyThisData) { + var sendData = function (data, callback, onlyThisData, keepalive) { data = onlyThisData ? data : assign(payload, page, data); if (nav.brave && !onlyThisData) data.brave = trueVar; @@ -309,7 +309,7 @@ image.onerror = callback; image.onload = callback; } - image.src = + var imageUrl = fullApiUrl + "/simple.gif?" + Object.keys(data) @@ -326,6 +326,23 @@ .join("&") + "&time=" + Date.now(); + + // Inline events must survive navigation without taking over links or forms. + if (keepalive && window.fetch) { + try { + window + .fetch(imageUrl, { + keepalive: trueVar, + mode: "no-cors", + credentials: "omit", + }) + .catch(function () { + image.src = imageUrl; + }); + return; + } catch (error) {} + } + image.src = imageUrl; }; // Customers can overwrite their hostname, here we check for that @@ -905,7 +922,7 @@ var validTypes = ["string", "number"]; - var sendEvent = function (event, metadata, callbackRaw) { + var sendEvent = function (event, metadata, callbackRaw, keepalive) { if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata; var eventIsFunction = isFunction(event); @@ -953,7 +970,9 @@ metadata: stringify(metadata), }), - callback + callback, + undefinedVar, + keepalive ); } }; @@ -982,6 +1001,71 @@ : sendEvent(queue[event]); } } + + var inlineEvent = function (event) { + var element = event.target; + while ( + element && + element !== doc && + (!element.getAttribute || attr(element, "simple-event") === null) + ) + element = element.parentNode; + + if (!element || element === doc) return; + var isForm = element.tagName === "FORM"; + var name = attr(element, "simple-event"); + if (!name || isForm !== (event.type === "submit")) return; + + var metadata = { tag: element.tagName.toLowerCase() }; + var attributes = element.attributes; + for (var i = 0; i < attributes.length; i++) { + var attribute = attributes[i]; + if (attribute.name.indexOf("data-simple-event-") === 0) + metadata[attribute.name.slice(18).replace(/-/g, "_")] = + attribute.value; + } + if (isForm) { + var button = event.submitter; + metadata.button_text = button + ? (button.textContent || button.value || "") + .replace(/\s+/g, " ") + .trim() + .slice(0, 200) + : ""; + } + sendEvent(name, metadata, undefinedVar, trueVar); + }; + + doc.addEventListener("click", inlineEvent, falseVar); + doc.addEventListener("submit", inlineEvent, falseVar); + + // 404 confirmation adds a request, so existing installs must opt in. + if ( + overwriteOptions.detect404 === trueVar || + attr(scriptElement, "detect-404") == trueText + ) { + var detect404 = function () { + if ( + !/\b404\b/.test(doc.title + " " + (doc.body && doc.body.textContent)) + ) + return; + try { + var request = new window.XMLHttpRequest(); + request.open("HEAD", loc.href, trueVar); + request.onload = function () { + if (request.status === 404) + sendEvent("page_404", { + url: loc.protocol + "//" + definedHostname + loc.pathname, + status: 404, + }); + }; + request.send(); + } catch (error) {} + }; + if (doc.readyState === "loading") + doc.addEventListener("DOMContentLoaded", detect404, falseVar); + else detect404(); + } } catch (e) { sendError(e); } diff --git a/dist/latest/custom/latest.js b/dist/latest/custom/latest.js index f331c1bf..d61b736a 100644 --- a/dist/latest/custom/latest.js +++ b/dist/latest/custom/latest.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-16; 2fea; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-15; 1805; v12) */ -!function(d,t,e,n,m){try{var v=undefined,g=!0,y=!1,r="true",a="https:",_="pageview",u="event",i="error",o=d.console,c="doNotTrack",w=d.navigator,s=d.location,b=s.host,l=d.document,p=w.userAgent,f="Not sending request ",h=f+"when ",O=y,x=encodeURIComponent,E=decodeURIComponent,S=JSON.stringify,k=d.addEventListener,M="https://"+e,q=l.documentElement||{},A="language",$="Height",j="scroll",D=w.userAgentData,C=j+$,H="offset"+$,R="client"+$,P="pagehide",T="platform",U="platformVersion",I="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),N=d.screen,z=l.currentScript||l.querySelector('script[src*="'+e+'"]');m=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){m("Error in your "+t+" function:",e)},W=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},G=function(t){return"string"==typeof t},J=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},L=function(t,e){return t&&t.getAttribute("data-"+e)},Y=function(t){return Array.isArray(t)?t:G(t)&&t.length?t.split(/, ?/):[]},Z=function(t){return t&&t.constructor===Object},K=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},it=function(t){return"function"==typeof t},ot="namespace",ct=t[ot]||L(z,ot)||"sa",st=function(t,e){var n=d[ct+"_metadata"];Z(n)&&(t=K(t,n));var r=d[Mt];if(!it(r))return Mt&&m(Mt+" not found, set window."+Mt),t;try{return K(t,r.call(d,K(t,e)))}catch(a){F("metadata",a)}},ut=t.strictUtm||L(z,"strict-utm")==r,lt=function(i,t){tt=!i&&nt("q")?"":y;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");tt!==y&&0"); +!function(h,t,e,n,m){try{var v=undefined,g=!0,y=!1,r="true",a="https:",_="pageview",l="event",i="error",o=h.console,c="doNotTrack",b=h.navigator,s=h.location,w=s.host,u=h.document,f=b.userAgent,p="Not sending request ",d=p+"when ",O=y,x=encodeURIComponent,E=decodeURIComponent,M=JSON.stringify,S=h.addEventListener,k="https://"+e,A=u.documentElement||{},q="language",C="Height",D="scroll",$=b.userAgentData,j=D+C,H="offset"+C,R="client"+C,L="pagehide",N="platform",P="platformVersion",T="https://docs.simpleanalytics.com",U=0,I=/(bot|spider|crawl)/i.test(f)&&!/(cubot)/i.test(f),V=h.screen,B=u.currentScript||u.querySelector('script[src*="'+e+'"]');m=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){m("Error in your "+t+" function:",e)},z=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},W=function(t){return"string"==typeof t},G=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},J=function(t,e){return t&&t.getAttribute("data-"+e)},X=function(t){return Array.isArray(t)?t:W(t)&&t.length?t.split(/, ?/):[]},Y=function(t){return t&&t.constructor===Object},Z=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},it=function(t){return"function"==typeof t},ot="namespace",ct=t[ot]||J(B,ot)||"sa",st=function(t,e){var n=h[ct+"_metadata"];Y(n)&&(t=Z(t,n));var r=h[kt];if(!it(r))return kt&&m(kt+" not found, set window."+kt),t;try{return Z(t,r.call(h,Z(t,e)))}catch(a){F("metadata",a)}},ut=t.strictUtm||J(B,"strict-utm")==r,lt=function(i,t){tt=!i&&nt("q")?"":y;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");tt!==y&&0"); //# sourceMappingURL=latest.js.map \ No newline at end of file diff --git a/dist/latest/custom/latest.js.map b/dist/latest/custom/latest.js.map index e2232a8d..82a6992f 100644 --- a/dist/latest/custom/latest.js.map +++ b/dist/latest/custom/latest.js.map @@ -1 +1 @@ -{"version":3,"file":"latest.source.js","sources":["latest.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_latest_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","protocol","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue"],"mappings":";;CAEA,SACEA,EACAC,EACAC,EAIAC,EACAC,GAEA,IAQE,IAAIC,EAAeC,UACfC,GAAU,EACVC,GAAW,EACXC,EAAW,OACXC,EAAQ,SACRC,EAAe,WACfC,EAAY,QACZC,EAAY,QAGZC,EAAMd,EAAOe,QACbC,EAAa,aACbC,EAAMjB,EAAOkB,UACbC,EAAMnB,EAAOoB,SACbC,EAAmBF,EAAIG,KACvBC,EAAMvB,EAAOwB,SACbC,EAAYR,EAAIQ,UAChBC,EAAa,uBACbC,EAAiBD,EAAa,QAC9BE,EAA2BpB,EAC3BqB,EAAyBC,mBACzBC,EAAyBC,mBACzBC,EAAYC,KAAKD,UAEjBE,EAAuBnC,EAAOoC,iBAC9BC,EAhBW3B,WAgB4BR,EACvCoC,EAAkBf,EAAIe,iBAAmB,GACzCC,EAAW,WACXC,EAAS,SAETC,EAAS,SACTC,EAASzB,EAAI0B,cACbC,EAAeH,EAASD,EACxBK,EAAe,SAAWL,EAC1BM,EAAe,SAAWN,EAE1BO,EAAW,WACXC,EAAe,WACfC,EAAsB,kBACtBC,EAAU,mCACVC,EAAQ,EACRC,EACF,sBAAsBC,KAAK5B,KAAe,WAAW4B,KAAK5B,GACxD6B,EAAStD,EAAOsD,OAIhBC,EACFhC,EAAIiC,eAAiBjC,EAAIkC,cAAc,gBAAkBvD,EAAU,MAOrEE,EAAO,WAEL,IAAIsD,EAAO,GAAGC,MAAMC,KAAKC,WAOzB,OAJAH,EAAKI,QAAQ,qBAINC,SAASC,UAAUC,MAAML,KAAK9C,EAAIV,KAAMU,EAAK4C,IAGtD,IAAIQ,EAAiB,SAAUC,EAAMC,GACnChE,EAAK,iBAAmB+D,EAAO,aAAcC,IAG3CC,EAAU,SAAUC,EAAKC,GAC3B,OAAOC,OAAOR,UAAUS,eAAeb,KAAKU,EAAKC,IAG/CG,EAAW,SAAUC,GACvB,MAAwB,iBAAVA,GAGZC,EAAc,SAAUC,GAC1B,OAAOA,EAAKC,QAAQ,sBAAuB,SAGzCC,EAAO,SAAUxB,EAAeyB,GAClC,OAAOzB,GAAiBA,EAAc0B,aAAa,QAAUD,IAG3DE,EAA+B,SAAUC,GAC3C,OAAOC,MAAMC,QAAQF,GACjBA,EACAT,EAASS,IAAQA,EAAIG,OACnBH,EAAII,MAAM,OACV,IAGJC,EAAW,SAAUC,GACvB,OAAOA,GAAUA,EAAOC,cAAgBlB,QAGtCmB,EAAS,WAGX,IAFA,IAAIC,EAAK,GACLC,EAAMhC,UACDiC,EAAQ,EAAGA,EAAQD,EAAIP,OAAQQ,IAAS,CAC/C,IAAIC,EAAaF,EAAIC,GACrB,GAAIN,EAASO,GACX,IAAK,IAAIC,KAAWD,EACd1B,EAAQ0B,EAAYC,KACtBJ,EAAGI,GAAWD,EAAWC,IAKjC,OAAOJ,GAGLK,EAAWjG,EAAOkG,YAClBC,EAAcF,GAAYzB,OAAO4B,KAAKnG,GAAkBqF,OAG5DrF,EAAmB0F,EAAO1F,EAAkBgG,GAExCE,GAAa/F,EAAK,WAAYH,GAGlC,IA+EIoG,GA/EAC,GAAgBpB,EAClBjF,EAAiBqG,eAAiBvB,EAAKxB,EAAe,mBAGpDgD,GAAwB,SAAUC,GAEpC,OAGgB,IAFdF,GAAcG,OAAO,SAAU5B,GAC7B,OAAO,IAAI6B,OAAO,IAAMF,GAAoBnD,KAAKwB,KAChDS,QAIHqB,GAAMC,KAAKD,IAEXE,GAAO,WACT,IAAIC,EAAe9G,EAAO+G,QAAU/G,EAAOgH,SACvCC,EAAY,CAAC,MAAQ,KAAO,KAAO,KAAO,KAC1CC,EAAY,SAEhB,IACE,OAAOD,EAAUnC,QAAQoC,EAAW,SAAUC,GAC5C,OACEA,EACCL,EAAaM,gBAAgB,IAAIC,WAAW,IAAI,GAC9C,IAAOF,EAAI,GACdG,SAAS,MAEb,MAAOlD,GACP,OAAO6C,EAAUnC,QAAQoC,EAAW,SAAUC,GAC5C,IAAII,EAAqB,GAAhBC,KAAKC,SAAiB,EAE/B,OADMN,EAAI,EAAII,EAAS,EAAJA,EAAW,GACrBD,SAAS,QAKpBI,GAAa,SAAUC,GACzB,MAAsB,mBAARA,GAIZC,GAAgB,YAChBC,GACF5H,EAAiB2H,KACjB7C,EAAKxB,EAAeqE,KAiyBxB,KA9xBME,GAAiB,SAAUC,EAAUC,GACvC,IAAIC,EAAiBjI,EAAO6H,GAAY,aACpCrC,EAASyC,KAAiBF,EAAWpC,EAAOoC,EAAUE,IAC1D,IAAIC,EAA4BlI,EAAOmI,IACvC,IAAKT,GAAWQ,GAKd,OAJIC,IACF/H,EACE+H,GAAoB,0BAA4BA,IAE7CJ,EAET,IACE,OAAOpC,EACLoC,EACAG,EAA0BtE,KAAK5D,EAAQ2F,EAAOoC,EAAUC,KAE1D,MAAO5D,GACPF,EAAe,WAAYE,KAU3BgE,GACFnI,EAAiBmI,WACjBrD,EAAKxB,EAAe,eAAiB9C,EAInC4H,GAAiB,SAAUC,EAAcC,GAC3ClC,IAAKiC,GAAgB/B,GAAsB,KAAO,GAAK/F,EACvD,IAAIgI,GAAKD,GAAmBpH,EAAIsH,QAC7B9E,MAAM,GACN4B,MAAM,KACNkB,OAAO,SAAUiC,GAChB,IAAIC,EAAID,EAASE,QAAQ,KACrBvC,KAAM7F,GAAgB,EAAJmI,GAASD,EAAS/E,MAAMgF,EAAI,KAChDtC,KAAMA,GAAI,IAAM,IAAMqC,EAAS/E,MAAM,EAAGgF,IAE1C,IAAIE,EAASP,IAAiB/B,GAAsB,MAEhDuC,EAAkBC,GAAYC,IAAIpE,GAAaqE,KAAK,KACpDC,EAAQL,EACR,KAAOC,EAAkB,KACzB,YACCV,GAAY,GAAK,KAClB,yCACCA,GAAY,GAAK,QAClB,IACAU,EACA,KACJ,OAAID,IAAWE,GAAYzD,OAAe9E,EAInC,IAAIkG,OAAOwC,EAAO,KAAK7F,KAAKqF,KAEpCO,KAAK,KAGR,OADA5C,GAAIA,IAAKhG,EACFmI,GAAKnI,GA+BV8I,GAAiBtB,GAAY,UACjC,GAAI7H,EAAOmJ,KAAmB5I,EAAS,OAAOH,EAAKsB,EAAa,SAChE1B,EAAOoJ,gBAAkB7I,EACzBP,EAAOmJ,IAAkB5I,EAOzB,IAAI8I,GAAW,SAAUrB,EAAMsB,EAAUC,GACvCvB,EAAOuB,EAAevB,EAAOrC,EAAO6D,GAASC,GAAMzB,GAE/C/G,EAAIyI,QAAUH,IAAcvB,EAAK0B,MAAQnJ,GACzCU,EAAI0I,qBAAuBJ,IAAcvB,EAAK4B,KAAOrJ,GAGzD,IAAIsJ,EAAQ,IAAIC,MACZR,IACFO,EAAME,QAAUT,EAChBO,EAAMG,OAASV,GAEjBO,EAAMI,IACJ5H,EACA,eACAmC,OAAO4B,KAAK4B,GACTvB,OAAO,SAAUyD,GAChB,OAAOlC,EAAKkC,IAAQ7J,IAErB2I,IAAI,SAAUkB,GACb,OACErI,EAAuBqI,GACvB,IACArI,EAAuBmG,EAAKkC,MAG/BjB,KAAK,KACR,SACArC,KAAKD,OAILwD,GACFlK,EAAiBmK,UAAYrF,EAAKxB,EAAe,YAC/C8G,GAAkBF,IAAuB9I,EAEzCiJ,GAAc,CAChBC,QA+oBJ,mBA9oBIH,SAAUC,IASZlK,EAAY,SAAUqK,GACpBA,EAAiBA,EAAeC,MAC5BD,EAAiB,IAAMA,EAAeC,MACtCD,EACJpK,EAAKoK,GACLnB,GACE1D,EAAO2E,GAAa,CAClBI,KAAM7J,EACNuD,MAAOoG,EACPG,KAAMxJ,EAAIyJ,WAEZvK,EACAE,IAMJ4B,EACEtB,EACA,SAAUgK,GACJA,EAAMC,WAA+C,EAAnCD,EAAMC,SAASlC,QAAQ1I,IAC3CC,EAAU0K,EAAME,UAGpBvK,GAOF,IAwDIwK,GAxDAC,GAAQtE,KAERuE,GAAW,EAOXC,GAAOlL,EAAiBkL,MAAQpG,EAAKxB,EAAe,QAGpD6H,MA/KsBC,GA+KCpL,EAAiBmL,cA9KvBC,GA+KjBpL,EAAiBmL,WACjBrG,EAAKxB,EAAe,eAAiB9C,GACrCsE,EAAKxB,EAAe,aAAe9C,GACnCsE,EAAKxB,EAAe,gBAAkB9C,EAGtC6K,KACqC,SAAvCvG,EAAKxB,EAAe,iBACpBtD,EAAiBqL,cAAgB9K,GAI/B+K,GACFtL,EAAiBuL,UACjBzG,EAAKxB,EAAe,cACpBsE,GAAY,IAAMjH,EAGhB6K,GAAcvG,EAChBjF,EAAiBwL,aAAe1G,EAAKxB,EAAe,iBAIlDwF,GAAc7D,EAChBjF,EAAiB8I,aAAehE,EAAKxB,EAAe,iBAIlDmI,GAAqBxG,EACvBjF,EAAiByL,oBACf3G,EAAKxB,EAAe,yBAIpBoI,GACF1L,EAAiB0L,gBAAkB5G,EAAKxB,EAAe,mBAGrD4E,GACFlI,EAAiBkI,mBACjBpD,EAAKxB,EAAe,sBAItB,IAEEyH,GAAWzE,GAAsB,KAC7BqF,KAAKC,iBAAiBC,kBAAkBC,SACxC1L,EACJ,MAAO+D,IACPhE,EAAKgE,IAOP,IAAI4H,GAAUhM,EAAOgM,QACjBC,GACFhL,EAAIiL,WACJlM,EAAOmM,aACPnM,EAAOoM,aACPpM,EAAOqM,UACNL,KAAYA,GAAQM,QACrBtM,EAAOuM,YACPvM,EAAOwM,MACPpJ,GACAoE,KAAKC,UAAYD,KAAKC,SAGpBgF,GACFlG,GAAsB,MAAQA,GAAsB,QAElD0F,KAAK3B,GAAY2B,IAAM1L,GAE3B,IAAIiJ,GAAU7D,EAAO2E,GAAa,CAEhCoC,GAAInG,GAAsB,MAAQ9E,EAAYpB,EAE9CK,MAAOS,EAAIwL,UAAYjM,EACvBsK,SAAUA,GACV4B,QAASH,GAAqB5F,KAASxG,EAGvCwM,WAAYtG,GAAsB,MAAQM,KAASxG,IA0BrD,GAvBAmJ,GAAQsD,IAAMtM,EAIVkC,IACF8G,GAAQuD,OAASrK,EAAOqK,OACxBvD,GAAQwD,OAAS/K,EAAUS,EAAOsK,SAS/BzL,EAAI0L,SAAS7M,EAAK,4CAInBiK,KAAoBhJ,IACtBmI,GAAQ0D,kBAAoB7L,IAGzB+J,IAAcpK,KAAcC,GAA0B,KAAnBA,EAAID,GAC1C,OAAOZ,EACLuB,EAAiBX,EAAa,oBAAsBkC,EAAU,SAK7B,GAAlC7B,EAAiBuH,QAAQ,OACxB,aAAavF,KAAKhC,IACnB8I,IAED/J,EACE,mBACEiB,EACA,SACA6B,EACA,0BAON,IACIiK,GA0DAC,GA3DA3D,GAAO,GAGP4D,GAAc,WAKhB,OAFEpN,EAAiBqN,UAAYvI,EAAKxB,EAAe,aAGzBhC,EAAI+L,UAAY,IACrCxI,QAAQzD,EAAkBgJ,IAC1BvF,QAAQ,sDAAuD,MAC/DA,QAAQ,YAAa,OAASzE,GAKjCiN,GAAWD,KAOXE,GAAW,EAEXC,GAAc,SAAUC,EAAIC,GAC9B,GAAKjB,GAAL,CAEA,IAAIkB,EAAShI,EAAO2E,GAAa,CAC/BI,KAAM,SACNkD,YAAaF,EAAOD,EAAKjE,GAAQoD,UAenC,GAXIrG,GAAsB,OACxBoH,EAAOE,SAAWrG,KAAKsG,OAAOnH,KAAQsE,GAAQsC,IAngBnC,MAqgBbA,GAAW,EACXtC,GAAQtE,KAGJJ,GAAsB,UACxBoH,EAAOzC,SAAW1D,KAAKuG,IAAI,EAAG7C,GAAU8C,OAGtCN,IAASzM,EAAIgN,WAEf5E,GAASsE,EAAQtN,EAAcE,QAE/B,IACEU,EAAIgN,WAAWC,KAAKjN,EAApBA,CAAyBoB,EAAa,UAAWJ,EAAU0L,IAC3D,MAAOQ,GAEP9E,GAASsE,EAAQtN,EAAcE,MAMrC4B,EACE,mBACA,WACMZ,EAAI6M,QACA,KAAOrL,KAAY/C,GAASwN,KAClCJ,GAAczG,MACT4G,IAAY5G,KAAQyG,IAE7B5M,GAGF2B,EAAqBY,EAAUyK,GAAahN,GAE5C,IAAI6N,GAAO9M,EAAI8M,MAAQ,GACnBL,GAAW,WACb,IACE,IAAIM,EAAuBhM,EAAgBQ,IAAiB,EACxDyL,EAAS/G,KAAKuG,IAChBM,GAAKzL,IAAiB,EACtByL,GAAKxL,IAAiB,EACtBP,EAAgBQ,IAAiB,EACjCR,EAAgBM,IAAiB,EACjCN,EAAgBO,IAAiB,GAEnC,OAAO2E,KAAKgH,IACV,IAKI,EAJJhH,KAAKsG,MACF,MAAQxL,EAAgBmM,WAAa,GAAKH,GACzCC,EACA,IAGN,MAAOnK,IAEP,OADAhE,EAAKgE,IACE,IAIXjC,EAAqB,OAAQ,WAC3B+I,GAAW8C,KACX7L,EACEM,EACA,WACMyI,GAAW8C,OAAY9C,GAAW8C,OAExCxN,KAQJ,IAgCIkO,GAoCAC,GAAUC,GApEVC,GAAU,SAAUC,GACtB,IAAInE,EAAO,GAIX,IACEA,EAAOmE,GAAa/M,EAAuBZ,EAAIyJ,UAC/C,MAAOxG,IACPhE,EAAKgE,IAGP,IAAI2K,EAAyB/O,EAAO2L,IACpC,GAAIjE,GAAWqH,GACb,IACEpE,EAAOoE,EAAuBnL,KAAK5D,EAAQ,CAAE2K,KAAMA,KAAWA,EAC9D,MAAOvG,IACPF,EAAe,OAAQE,IAK3B,IA5YiB,SAAUuG,GAC3B,IAAK,IAAIhC,KAAK8C,GAAa,CACzB,IAAIuD,EAAgBvD,GAAY9C,GAChC,GAAKqG,EAAL,CAGA,IAAIC,EA9OI,KA+OND,EAAc,GAAcA,EA/OtB,IA+O8CA,EAEtD,GACEC,IAAetE,GACf,IAAIjE,OACF,IAAM9B,EAAYqK,GAAYnK,QAAQ,SAAU,QAAU,IAC1D,KACAzB,KAAKsH,GAEP,OAAOpK,GAEX,OAAOC,EA0XH0O,CAAavE,GAQjB,MAFY,QAARQ,IAAkBhK,EAAIgO,OAAMxE,GAAQxJ,EAAIgO,KAAK5J,MAAM,KAAK,IAErDoF,EAPLvK,EAAKuB,EAAiB,YAAcgJ,IAgDpCyE,GAAW,SACbC,EACAC,EACAvH,EACAwH,IAEKA,GAAe7H,GAAWK,KAAWwH,EAAcxH,GACxD,IACIyH,EAGEC,EAJFnG,EAAW5B,GAAW6H,GAAeA,EAAc,aAEnD7K,EAAS4K,KAAgD,EAA9BA,EAAc1G,QAAQ,OAGnD0G,GADIG,EAAQH,EAAc/J,MAAM,MACVmK,QACtBF,EAAc,IAAMC,EAAMxG,KAAK,MAGjC,IAAI0B,EAAOkE,GAAQS,GAGnB,GAAK3E,GAAQwC,IAAgBxC,EAA7B,CAEAwC,GAAexC,EACflB,GAAKkB,KAAOA,EAGRpE,GAAsB,OACxBkD,GAAKkG,eACHnI,KAAKuG,IAAIzL,EAA2B,aAAK,EAAGtC,EAAO4P,YAAc,IACjE,KACFnG,GAAKoG,gBACHrI,KAAKuG,IACHzL,EAAgBQ,IAAiB,EACjC9C,EAAO8P,aAAe,IACnB,MAILvJ,GAAsB,MACpBtF,EAAIsB,KAAWkH,GAAKlH,GAAYtB,EAAIsB,IAItCe,GAAUiD,GAAsB,QAClCkD,GAAKsG,aAAezM,EAAO0M,MAC3BvG,GAAKwG,cAAgB3M,EAAOiL,QAI9B,IAII2B,EAJAC,EAAOnQ,EAAOoQ,YACdC,EAAiB,aAIrB,IACEH,EAAsBC,EAAKG,iBAAiBD,GAAgB,GAAG3F,KAC/D,MAAOtG,IACPhE,EAAKgE,IAGPwK,GAAgBsB,GAC+C,EAA3D,CAAC,SAAU,gBAAgBtH,QAAQsH,GAGnCC,GACAA,EAAKE,KACwC,EAA7C,CAAC,EAAG,GAAGzH,QAAQuH,EAAKE,GAAgB3F,MAGxC,IAAI6F,EAA0BjD,GAC1BA,GAAS/H,MA1uBH,KA0uBgB,GACtBlF,EACJsO,GAAWrB,IACgD,EAAvD5B,GAAmB9C,QAAQ2H,IAC3BA,GAA2BlP,EAC3Bb,EAGJiJ,GAAK+G,OACH,QAAQnN,KAAKgK,OAAkBgC,GAAeT,GAC1CpO,GACCmO,GAEP5G,EAAWD,GAAeC,EAAU,CAClC2C,KAAM/J,EACNgK,KAAMlB,GAAKkB,OAGb,IAAI8F,EAAsB,WACxB7O,EAA2BrB,EAC3B,IAAImQ,EACFrB,GAAeT,KAAkBrI,GAAsB,MA7H1C,SACjB8I,EACAsB,EACAhC,EACAlG,EACAV,EACAuB,GAEI+F,GAAa7B,GAAY,GAAKhE,GAAQoD,QAASrM,GAC/CkM,KAAoBjD,GAAQoD,QAAU/F,MAE1C,IAAI+J,EAAcvG,GAAkBwE,KAChCgC,EAAQxI,GAAesI,EAAkBlI,GAE7CY,GACE,CACEoE,GAAIjE,GAAQoD,QACZlC,KAAM/J,EACN2M,UAAWqD,GAAoBhC,EAAWrB,GAAW,KACrDuD,MAAOA,EACPxK,EAAGA,GAEH0B,SAAU9F,EAAU8F,IAEtBuB,GAGFoF,GAAmBpB,GACnBA,GAAWsD,EAEXzN,IAgGE2N,CACEzB,EACAqB,EACA/B,GACAa,EACAzH,EACAuB,IAIJ,GAAK1H,EAmBH6O,SAjBA,IACM/N,GAAUgF,GAAWhF,EAAOqO,sBAC9BrO,EACGqO,qBAAqB,CAAC/N,EAAcC,IACpC+N,KAAK,SAAUC,GACdzH,GAAQ0H,QAAUD,EAAkBjO,GACpCwG,GAAQ2H,WAAaF,EAAkBhO,GACvCwN,MAEDW,SAAMX,GAETA,IAEF,MAAOtC,GACPsC,OAWFY,GAAMrR,EAAOsR,QACbC,GAAeF,GAAMA,GAAIG,UAAYnR,EACrCoR,GAAMzR,EAAO0R,cACbC,GAAgB,YAIhBrG,IAAeiG,IAAgBK,OAASH,KAqB1CJ,GAAIG,WAnBEK,GAAOR,GADiB3G,GAoBAiH,IAlBrB,WACL,IAEI9G,EAFAhF,EAAMhC,UACNiO,EAAKD,GAAK5N,MAAM8N,KAAMlM,GAY1B,OAVI6B,GAAWkK,OACb/G,EAAQ,IAAI+G,MAAMlH,KAIlBG,EAAQtJ,EAAIyQ,YAAY,UAClBC,UAAUvH,GAAMnK,EAASA,GAEjCsK,EAAMhH,UAAYgC,EAClB4L,GAAI5G,GACGiH,IAMX3P,EACEwP,GACA,WACEvC,GAAS,IAEX5O,GAGF2B,EACE,WACA,WACEiN,GAAS,IAEX5O,IAKA8K,IAAuB,QAARH,IAAkB,iBAAkBnL,GACrDmC,EACE,aACA,WACEiN,GAAS,IAEX5O,GAIA8K,IAAa8D,KAEjBpP,EAAOkS,YAAc,SAAUvH,EAAM5C,EAAUuB,GAC7C8F,GAAS,EAAGzE,EAAM5C,EAAUuB,IAQ9B,IAAI6I,GAAa,CAAC,SAAU,UAExBC,GAAY,SAAUvH,EAAO9C,EAAUwH,IACpCA,GAAe7H,GAAWK,KAAWwH,EAAcxH,GAExD,IAAIsK,EAAkB3K,GAAWmD,GAC7BvB,EAAW5B,GAAW6H,GAAeA,EAAc,aACnD+C,SAAmBzH,EAEvB,GAAIsH,GAAWvJ,QAAQ0J,GAAa,IAAMD,EAExC,OADAnO,EAAeqH,GAAmB3K,EAAY,aAAe0R,GACtDhJ,IAGT,IACE,GAAI+I,EAAiB,CACnB,IAAIE,EAAc1H,IAClB,GAAIsH,GAAWvJ,eAAe2J,GAAe,EAK3C,OAJArO,EACEqH,GACAV,EAAQ,uBAAyB0H,GAE5BjJ,IAETuB,EAAQ0H,GAEV,MAAOnO,IAEP,OADAF,EAAeqH,GAAmBnH,IAC3BkF,IAGTuB,GAAS,GAAKA,GAAO/F,QAAQ,eAAgB,KAAKA,QAAQ,WAAY,IAEtE,IAAI0N,EAAc,CAAE9H,KAAM9J,EAAWiK,MAAOA,GACxC4H,GAAa7D,IAAiBzL,EAAQ,EAE1C4E,EAAWD,GAAeC,EAAUyK,GAEhC3H,GACFxB,GACE1D,EAAO6M,EAAa,CAClB/E,GAAI5G,KACJgK,MAAOxI,IAAgBoK,GACvBnF,UACGmF,GAAa9D,KAAapI,GAAsB,KAC7CmI,GACA,KAEN3G,SAAU9F,EAAU8F,KAEtBuB,IAKFoJ,GAAmB,SAAU7H,EAAO9C,EAAUuB,GAChD8I,GAAUvH,EAAO9C,EAAUuB,IAIxBtJ,EAAOuL,MACVvL,EAAOuL,IAAqBmH,IAE9B,IAAIC,GAAY3S,EAAOuL,IAGnBqH,GAAQD,IAAaA,GAAUnK,EAAImK,GAAUnK,EAAI,GAMrD,IAAK,IAAIqC,MAHT7K,EAAOuL,IAAqBmH,GAGVE,GACZvO,EAAQuO,GAAO/H,MACjBzF,MAAMC,QAAQuN,GAAM/H,KAChBuH,GAAUnO,MAAM,KAAM2O,GAAM/H,KAC5BuH,GAAUQ,GAAM/H,MAGxB,MAAOsD,IACPhO,EAAUgO,IA7IY,IAAUzD,GACxBmH,GArnBkBxG,GAnN9B,CAu9BErL,OACA,uBACA"} \ No newline at end of file +{"version":3,"file":"latest.source.js","sources":["latest.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData, keepalive) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n var imageUrl =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n\n // Inline events must survive navigation without taking over links or forms.\n if (keepalive && window.fetch) {\n try {\n window\n .fetch(imageUrl, {\n keepalive: trueVar,\n mode: \"no-cors\",\n credentials: \"omit\",\n })\n .catch(function () {\n image.src = imageUrl;\n });\n return;\n } catch (error) {}\n }\n image.src = imageUrl;\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw, keepalive) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback,\n undefinedVar,\n keepalive\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n\n var inlineEvent = function (event) {\n var element = event.target;\n while (\n element &&\n element !== doc &&\n (!element.getAttribute || attr(element, \"simple-event\") === null)\n )\n element = element.parentNode;\n\n if (!element || element === doc) return;\n var isForm = element.tagName === \"FORM\";\n var name = attr(element, \"simple-event\");\n if (!name || isForm !== (event.type === \"submit\")) return;\n\n var metadata = { tag: element.tagName.toLowerCase() };\n var attributes = element.attributes;\n for (var i = 0; i < attributes.length; i++) {\n var attribute = attributes[i];\n if (attribute.name.indexOf(\"data-simple-event-\") === 0)\n metadata[attribute.name.slice(18).replace(/-/g, \"_\")] =\n attribute.value;\n }\n if (isForm) {\n var button = event.submitter;\n metadata.button_text = button\n ? (button.textContent || button.value || \"\")\n .replace(/\\s+/g, \" \")\n .trim()\n .slice(0, 200)\n : \"\";\n }\n sendEvent(name, metadata, undefinedVar, trueVar);\n };\n\n doc.addEventListener(\"click\", inlineEvent, falseVar);\n doc.addEventListener(\"submit\", inlineEvent, falseVar);\n\n // 404 confirmation adds a request, so existing installs must opt in.\n if (\n overwriteOptions.detect404 === trueVar ||\n attr(scriptElement, \"detect-404\") == trueText\n ) {\n var detect404 = function () {\n if (\n !/\\b404\\b/.test(doc.title + \" \" + (doc.body && doc.body.textContent))\n )\n return;\n try {\n var request = new window.XMLHttpRequest();\n request.open(\"HEAD\", loc.href, trueVar);\n request.onload = function () {\n if (request.status === 404)\n sendEvent(\"page_404\", {\n url: loc.protocol + \"//\" + definedHostname + loc.pathname,\n status: 404,\n });\n };\n request.send();\n } catch (error) {}\n };\n if (doc.readyState === \"loading\")\n doc.addEventListener(\"DOMContentLoaded\", detect404, falseVar);\n else detect404();\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_latest_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","keepalive","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","imageUrl","key","fetch","mode","credentials","catch","src","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","protocol","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue","detect404","inlineEvent","element","target","parentNode","isForm","tagName","button","tag","toLowerCase","attributes","submitter","button_text","textContent","trim","title","request","XMLHttpRequest","open","href","status","url","send","readyState"],"mappings":"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"} \ No newline at end of file diff --git a/dist/latest/custom/light.js b/dist/latest/custom/light.js index f32008e5..6aa847a6 100644 --- a/dist/latest/custom/light.js +++ b/dist/latest/custom/light.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-16; 1b6a; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-15; fa6c; v12) */ -!function(l,e,t,f){try{var u=undefined,n="https:",r=l.console,i="doNotTrack",m=l.navigator,p=l.location,g=p.host,a=l.document,o=m.userAgent,c="Not sending request ",h=!1,s=encodeURIComponent,d=decodeURIComponent,v=JSON.stringify,y=l.addEventListener,_="https://"+t,b=(a.documentElement,"language"),w=m.userAgentData,O="platform",S="platformVersion",j="https://docs.simpleanalytics.com",k=/(bot|spider|crawl)/i.test(o)&&!/(cubot)/i.test(o),x=a.currentScript||a.querySelector('script[src*="'+t+'"]');f=function(){var e=[].slice.call(arguments);return e.unshift("Simple Analytics:"),Function.prototype.apply.call(r.warn,r,e)};var E=function(e){return"string"==typeof e},A=function(e,t){return e&&e.getAttribute("data-"+t)},$=function(){for(var e,t,n,r={},i=arguments,a=0;a>e/4).toString(16)})}catch(r){return e.replace(n,function(e){var t=16*Math.random()|0;return(e<2?t:3&t|8).toString(16)})}},N=function(e){return"function"==typeof e},R="namespace",U=e[R]||A(x,R)||"sa",V=e.strictUtm||"true"==A(x,"strict-utm"),B=U+"_loaded";if(1==l[B])return f(c+"twice");l.sa_event_loaded=!0,l[B]=!0;var C,H=function(t,e,n){t=n?t:$(J,M,t),m.brave&&!n&&(t.brave=!0),m._duckduckgoloader_&&!n&&(t.duck=!0),(new Image).src=_+"/simple.gif?"+Object.keys(t).filter(function(e){return t[e]!=u}).map(function(e){return s(e)+"="+s(t[e])}).join("&")+"&time="+Date.now()},T=e.hostname||A(x,"hostname"),F=T||g,z={version:"custom_light_12",hostname:F};e.mode||A(x,"mode");try{C=Intl.DateTimeFormat().resolvedOptions().timeZone}catch(X){f(X)}k&&(z.bot=!0);var J=$(z,{ua:o,https:p.protocol==n,timezone:C,page_id:I(),session_id:I()});if(J.sri=!1,w&&(J.mobile=w.mobile,J.brands=v(w.brands)),F!==g&&(J.hostname_original=g),i in m&&"1"==m[i])return f("Not sending request when "+i+" is enabled. See "+j+"/dnt");-1!=g.indexOf(".")&&!/^[0-9.:]+$/.test(g)||T||f("Set hostname on "+g+". See "+j+"/overwrite-domain-name");var L,M={},P=(e.referrer||A(x,"referrer")||a.referrer||"").replace(g,F).replace(/^https?:\/\/((m|l|w{2,3}([0-9]+)?)\.)?([^?#]+)(.*)$/,"$4").replace(/^([^/]+)$/,"$1")||u,Z=function(e,t){var n=$(z,{type:"append",original_id:t?e:J.page_id});if(t||!m.sendBeacon)H(n,0,!0);else try{m.sendBeacon.bind(m)(_+"/append",v(n))}catch(r){H(n,0,!0)}};y("pagehide",Z,!1);var G,K,Q=function(e){var t="";try{t=e||d(p.pathname)}catch(X){f(X)}return t},W=function(e,t,n,r,i,a){e&&Z(""+J.page_id,!0),J.page_id=I();var o,c=F+Q(),s=(o=t,(r||p.search).slice(1).split("&").filter(function(e){return!o&&new RegExp("^((utm_)"+(V?"":"?")+"(source|medium|content|term|campaign)"+(V?"":"|ref")+")=","i").test(e)}).join("&")||u);H({id:J.page_id,type:"pageview",referrer:!t||n?P:null,query:s}),P=c,0};!function(e,t,n,r){!r&&N(n)&&(r=n);var i,a;N(r);E(t)&&-1"); +!function(l,e,t,f){try{var u=undefined,n="https:",r=l.console,a="doNotTrack",m=l.navigator,p=l.location,g=p.host,i=l.document,o=m.userAgent,c="Not sending request ",h=!1,s=encodeURIComponent,d=decodeURIComponent,v=JSON.stringify,y=l.addEventListener,_="https://"+t,b=(i.documentElement,"language"),w=m.userAgentData,O="platform",S="platformVersion",j="https://docs.simpleanalytics.com",k=/(bot|spider|crawl)/i.test(o)&&!/(cubot)/i.test(o),x=i.currentScript||i.querySelector('script[src*="'+t+'"]');f=function(){var e=[].slice.call(arguments);return e.unshift("Simple Analytics:"),Function.prototype.apply.call(r.warn,r,e)};var E=function(e){return"string"==typeof e},A=function(e,t){return e&&e.getAttribute("data-"+t)},$=function(){for(var e,t,n,r={},a=arguments,i=0;i>e/4).toString(16)})}catch(r){return e.replace(n,function(e){var t=16*Math.random()|0;return(e<2?t:3&t|8).toString(16)})}},N=function(e){return"function"==typeof e},R="namespace",U=e[R]||A(x,R)||"sa",V=e.strictUtm||"true"==A(x,"strict-utm"),B=U+"_loaded";if(1==l[B])return f(c+"twice");l.sa_event_loaded=!0,l[B]=!0;var C,H=function(t,e,n,r){t=n?t:$(J,M,t),m.brave&&!n&&(t.brave=!0),m._duckduckgoloader_&&!n&&(t.duck=!0);var a=new Image,i=_+"/simple.gif?"+Object.keys(t).filter(function(e){return t[e]!=u}).map(function(e){return s(e)+"="+s(t[e])}).join("&")+"&time="+Date.now();a.src=i},T=e.hostname||A(x,"hostname"),F=T||g,z={version:"custom_light_12",hostname:F};e.mode||A(x,"mode");try{C=Intl.DateTimeFormat().resolvedOptions().timeZone}catch(X){f(X)}k&&(z.bot=!0);var J=$(z,{ua:o,https:p.protocol==n,timezone:C,page_id:I(),session_id:I()});if(J.sri=!1,w&&(J.mobile=w.mobile,J.brands=v(w.brands)),F!==g&&(J.hostname_original=g),a in m&&"1"==m[a])return f("Not sending request when "+a+" is enabled. See "+j+"/dnt");-1!=g.indexOf(".")&&!/^[0-9.:]+$/.test(g)||T||f("Set hostname on "+g+". See "+j+"/overwrite-domain-name");var L,M={},P=(e.referrer||A(x,"referrer")||i.referrer||"").replace(g,F).replace(/^https?:\/\/((m|l|w{2,3}([0-9]+)?)\.)?([^?#]+)(.*)$/,"$4").replace(/^([^/]+)$/,"$1")||u,Z=function(e,t){var n=$(z,{type:"append",original_id:t?e:J.page_id});if(t||!m.sendBeacon)H(n,0,!0);else try{m.sendBeacon.bind(m)(_+"/append",v(n))}catch(r){H(n,0,!0)}};y("pagehide",Z,!1);var G,K,Q=function(e){var t="";try{t=e||d(p.pathname)}catch(X){f(X)}return t},W=function(e,t,n,r,a,i){e&&Z(""+J.page_id,!0),J.page_id=I();var o,c=F+Q(),s=(o=t,(r||p.search).slice(1).split("&").filter(function(e){return!o&&new RegExp("^((utm_)"+(V?"":"?")+"(source|medium|content|term|campaign)"+(V?"":"|ref")+")=","i").test(e)}).join("&")||u);H({id:J.page_id,type:"pageview",referrer:!t||n?P:null,query:s}),P=c,0};!function(e,t,n,r){!r&&N(n)&&(r=n);var a,i;N(r);E(t)&&-1"); //# sourceMappingURL=light.js.map \ No newline at end of file diff --git a/dist/latest/custom/light.js.map b/dist/latest/custom/light.js.map index a65fce3e..8672605f 100644 --- a/dist/latest/custom/light.js.map +++ b/dist/latest/custom/light.js.map @@ -1 +1 @@ -{"version":3,"file":"light.source.js","sources":["light.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n\n var collectMetricByString = function (metricAbbreviation) {\n // eslint-disable-next-line no-unreachable\n return true;\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n if (ignore) return falseVar;\n // eslint-disable-next-line no-redeclare\n var regex =\n \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \")=\";\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n return q || undefinedVar;\n };\n\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n\n\n\n\n\n\n\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n // eslint-disable-next-line no-redeclare\n var bot = isBotAgent;\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n\n\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n sameSite = referrer\n ? referrer.split(slash)[0] == locationHostname\n : falseVar;\n\n\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n\n\n pageview();\n\n } catch (e) {\n warn(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_light_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","warn","undefinedVar","undefined","https","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","language","documentElement","uaData","userAgentData","platformText","platformVersionText","docsUrl","isBotAgent","test","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","isString","string","attr","attribute","getAttribute","assign","obj","prop","object","to","arg","index","length","nextSource","constructor","Object","nextKey","hasOwnProperty","settings","sa_settings","logSettings","keys","Date","now","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","replace","c","getRandomValues","Uint8Array","toString","error","r","Math","random","isFunction","func","namespaceText","namespace","strictUtm","loadedVariable","sa_event_loaded","timezone","sendData","data","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","Image","src","filter","key","map","join","overwrittenHostname","hostname","definedHostname","basePayload","version","mode","Intl","DateTimeFormat","resolvedOptions","timeZone","bot","ua","protocol","page_id","session_id","sri","mobile","brands","hostname_original","indexOf","lastSendPath","referrer","sendOnLeave","id","push","append","type","original_id","sendBeacon","bind","e","sameSite","userNavigated","getPath","overwrite","path","pathname","sendPageView","isPushState","deleteSourceInfo","search","metadata","ignoreSource","currentPage","query","split","keyValue","RegExp","pages","pathOverwrite","callbackRaw","querySearch","parts","shift","performaceEntryType","perf","performance","navigationText","getEntriesByType","triggerSendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","pageview"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"light.source.js","sources":["light.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n\n var collectMetricByString = function (metricAbbreviation) {\n // eslint-disable-next-line no-unreachable\n return true;\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n if (ignore) return falseVar;\n // eslint-disable-next-line no-redeclare\n var regex =\n \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \")=\";\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n return q || undefinedVar;\n };\n\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData, keepalive) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n var imageUrl =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n\n image.src = imageUrl;\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n\n\n\n\n\n\n\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n // eslint-disable-next-line no-redeclare\n var bot = isBotAgent;\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n\n\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n sameSite = referrer\n ? referrer.split(slash)[0] == locationHostname\n : falseVar;\n\n\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n\n\n pageview();\n\n } catch (e) {\n warn(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_light_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","warn","undefinedVar","undefined","https","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","language","documentElement","uaData","userAgentData","platformText","platformVersionText","docsUrl","isBotAgent","test","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","isString","string","attr","attribute","getAttribute","assign","obj","prop","object","to","arg","index","length","nextSource","constructor","Object","nextKey","hasOwnProperty","settings","sa_settings","logSettings","keys","Date","now","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","replace","c","getRandomValues","Uint8Array","toString","error","r","Math","random","isFunction","func","namespaceText","namespace","strictUtm","loadedVariable","sa_event_loaded","timezone","sendData","data","callback","onlyThisData","keepalive","payload","page","brave","_duckduckgoloader_","duck","image","Image","imageUrl","filter","key","map","join","src","overwrittenHostname","hostname","definedHostname","basePayload","version","mode","Intl","DateTimeFormat","resolvedOptions","timeZone","bot","ua","protocol","page_id","session_id","sri","mobile","brands","hostname_original","indexOf","lastSendPath","referrer","sendOnLeave","id","push","append","type","original_id","sendBeacon","bind","e","sameSite","userNavigated","getPath","overwrite","path","pathname","sendPageView","isPushState","deleteSourceInfo","search","metadata","ignoreSource","currentPage","query","split","keyValue","RegExp","pages","pathOverwrite","callbackRaw","querySearch","parts","shift","performaceEntryType","perf","performance","navigationText","getEntriesByType","triggerSendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","pageview"],"mappings":"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"} \ No newline at end of file diff --git a/dist/latest/custom/proxy.js b/dist/latest/custom/proxy.js index 67ce58bf..77796331 100644 --- a/dist/latest/custom/proxy.js +++ b/dist/latest/custom/proxy.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-16; 3faa; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-15; 09c1; v12) */ -!function(d,t,e,n,m){try{var v=undefined,g=!0,y=!1,r="true",a="https:",_="pageview",u="event",i="error",o=d.console,c="doNotTrack",w=d.navigator,s=d.location,b=s.host,l=d.document,p=w.userAgent,f="Not sending request ",h=f+"when ",x=y,O=encodeURIComponent,E=decodeURIComponent,S=JSON.stringify,k=d.addEventListener,M="https://"+e,q=l.documentElement||{},A="language",$="Height",j="scroll",D=w.userAgentData,C=j+$,H="offset"+$,P="client"+$,R="pagehide",T="platform",U="platformVersion",I="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),N=d.screen,z=l.currentScript||l.querySelector('script[src*="'+e+'"]');m=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){m("Error in your "+t+" function:",e)},W=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},G=function(t){return"string"==typeof t},J=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},L=function(t,e){return t&&t.getAttribute("data-"+e)},Y=function(t){return Array.isArray(t)?t:G(t)&&t.length?t.split(/, ?/):[]},Z=function(t){return t&&t.constructor===Object},K=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},it=function(t){return"function"==typeof t},ot="namespace",ct=t[ot]||L(z,ot)||"sa",st=function(t,e){var n=d[ct+"_metadata"];Z(n)&&(t=K(t,n));var r=d[Mt];if(!it(r))return Mt&&m(Mt+" not found, set window."+Mt),t;try{return K(t,r.call(d,K(t,e)))}catch(a){F("metadata",a)}},ut=t.strictUtm||L(z,"strict-utm")==r,lt=function(i,t){tt=!i&&nt("q")?"":y;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");tt!==y&&0"); +!function(h,t,e,n,m){try{var v=undefined,g=!0,y=!1,r="true",a="https:",_="pageview",l="event",i="error",o=h.console,c="doNotTrack",b=h.navigator,s=h.location,w=s.host,u=h.document,p=b.userAgent,f="Not sending request ",d=f+"when ",x=y,O=encodeURIComponent,E=decodeURIComponent,M=JSON.stringify,S=h.addEventListener,k="https://"+e,A=u.documentElement||{},q="language",C="Height",D="scroll",$=b.userAgentData,j=D+C,H="offset"+C,R="client"+C,L="pagehide",N="platform",P="platformVersion",T="https://docs.simpleanalytics.com",U=0,I=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),V=h.screen,B=u.currentScript||u.querySelector('script[src*="'+e+'"]');m=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){m("Error in your "+t+" function:",e)},z=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},W=function(t){return"string"==typeof t},G=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},J=function(t,e){return t&&t.getAttribute("data-"+e)},X=function(t){return Array.isArray(t)?t:W(t)&&t.length?t.split(/, ?/):[]},Y=function(t){return t&&t.constructor===Object},Z=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},it=function(t){return"function"==typeof t},ot="namespace",ct=t[ot]||J(B,ot)||"sa",st=function(t,e){var n=h[ct+"_metadata"];Y(n)&&(t=Z(t,n));var r=h[kt];if(!it(r))return kt&&m(kt+" not found, set window."+kt),t;try{return Z(t,r.call(h,Z(t,e)))}catch(a){F("metadata",a)}},ut=t.strictUtm||J(B,"strict-utm")==r,lt=function(i,t){tt=!i&&nt("q")?"":y;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");tt!==y&&0"); //# sourceMappingURL=proxy.js.map \ No newline at end of file diff --git a/dist/latest/custom/proxy.js.map b/dist/latest/custom/proxy.js.map index f859b43f..0219736d 100644 --- a/dist/latest/custom/proxy.js.map +++ b/dist/latest/custom/proxy.js.map @@ -1 +1 @@ -{"version":3,"file":"proxy.source.js","sources":["proxy.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_proxy_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","protocol","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"proxy.source.js","sources":["proxy.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData, keepalive) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n var imageUrl =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n\n // Inline events must survive navigation without taking over links or forms.\n if (keepalive && window.fetch) {\n try {\n window\n .fetch(imageUrl, {\n keepalive: trueVar,\n mode: \"no-cors\",\n credentials: \"omit\",\n })\n .catch(function () {\n image.src = imageUrl;\n });\n return;\n } catch (error) {}\n }\n image.src = imageUrl;\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw, keepalive) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback,\n undefinedVar,\n keepalive\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n\n var inlineEvent = function (event) {\n var element = event.target;\n while (\n element &&\n element !== doc &&\n (!element.getAttribute || attr(element, \"simple-event\") === null)\n )\n element = element.parentNode;\n\n if (!element || element === doc) return;\n var isForm = element.tagName === \"FORM\";\n var name = attr(element, \"simple-event\");\n if (!name || isForm !== (event.type === \"submit\")) return;\n\n var metadata = { tag: element.tagName.toLowerCase() };\n var attributes = element.attributes;\n for (var i = 0; i < attributes.length; i++) {\n var attribute = attributes[i];\n if (attribute.name.indexOf(\"data-simple-event-\") === 0)\n metadata[attribute.name.slice(18).replace(/-/g, \"_\")] =\n attribute.value;\n }\n if (isForm) {\n var button = event.submitter;\n metadata.button_text = button\n ? (button.textContent || button.value || \"\")\n .replace(/\\s+/g, \" \")\n .trim()\n .slice(0, 200)\n : \"\";\n }\n sendEvent(name, metadata, undefinedVar, trueVar);\n };\n\n doc.addEventListener(\"click\", inlineEvent, falseVar);\n doc.addEventListener(\"submit\", inlineEvent, falseVar);\n\n // 404 confirmation adds a request, so existing installs must opt in.\n if (\n overwriteOptions.detect404 === trueVar ||\n attr(scriptElement, \"detect-404\") == trueText\n ) {\n var detect404 = function () {\n if (\n !/\\b404\\b/.test(doc.title + \" \" + (doc.body && doc.body.textContent))\n )\n return;\n try {\n var request = new window.XMLHttpRequest();\n request.open(\"HEAD\", loc.href, trueVar);\n request.onload = function () {\n if (request.status === 404)\n sendEvent(\"page_404\", {\n url: loc.protocol + \"//\" + definedHostname + loc.pathname,\n status: 404,\n });\n };\n request.send();\n } catch (error) {}\n };\n if (doc.readyState === \"loading\")\n doc.addEventListener(\"DOMContentLoaded\", detect404, falseVar);\n else detect404();\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_proxy_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","keepalive","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","imageUrl","key","fetch","mode","credentials","catch","src","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","protocol","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue","detect404","inlineEvent","element","target","parentNode","isForm","tagName","button","tag","toLowerCase","attributes","submitter","button_text","textContent","trim","title","request","XMLHttpRequest","open","href","status","url","send","readyState"],"mappings":"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"} \ No newline at end of file diff --git a/dist/latest/hello.js b/dist/latest/hello.js index b9dc364b..bbca586f 100644 --- a/dist/latest/hello.js +++ b/dist/latest/hello.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-16; e718) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-15; 4044) */ -!function(d,t,e,n,m){try{var v=undefined,g=!0,y=!1,r="true",a="https:",_="pageview",u="event",i="error",o=d.console,c="doNotTrack",w=d.navigator,s=d.location,b=s.host,l=d.document,p=w.userAgent,f="Not sending request ",h=f+"when ",O=y,E=encodeURIComponent,x=decodeURIComponent,S=JSON.stringify,k=d.addEventListener,q="https://queue."+e,M=l.documentElement||{},A="language",$="Height",j="scroll",D=w.userAgentData,C=j+$,R="offset"+$,H="client"+$,P="pagehide",T="platform",U="platformVersion",I="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),N=d.screen,z=l.currentScript||l.querySelector('script[src*="'+e+'"]');m=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){m("Error in your "+t+" function:",e)},W=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},G=function(t){return"string"==typeof t},J=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},L=function(t,e){return t&&t.getAttribute("data-"+e)},Y=function(t){return Array.isArray(t)?t:G(t)&&t.length?t.split(/, ?/):[]},Z=function(t){return t&&t.constructor===Object},K=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},it=function(t){return"function"==typeof t},ot="namespace",ct=t[ot]||L(z,ot)||"sa",st=function(t,e){var n=d[ct+"_metadata"];Z(n)&&(t=K(t,n));var r=d[qt];if(!it(r))return qt&&m(qt+" not found, set window."+qt),t;try{return K(t,r.call(d,K(t,e)))}catch(a){F("metadata",a)}},ut=t.strictUtm||L(z,"strict-utm")==r,lt=function(i,t){tt=!i&&nt("q")?"":y;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");tt!==y&&0>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},it=function(t){return"function"==typeof t},ot="namespace",ct=t[ot]||J(B,ot)||"sa",st=function(t,e){var n=h[ct+"_metadata"];Y(n)&&(t=Z(t,n));var r=h[kt];if(!it(r))return kt&&m(kt+" not found, set window."+kt),t;try{return Z(t,r.call(h,Z(t,e)))}catch(a){F("metadata",a)}},ut=t.strictUtm||J(B,"strict-utm")==r,lt=function(i,t){tt=!i&&nt("q")?"":y;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");tt!==y&&0> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"simpleanalyticscdn.com\",\n \"queue.\",\n \"cdn_hello_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","protocol","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"hello.source.js","sources":["hello.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData, keepalive) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n var imageUrl =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n\n // Inline events must survive navigation without taking over links or forms.\n if (keepalive && window.fetch) {\n try {\n window\n .fetch(imageUrl, {\n keepalive: trueVar,\n mode: \"no-cors\",\n credentials: \"omit\",\n })\n .catch(function () {\n image.src = imageUrl;\n });\n return;\n } catch (error) {}\n }\n image.src = imageUrl;\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw, keepalive) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback,\n undefinedVar,\n keepalive\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n\n var inlineEvent = function (event) {\n var element = event.target;\n while (\n element &&\n element !== doc &&\n (!element.getAttribute || attr(element, \"simple-event\") === null)\n )\n element = element.parentNode;\n\n if (!element || element === doc) return;\n var isForm = element.tagName === \"FORM\";\n var name = attr(element, \"simple-event\");\n if (!name || isForm !== (event.type === \"submit\")) return;\n\n var metadata = { tag: element.tagName.toLowerCase() };\n var attributes = element.attributes;\n for (var i = 0; i < attributes.length; i++) {\n var attribute = attributes[i];\n if (attribute.name.indexOf(\"data-simple-event-\") === 0)\n metadata[attribute.name.slice(18).replace(/-/g, \"_\")] =\n attribute.value;\n }\n if (isForm) {\n var button = event.submitter;\n metadata.button_text = button\n ? (button.textContent || button.value || \"\")\n .replace(/\\s+/g, \" \")\n .trim()\n .slice(0, 200)\n : \"\";\n }\n sendEvent(name, metadata, undefinedVar, trueVar);\n };\n\n doc.addEventListener(\"click\", inlineEvent, falseVar);\n doc.addEventListener(\"submit\", inlineEvent, falseVar);\n\n // 404 confirmation adds a request, so existing installs must opt in.\n if (\n overwriteOptions.detect404 === trueVar ||\n attr(scriptElement, \"detect-404\") == trueText\n ) {\n var detect404 = function () {\n if (\n !/\\b404\\b/.test(doc.title + \" \" + (doc.body && doc.body.textContent))\n )\n return;\n try {\n var request = new window.XMLHttpRequest();\n request.open(\"HEAD\", loc.href, trueVar);\n request.onload = function () {\n if (request.status === 404)\n sendEvent(\"page_404\", {\n url: loc.protocol + \"//\" + definedHostname + loc.pathname,\n status: 404,\n });\n };\n request.send();\n } catch (error) {}\n };\n if (doc.readyState === \"loading\")\n doc.addEventListener(\"DOMContentLoaded\", detect404, falseVar);\n else detect404();\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"simpleanalyticscdn.com\",\n \"queue.\",\n \"cdn_hello_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","protocol","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","keepalive","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","imageUrl","key","fetch","mode","credentials","catch","src","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue","detect404","inlineEvent","element","target","parentNode","isForm","tagName","button","tag","toLowerCase","attributes","submitter","button_text","textContent","trim","title","request","XMLHttpRequest","open","href","status","url","send","readyState"],"mappings":"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"} \ No newline at end of file diff --git a/dist/latest/latest.dev.js b/dist/latest/latest.dev.js index 57f7f5dd..7fcde746 100644 --- a/dist/latest/latest.dev.js +++ b/dist/latest/latest.dev.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-16; 4ae9; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-15; 9630; v12) */ /* eslint-env browser */ (function ( @@ -296,7 +296,7 @@ // // Send data via image - var sendData = function (data, callback, onlyThisData) { + var sendData = function (data, callback, onlyThisData, keepalive) { data = onlyThisData ? data : assign(payload, page, data); if (nav.brave && !onlyThisData) data.brave = trueVar; @@ -309,7 +309,7 @@ image.onerror = callback; image.onload = callback; } - image.src = + var imageUrl = fullApiUrl + "/simple.gif?" + Object.keys(data) @@ -326,6 +326,23 @@ .join("&") + "&time=" + Date.now(); + + // Inline events must survive navigation without taking over links or forms. + if (keepalive && window.fetch) { + try { + window + .fetch(imageUrl, { + keepalive: trueVar, + mode: "no-cors", + credentials: "omit", + }) + .catch(function () { + image.src = imageUrl; + }); + return; + } catch (error) {} + } + image.src = imageUrl; }; // Customers can overwrite their hostname, here we check for that @@ -905,7 +922,7 @@ var validTypes = ["string", "number"]; - var sendEvent = function (event, metadata, callbackRaw) { + var sendEvent = function (event, metadata, callbackRaw, keepalive) { if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata; var eventIsFunction = isFunction(event); @@ -953,7 +970,9 @@ metadata: stringify(metadata), }), - callback + callback, + undefinedVar, + keepalive ); } }; @@ -982,6 +1001,71 @@ : sendEvent(queue[event]); } } + + var inlineEvent = function (event) { + var element = event.target; + while ( + element && + element !== doc && + (!element.getAttribute || attr(element, "simple-event") === null) + ) + element = element.parentNode; + + if (!element || element === doc) return; + var isForm = element.tagName === "FORM"; + var name = attr(element, "simple-event"); + if (!name || isForm !== (event.type === "submit")) return; + + var metadata = { tag: element.tagName.toLowerCase() }; + var attributes = element.attributes; + for (var i = 0; i < attributes.length; i++) { + var attribute = attributes[i]; + if (attribute.name.indexOf("data-simple-event-") === 0) + metadata[attribute.name.slice(18).replace(/-/g, "_")] = + attribute.value; + } + if (isForm) { + var button = event.submitter; + metadata.button_text = button + ? (button.textContent || button.value || "") + .replace(/\s+/g, " ") + .trim() + .slice(0, 200) + : ""; + } + sendEvent(name, metadata, undefinedVar, trueVar); + }; + + doc.addEventListener("click", inlineEvent, falseVar); + doc.addEventListener("submit", inlineEvent, falseVar); + + // 404 confirmation adds a request, so existing installs must opt in. + if ( + overwriteOptions.detect404 === trueVar || + attr(scriptElement, "detect-404") == trueText + ) { + var detect404 = function () { + if ( + !/\b404\b/.test(doc.title + " " + (doc.body && doc.body.textContent)) + ) + return; + try { + var request = new window.XMLHttpRequest(); + request.open("HEAD", loc.href, trueVar); + request.onload = function () { + if (request.status === 404) + sendEvent("page_404", { + url: loc.protocol + "//" + definedHostname + loc.pathname, + status: 404, + }); + }; + request.send(); + } catch (error) {} + }; + if (doc.readyState === "loading") + doc.addEventListener("DOMContentLoaded", detect404, falseVar); + else detect404(); + } } catch (e) { sendError(e); } diff --git a/dist/latest/latest.js b/dist/latest/latest.js index d4e8c8eb..51b46912 100644 --- a/dist/latest/latest.js +++ b/dist/latest/latest.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-16; dbab; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-15; 986a; v12) */ -!function(d,t,e,n,m){try{var v=undefined,g=!0,y=!1,r="true",a="https:",_="pageview",u="event",i="error",o=d.console,c="doNotTrack",w=d.navigator,s=d.location,b=s.host,l=d.document,p=w.userAgent,f="Not sending request ",h=f+"when ",O=y,E=encodeURIComponent,x=decodeURIComponent,S=JSON.stringify,k=d.addEventListener,q="https://queue."+e,M=l.documentElement||{},A="language",$="Height",j="scroll",D=w.userAgentData,C=j+$,R="offset"+$,H="client"+$,P="pagehide",T="platform",U="platformVersion",I="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),N=d.screen,z=l.currentScript||l.querySelector('script[src*="'+e+'"]');m=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){m("Error in your "+t+" function:",e)},W=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},G=function(t){return"string"==typeof t},J=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},L=function(t,e){return t&&t.getAttribute("data-"+e)},Y=function(t){return Array.isArray(t)?t:G(t)&&t.length?t.split(/, ?/):[]},Z=function(t){return t&&t.constructor===Object},K=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},it=function(t){return"function"==typeof t},ot="namespace",ct=t[ot]||L(z,ot)||"sa",st=function(t,e){var n=d[ct+"_metadata"];Z(n)&&(t=K(t,n));var r=d[qt];if(!it(r))return qt&&m(qt+" not found, set window."+qt),t;try{return K(t,r.call(d,K(t,e)))}catch(a){F("metadata",a)}},ut=t.strictUtm||L(z,"strict-utm")==r,lt=function(i,t){tt=!i&&nt("q")?"":y;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");tt!==y&&0>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},it=function(t){return"function"==typeof t},ot="namespace",ct=t[ot]||J(B,ot)||"sa",st=function(t,e){var n=h[ct+"_metadata"];Y(n)&&(t=Z(t,n));var r=h[kt];if(!it(r))return kt&&m(kt+" not found, set window."+kt),t;try{return Z(t,r.call(h,Z(t,e)))}catch(a){F("metadata",a)}},ut=t.strictUtm||J(B,"strict-utm")==r,lt=function(i,t){tt=!i&&nt("q")?"":y;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");tt!==y&&0> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"simpleanalyticscdn.com\",\n \"queue.\",\n \"cdn_latest_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","protocol","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"latest.source.js","sources":["latest.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData, keepalive) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n var imageUrl =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n\n // Inline events must survive navigation without taking over links or forms.\n if (keepalive && window.fetch) {\n try {\n window\n .fetch(imageUrl, {\n keepalive: trueVar,\n mode: \"no-cors\",\n credentials: \"omit\",\n })\n .catch(function () {\n image.src = imageUrl;\n });\n return;\n } catch (error) {}\n }\n image.src = imageUrl;\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw, keepalive) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback,\n undefinedVar,\n keepalive\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n\n var inlineEvent = function (event) {\n var element = event.target;\n while (\n element &&\n element !== doc &&\n (!element.getAttribute || attr(element, \"simple-event\") === null)\n )\n element = element.parentNode;\n\n if (!element || element === doc) return;\n var isForm = element.tagName === \"FORM\";\n var name = attr(element, \"simple-event\");\n if (!name || isForm !== (event.type === \"submit\")) return;\n\n var metadata = { tag: element.tagName.toLowerCase() };\n var attributes = element.attributes;\n for (var i = 0; i < attributes.length; i++) {\n var attribute = attributes[i];\n if (attribute.name.indexOf(\"data-simple-event-\") === 0)\n metadata[attribute.name.slice(18).replace(/-/g, \"_\")] =\n attribute.value;\n }\n if (isForm) {\n var button = event.submitter;\n metadata.button_text = button\n ? (button.textContent || button.value || \"\")\n .replace(/\\s+/g, \" \")\n .trim()\n .slice(0, 200)\n : \"\";\n }\n sendEvent(name, metadata, undefinedVar, trueVar);\n };\n\n doc.addEventListener(\"click\", inlineEvent, falseVar);\n doc.addEventListener(\"submit\", inlineEvent, falseVar);\n\n // 404 confirmation adds a request, so existing installs must opt in.\n if (\n overwriteOptions.detect404 === trueVar ||\n attr(scriptElement, \"detect-404\") == trueText\n ) {\n var detect404 = function () {\n if (\n !/\\b404\\b/.test(doc.title + \" \" + (doc.body && doc.body.textContent))\n )\n return;\n try {\n var request = new window.XMLHttpRequest();\n request.open(\"HEAD\", loc.href, trueVar);\n request.onload = function () {\n if (request.status === 404)\n sendEvent(\"page_404\", {\n url: loc.protocol + \"//\" + definedHostname + loc.pathname,\n status: 404,\n });\n };\n request.send();\n } catch (error) {}\n };\n if (doc.readyState === \"loading\")\n doc.addEventListener(\"DOMContentLoaded\", detect404, falseVar);\n else detect404();\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"simpleanalyticscdn.com\",\n \"queue.\",\n \"cdn_latest_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","protocol","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","keepalive","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","imageUrl","key","fetch","mode","credentials","catch","src","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue","detect404","inlineEvent","element","target","parentNode","isForm","tagName","button","tag","toLowerCase","attributes","submitter","button_text","textContent","trim","title","request","XMLHttpRequest","open","href","status","url","send","readyState"],"mappings":"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"} \ No newline at end of file diff --git a/dist/latest/light.js b/dist/latest/light.js index 8f61160b..807f3d77 100644 --- a/dist/latest/light.js +++ b/dist/latest/light.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-16; 5f98; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-15; a4f9; v12) */ -!function(l,e,t,f){try{var u=undefined,n="https:",r=l.console,a="doNotTrack",m=l.navigator,p=l.location,g=p.host,i=l.document,o=m.userAgent,c="Not sending request ",h=!1,s=encodeURIComponent,d=decodeURIComponent,v=JSON.stringify,y=l.addEventListener,_="https://queue."+t,b=(i.documentElement,"language"),w=m.userAgentData,O="platform",S="platformVersion",j="https://docs.simpleanalytics.com",k=/(bot|spider|crawl)/i.test(o)&&!/(cubot)/i.test(o),E=i.currentScript||i.querySelector('script[src*="'+t+'"]');f=function(){var e=[].slice.call(arguments);return e.unshift("Simple Analytics:"),Function.prototype.apply.call(r.warn,r,e)};var q=function(e){return"string"==typeof e},x=function(e,t){return e&&e.getAttribute("data-"+t)},A=function(){for(var e,t,n,r={},a=arguments,i=0;i>e/4).toString(16)})}catch(r){return e.replace(n,function(e){var t=16*Math.random()|0;return(e<2?t:3&t|8).toString(16)})}},N=function(e){return"function"==typeof e},R="namespace",U=e[R]||x(E,R)||"sa",V=e.strictUtm||"true"==x(E,"strict-utm"),B=U+"_loaded";if(1==l[B])return f(c+"twice");l.sa_event_loaded=!0,l[B]=!0;var C,T=function(t,e,n){t=n?t:A(J,M,t),m.brave&&!n&&(t.brave=!0),m._duckduckgoloader_&&!n&&(t.duck=!0),(new Image).src=_+"/simple.gif?"+Object.keys(t).filter(function(e){return t[e]!=u}).map(function(e){return s(e)+"="+s(t[e])}).join("&")+"&time="+Date.now()},F=e.hostname||x(E,"hostname"),H=F||g,z={version:"cdn_light_12",hostname:H};e.mode||x(E,"mode");try{C=Intl.DateTimeFormat().resolvedOptions().timeZone}catch(X){f(X)}k&&(z.bot=!0);var J=A(z,{ua:o,https:p.protocol==n,timezone:C,page_id:I(),session_id:I()});if(J.sri=!1,w&&(J.mobile=w.mobile,J.brands=v(w.brands)),H!==g&&(J.hostname_original=g),a in m&&"1"==m[a])return f("Not sending request when "+a+" is enabled. See "+j+"/dnt");-1!=g.indexOf(".")&&!/^[0-9.:]+$/.test(g)||F||f("Set hostname on "+g+". See "+j+"/overwrite-domain-name");var L,M={},P=(e.referrer||x(E,"referrer")||i.referrer||"").replace(g,H).replace(/^https?:\/\/((m|l|w{2,3}([0-9]+)?)\.)?([^?#]+)(.*)$/,"$4").replace(/^([^/]+)$/,"$1")||u,Z=function(e,t){var n=A(z,{type:"append",original_id:t?e:J.page_id});if(t||!m.sendBeacon)T(n,0,!0);else try{m.sendBeacon.bind(m)(_+"/append",v(n))}catch(r){T(n,0,!0)}};y("pagehide",Z,!1);var G,K,Q=function(e){var t="";try{t=e||d(p.pathname)}catch(X){f(X)}return t},W=function(e,t,n,r,a,i){e&&Z(""+J.page_id,!0),J.page_id=I();var o,c=H+Q(),s=(o=t,(r||p.search).slice(1).split("&").filter(function(e){return!o&&new RegExp("^((utm_)"+(V?"":"?")+"(source|medium|content|term|campaign)"+(V?"":"|ref")+")=","i").test(e)}).join("&")||u);T({id:J.page_id,type:"pageview",referrer:!t||n?P:null,query:s}),P=c,0};!function(e,t,n,r){!r&&N(n)&&(r=n);var a,i;N(r);q(t)&&-1>e/4).toString(16)})}catch(r){return e.replace(n,function(e){var t=16*Math.random()|0;return(e<2?t:3&t|8).toString(16)})}},N=function(e){return"function"==typeof e},R="namespace",U=e[R]||x(E,R)||"sa",V=e.strictUtm||"true"==x(E,"strict-utm"),B=U+"_loaded";if(1==l[B])return f(c+"twice");l.sa_event_loaded=!0,l[B]=!0;var C,T=function(t,e,n,r){t=n?t:A(J,M,t),m.brave&&!n&&(t.brave=!0),m._duckduckgoloader_&&!n&&(t.duck=!0);var a=new Image,i=_+"/simple.gif?"+Object.keys(t).filter(function(e){return t[e]!=u}).map(function(e){return s(e)+"="+s(t[e])}).join("&")+"&time="+Date.now();a.src=i},F=e.hostname||x(E,"hostname"),H=F||g,z={version:"cdn_light_12",hostname:H};e.mode||x(E,"mode");try{C=Intl.DateTimeFormat().resolvedOptions().timeZone}catch(X){f(X)}k&&(z.bot=!0);var J=A(z,{ua:o,https:p.protocol==n,timezone:C,page_id:I(),session_id:I()});if(J.sri=!1,w&&(J.mobile=w.mobile,J.brands=v(w.brands)),H!==g&&(J.hostname_original=g),a in m&&"1"==m[a])return f("Not sending request when "+a+" is enabled. See "+j+"/dnt");-1!=g.indexOf(".")&&!/^[0-9.:]+$/.test(g)||F||f("Set hostname on "+g+". See "+j+"/overwrite-domain-name");var L,M={},P=(e.referrer||x(E,"referrer")||i.referrer||"").replace(g,H).replace(/^https?:\/\/((m|l|w{2,3}([0-9]+)?)\.)?([^?#]+)(.*)$/,"$4").replace(/^([^/]+)$/,"$1")||u,Z=function(e,t){var n=A(z,{type:"append",original_id:t?e:J.page_id});if(t||!m.sendBeacon)T(n,0,!0);else try{m.sendBeacon.bind(m)(_+"/append",v(n))}catch(r){T(n,0,!0)}};y("pagehide",Z,!1);var G,K,Q=function(e){var t="";try{t=e||d(p.pathname)}catch(X){f(X)}return t},W=function(e,t,n,r,a,i){e&&Z(""+J.page_id,!0),J.page_id=I();var o,c=H+Q(),s=(o=t,(r||p.search).slice(1).split("&").filter(function(e){return!o&&new RegExp("^((utm_)"+(V?"":"?")+"(source|medium|content|term|campaign)"+(V?"":"|ref")+")=","i").test(e)}).join("&")||u);T({id:J.page_id,type:"pageview",referrer:!t||n?P:null,query:s}),P=c,0};!function(e,t,n,r){!r&&N(n)&&(r=n);var a,i;N(r);q(t)&&-1> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n if (ignore) return falseVar;\n // eslint-disable-next-line no-redeclare\n var regex =\n \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \")=\";\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n return q || undefinedVar;\n };\n\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n\n\n\n\n\n\n\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n // eslint-disable-next-line no-redeclare\n var bot = isBotAgent;\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n\n\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n sameSite = referrer\n ? referrer.split(slash)[0] == locationHostname\n : falseVar;\n\n\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n\n\n pageview();\n\n } catch (e) {\n warn(e);\n }\n})(\n window,\n {},\n \"simpleanalyticscdn.com\",\n \"queue.\",\n \"cdn_light_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","warn","undefinedVar","undefined","https","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","protocol","language","documentElement","uaData","userAgentData","platformText","platformVersionText","docsUrl","isBotAgent","test","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","isString","string","attr","attribute","getAttribute","assign","obj","prop","object","to","arg","index","length","nextSource","constructor","Object","nextKey","hasOwnProperty","settings","sa_settings","logSettings","keys","Date","now","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","replace","c","getRandomValues","Uint8Array","toString","error","r","Math","random","isFunction","func","namespaceText","namespace","strictUtm","loadedVariable","sa_event_loaded","timezone","sendData","data","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","Image","src","filter","key","map","join","overwrittenHostname","hostname","definedHostname","basePayload","version","mode","Intl","DateTimeFormat","resolvedOptions","timeZone","bot","ua","page_id","session_id","sri","mobile","brands","hostname_original","indexOf","lastSendPath","referrer","sendOnLeave","id","push","append","type","original_id","sendBeacon","bind","e","sameSite","userNavigated","getPath","overwrite","path","pathname","sendPageView","isPushState","deleteSourceInfo","search","metadata","ignoreSource","currentPage","query","split","keyValue","RegExp","pages","pathOverwrite","callbackRaw","querySearch","parts","shift","performaceEntryType","perf","performance","navigationText","getEntriesByType","triggerSendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","pageview"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"light.source.js","sources":["light.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n\n var collectMetricByString = function (metricAbbreviation) {\n // eslint-disable-next-line no-unreachable\n return true;\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n if (ignore) return falseVar;\n // eslint-disable-next-line no-redeclare\n var regex =\n \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \")=\";\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n return q || undefinedVar;\n };\n\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData, keepalive) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n var imageUrl =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n\n image.src = imageUrl;\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n\n\n\n\n\n\n\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n // eslint-disable-next-line no-redeclare\n var bot = isBotAgent;\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n\n\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n sameSite = referrer\n ? referrer.split(slash)[0] == locationHostname\n : falseVar;\n\n\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n\n\n pageview();\n\n } catch (e) {\n warn(e);\n }\n})(\n window,\n {},\n \"simpleanalyticscdn.com\",\n \"queue.\",\n \"cdn_light_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","warn","undefinedVar","undefined","https","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","protocol","language","documentElement","uaData","userAgentData","platformText","platformVersionText","docsUrl","isBotAgent","test","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","isString","string","attr","attribute","getAttribute","assign","obj","prop","object","to","arg","index","length","nextSource","constructor","Object","nextKey","hasOwnProperty","settings","sa_settings","logSettings","keys","Date","now","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","replace","c","getRandomValues","Uint8Array","toString","error","r","Math","random","isFunction","func","namespaceText","namespace","strictUtm","loadedVariable","sa_event_loaded","timezone","sendData","data","callback","onlyThisData","keepalive","payload","page","brave","_duckduckgoloader_","duck","image","Image","imageUrl","filter","key","map","join","src","overwrittenHostname","hostname","definedHostname","basePayload","version","mode","Intl","DateTimeFormat","resolvedOptions","timeZone","bot","ua","page_id","session_id","sri","mobile","brands","hostname_original","indexOf","lastSendPath","referrer","sendOnLeave","id","push","append","type","original_id","sendBeacon","bind","e","sameSite","userNavigated","getPath","overwrite","path","pathname","sendPageView","isPushState","deleteSourceInfo","search","metadata","ignoreSource","currentPage","query","split","keyValue","RegExp","pages","pathOverwrite","callbackRaw","querySearch","parts","shift","performaceEntryType","perf","performance","navigationText","getEntriesByType","triggerSendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","pageview"],"mappings":"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"} \ No newline at end of file diff --git a/dist/v12/app.js b/dist/v12/app.js index a428f099..d8677e31 100644 --- a/dist/v12/app.js +++ b/dist/v12/app.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-16; ac4d; SRI-version; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-15; 093c; SRI-version; v12) */ -!function(d,t,e,n,m){try{var v=undefined,g=!0,y=!1,r="true",a="https:",_="pageview",u="event",i="error",o=d.console,c="doNotTrack",w=d.navigator,s=d.location,b=s.host,l=d.document,p=w.userAgent,f="Not sending request ",h=f+"when ",O=y,E=encodeURIComponent,x=decodeURIComponent,S=JSON.stringify,k=d.addEventListener,q="https://queue."+e,M=l.documentElement||{},A="language",$="Height",j="scroll",D=w.userAgentData,C=j+$,R="offset"+$,H="client"+$,P="pagehide",T="platform",U="platformVersion",I="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),N=d.screen,z=l.currentScript||l.querySelector('script[src*="'+e+'"]');m=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){m("Error in your "+t+" function:",e)},W=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},G=function(t){return"string"==typeof t},J=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},L=function(t,e){return t&&t.getAttribute("data-"+e)},Y=function(t){return Array.isArray(t)?t:G(t)&&t.length?t.split(/, ?/):[]},Z=function(t){return t&&t.constructor===Object},K=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},it=function(t){return"function"==typeof t},ot="namespace",ct=t[ot]||L(z,ot)||"sa",st=function(t,e){var n=d[ct+"_metadata"];Z(n)&&(t=K(t,n));var r=d[qt];if(!it(r))return qt&&m(qt+" not found, set window."+qt),t;try{return K(t,r.call(d,K(t,e)))}catch(a){F("metadata",a)}},ut=t.strictUtm||L(z,"strict-utm")==r,lt=function(i,t){tt=!i&&nt("q")?"":y;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");tt!==y&&0>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},it=function(t){return"function"==typeof t},ot="namespace",ct=t[ot]||J(B,ot)||"sa",st=function(t,e){var n=h[ct+"_metadata"];Y(n)&&(t=Z(t,n));var r=h[kt];if(!it(r))return kt&&m(kt+" not found, set window."+kt),t;try{return Z(t,r.call(h,Z(t,e)))}catch(a){F("metadata",a)}},ut=t.strictUtm||J(B,"strict-utm")==r,lt=function(i,t){tt=!i&&nt("q")?"":y;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");tt!==y&&0> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = trueVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"simpleanalyticscdn.com\",\n \"queue.\",\n \"cdn_latest_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","protocol","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"app.js","sources":["app.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData, keepalive) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n var imageUrl =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n\n // Inline events must survive navigation without taking over links or forms.\n if (keepalive && window.fetch) {\n try {\n window\n .fetch(imageUrl, {\n keepalive: trueVar,\n mode: \"no-cors\",\n credentials: \"omit\",\n })\n .catch(function () {\n image.src = imageUrl;\n });\n return;\n } catch (error) {}\n }\n image.src = imageUrl;\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = trueVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw, keepalive) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback,\n undefinedVar,\n keepalive\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n\n var inlineEvent = function (event) {\n var element = event.target;\n while (\n element &&\n element !== doc &&\n (!element.getAttribute || attr(element, \"simple-event\") === null)\n )\n element = element.parentNode;\n\n if (!element || element === doc) return;\n var isForm = element.tagName === \"FORM\";\n var name = attr(element, \"simple-event\");\n if (!name || isForm !== (event.type === \"submit\")) return;\n\n var metadata = { tag: element.tagName.toLowerCase() };\n var attributes = element.attributes;\n for (var i = 0; i < attributes.length; i++) {\n var attribute = attributes[i];\n if (attribute.name.indexOf(\"data-simple-event-\") === 0)\n metadata[attribute.name.slice(18).replace(/-/g, \"_\")] =\n attribute.value;\n }\n if (isForm) {\n var button = event.submitter;\n metadata.button_text = button\n ? (button.textContent || button.value || \"\")\n .replace(/\\s+/g, \" \")\n .trim()\n .slice(0, 200)\n : \"\";\n }\n sendEvent(name, metadata, undefinedVar, trueVar);\n };\n\n doc.addEventListener(\"click\", inlineEvent, falseVar);\n doc.addEventListener(\"submit\", inlineEvent, falseVar);\n\n // 404 confirmation adds a request, so existing installs must opt in.\n if (\n overwriteOptions.detect404 === trueVar ||\n attr(scriptElement, \"detect-404\") == trueText\n ) {\n var detect404 = function () {\n if (\n !/\\b404\\b/.test(doc.title + \" \" + (doc.body && doc.body.textContent))\n )\n return;\n try {\n var request = new window.XMLHttpRequest();\n request.open(\"HEAD\", loc.href, trueVar);\n request.onload = function () {\n if (request.status === 404)\n sendEvent(\"page_404\", {\n url: loc.protocol + \"//\" + definedHostname + loc.pathname,\n status: 404,\n });\n };\n request.send();\n } catch (error) {}\n };\n if (doc.readyState === \"loading\")\n doc.addEventListener(\"DOMContentLoaded\", detect404, falseVar);\n else detect404();\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"simpleanalyticscdn.com\",\n \"queue.\",\n \"cdn_latest_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","protocol","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","keepalive","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","imageUrl","key","fetch","mode","credentials","catch","src","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue","detect404","inlineEvent","element","target","parentNode","isForm","tagName","button","tag","toLowerCase","attributes","submitter","button_text","textContent","trim","title","request","XMLHttpRequest","open","href","status","url","send","readyState"],"mappings":"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"} \ No newline at end of file diff --git a/dist/v12/custom/app.js b/dist/v12/custom/app.js index 44f421ba..3cb3cb71 100644 --- a/dist/v12/custom/app.js +++ b/dist/v12/custom/app.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-16; 237b; SRI-version; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-15; 5aad; SRI-version; v12) */ -!function(d,t,e,n,m){try{var v=undefined,g=!0,y=!1,r="true",a="https:",_="pageview",u="event",i="error",o=d.console,c="doNotTrack",w=d.navigator,s=d.location,b=s.host,l=d.document,p=w.userAgent,f="Not sending request ",h=f+"when ",O=y,x=encodeURIComponent,E=decodeURIComponent,S=JSON.stringify,k=d.addEventListener,M="https://"+e,q=l.documentElement||{},A="language",$="Height",j="scroll",D=w.userAgentData,C=j+$,H="offset"+$,R="client"+$,P="pagehide",T="platform",U="platformVersion",I="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),N=d.screen,z=l.currentScript||l.querySelector('script[src*="'+e+'"]');m=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){m("Error in your "+t+" function:",e)},W=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},G=function(t){return"string"==typeof t},J=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},L=function(t,e){return t&&t.getAttribute("data-"+e)},Y=function(t){return Array.isArray(t)?t:G(t)&&t.length?t.split(/, ?/):[]},Z=function(t){return t&&t.constructor===Object},K=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},it=function(t){return"function"==typeof t},ot="namespace",ct=t[ot]||L(z,ot)||"sa",st=function(t,e){var n=d[ct+"_metadata"];Z(n)&&(t=K(t,n));var r=d[Mt];if(!it(r))return Mt&&m(Mt+" not found, set window."+Mt),t;try{return K(t,r.call(d,K(t,e)))}catch(a){F("metadata",a)}},ut=t.strictUtm||L(z,"strict-utm")==r,lt=function(i,t){tt=!i&&nt("q")?"":y;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");tt!==y&&0"); +!function(h,t,e,n,m){try{var v=undefined,g=!0,y=!1,r="true",a="https:",_="pageview",l="event",i="error",o=h.console,c="doNotTrack",b=h.navigator,s=h.location,w=s.host,u=h.document,p=b.userAgent,f="Not sending request ",d=f+"when ",O=y,x=encodeURIComponent,E=decodeURIComponent,M=JSON.stringify,S=h.addEventListener,k="https://"+e,A=u.documentElement||{},q="language",C="Height",D="scroll",$=b.userAgentData,j=D+C,H="offset"+C,R="client"+C,L="pagehide",N="platform",P="platformVersion",T="https://docs.simpleanalytics.com",U=0,I=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),V=h.screen,B=u.currentScript||u.querySelector('script[src*="'+e+'"]');m=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){m("Error in your "+t+" function:",e)},z=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},W=function(t){return"string"==typeof t},G=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},J=function(t,e){return t&&t.getAttribute("data-"+e)},X=function(t){return Array.isArray(t)?t:W(t)&&t.length?t.split(/, ?/):[]},Y=function(t){return t&&t.constructor===Object},Z=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},it=function(t){return"function"==typeof t},ot="namespace",ct=t[ot]||J(B,ot)||"sa",st=function(t,e){var n=h[ct+"_metadata"];Y(n)&&(t=Z(t,n));var r=h[kt];if(!it(r))return kt&&m(kt+" not found, set window."+kt),t;try{return Z(t,r.call(h,Z(t,e)))}catch(a){F("metadata",a)}},ut=t.strictUtm||J(B,"strict-utm")==r,lt=function(i,t){tt=!i&&nt("q")?"":y;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");tt!==y&&0"); //# sourceMappingURL=app.js.map \ No newline at end of file diff --git a/dist/v12/custom/app.js.map b/dist/v12/custom/app.js.map index 4cd0921e..de73d003 100644 --- a/dist/v12/custom/app.js.map +++ b/dist/v12/custom/app.js.map @@ -1 +1 @@ -{"version":3,"file":"app.source.js","sources":["app.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = trueVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_app_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","protocol","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"app.source.js","sources":["app.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData, keepalive) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n var imageUrl =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n\n // Inline events must survive navigation without taking over links or forms.\n if (keepalive && window.fetch) {\n try {\n window\n .fetch(imageUrl, {\n keepalive: trueVar,\n mode: \"no-cors\",\n credentials: \"omit\",\n })\n .catch(function () {\n image.src = imageUrl;\n });\n return;\n } catch (error) {}\n }\n image.src = imageUrl;\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = trueVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw, keepalive) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback,\n undefinedVar,\n keepalive\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n\n var inlineEvent = function (event) {\n var element = event.target;\n while (\n element &&\n element !== doc &&\n (!element.getAttribute || attr(element, \"simple-event\") === null)\n )\n element = element.parentNode;\n\n if (!element || element === doc) return;\n var isForm = element.tagName === \"FORM\";\n var name = attr(element, \"simple-event\");\n if (!name || isForm !== (event.type === \"submit\")) return;\n\n var metadata = { tag: element.tagName.toLowerCase() };\n var attributes = element.attributes;\n for (var i = 0; i < attributes.length; i++) {\n var attribute = attributes[i];\n if (attribute.name.indexOf(\"data-simple-event-\") === 0)\n metadata[attribute.name.slice(18).replace(/-/g, \"_\")] =\n attribute.value;\n }\n if (isForm) {\n var button = event.submitter;\n metadata.button_text = button\n ? (button.textContent || button.value || \"\")\n .replace(/\\s+/g, \" \")\n .trim()\n .slice(0, 200)\n : \"\";\n }\n sendEvent(name, metadata, undefinedVar, trueVar);\n };\n\n doc.addEventListener(\"click\", inlineEvent, falseVar);\n doc.addEventListener(\"submit\", inlineEvent, falseVar);\n\n // 404 confirmation adds a request, so existing installs must opt in.\n if (\n overwriteOptions.detect404 === trueVar ||\n attr(scriptElement, \"detect-404\") == trueText\n ) {\n var detect404 = function () {\n if (\n !/\\b404\\b/.test(doc.title + \" \" + (doc.body && doc.body.textContent))\n )\n return;\n try {\n var request = new window.XMLHttpRequest();\n request.open(\"HEAD\", loc.href, trueVar);\n request.onload = function () {\n if (request.status === 404)\n sendEvent(\"page_404\", {\n url: loc.protocol + \"//\" + definedHostname + loc.pathname,\n status: 404,\n });\n };\n request.send();\n } catch (error) {}\n };\n if (doc.readyState === \"loading\")\n doc.addEventListener(\"DOMContentLoaded\", detect404, falseVar);\n else detect404();\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_app_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","keepalive","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","imageUrl","key","fetch","mode","credentials","catch","src","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","protocol","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue","detect404","inlineEvent","element","target","parentNode","isForm","tagName","button","tag","toLowerCase","attributes","submitter","button_text","textContent","trim","title","request","XMLHttpRequest","open","href","status","url","send","readyState"],"mappings":"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"} \ No newline at end of file diff --git a/dist/v12/custom/light.js b/dist/v12/custom/light.js index f76cb58a..219d3898 100644 --- a/dist/v12/custom/light.js +++ b/dist/v12/custom/light.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-16; ede2; SRI-version; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-15; 0001; SRI-version; v12) */ -!function(l,e,t,f){try{var u=undefined,n="https:",r=l.console,i="doNotTrack",m=l.navigator,p=l.location,g=p.host,a=l.document,o=m.userAgent,c="Not sending request ",h=!1,s=encodeURIComponent,d=decodeURIComponent,v=JSON.stringify,y=l.addEventListener,_="https://"+t,b=(a.documentElement,"language"),w=m.userAgentData,O="platform",S="platformVersion",j="https://docs.simpleanalytics.com",k=/(bot|spider|crawl)/i.test(o)&&!/(cubot)/i.test(o),x=a.currentScript||a.querySelector('script[src*="'+t+'"]');f=function(){var e=[].slice.call(arguments);return e.unshift("Simple Analytics:"),Function.prototype.apply.call(r.warn,r,e)};var E=function(e){return"string"==typeof e},A=function(e,t){return e&&e.getAttribute("data-"+t)},$=function(){for(var e,t,n,r={},i=arguments,a=0;a>e/4).toString(16)})}catch(r){return e.replace(n,function(e){var t=16*Math.random()|0;return(e<2?t:3&t|8).toString(16)})}},N=function(e){return"function"==typeof e},R="namespace",U=e[R]||A(x,R)||"sa",V=e.strictUtm||"true"==A(x,"strict-utm"),B=U+"_loaded";if(1==l[B])return f(c+"twice");l.sa_event_loaded=!0,l[B]=!0;var C,H=function(t,e,n){t=n?t:$(J,M,t),m.brave&&!n&&(t.brave=!0),m._duckduckgoloader_&&!n&&(t.duck=!0),(new Image).src=_+"/simple.gif?"+Object.keys(t).filter(function(e){return t[e]!=u}).map(function(e){return s(e)+"="+s(t[e])}).join("&")+"&time="+Date.now()},T=e.hostname||A(x,"hostname"),F=T||g,z={version:"custom_light_12",hostname:F};e.mode||A(x,"mode");try{C=Intl.DateTimeFormat().resolvedOptions().timeZone}catch(X){f(X)}k&&(z.bot=!0);var J=$(z,{ua:o,https:p.protocol==n,timezone:C,page_id:I(),session_id:I()});if(J.sri=!0,w&&(J.mobile=w.mobile,J.brands=v(w.brands)),F!==g&&(J.hostname_original=g),i in m&&"1"==m[i])return f("Not sending request when "+i+" is enabled. See "+j+"/dnt");-1!=g.indexOf(".")&&!/^[0-9.:]+$/.test(g)||T||f("Set hostname on "+g+". See "+j+"/overwrite-domain-name");var L,M={},P=(e.referrer||A(x,"referrer")||a.referrer||"").replace(g,F).replace(/^https?:\/\/((m|l|w{2,3}([0-9]+)?)\.)?([^?#]+)(.*)$/,"$4").replace(/^([^/]+)$/,"$1")||u,Z=function(e,t){var n=$(z,{type:"append",original_id:t?e:J.page_id});if(t||!m.sendBeacon)H(n,0,!0);else try{m.sendBeacon.bind(m)(_+"/append",v(n))}catch(r){H(n,0,!0)}};y("pagehide",Z,!1);var G,K,Q=function(e){var t="";try{t=e||d(p.pathname)}catch(X){f(X)}return t},W=function(e,t,n,r,i,a){e&&Z(""+J.page_id,!0),J.page_id=I();var o,c=F+Q(),s=(o=t,(r||p.search).slice(1).split("&").filter(function(e){return!o&&new RegExp("^((utm_)"+(V?"":"?")+"(source|medium|content|term|campaign)"+(V?"":"|ref")+")=","i").test(e)}).join("&")||u);H({id:J.page_id,type:"pageview",referrer:!t||n?P:null,query:s}),P=c,0};!function(e,t,n,r){!r&&N(n)&&(r=n);var i,a;N(r);E(t)&&-1"); +!function(l,e,t,f){try{var u=undefined,n="https:",r=l.console,a="doNotTrack",m=l.navigator,p=l.location,g=p.host,i=l.document,o=m.userAgent,c="Not sending request ",h=!1,s=encodeURIComponent,d=decodeURIComponent,v=JSON.stringify,y=l.addEventListener,_="https://"+t,b=(i.documentElement,"language"),w=m.userAgentData,O="platform",S="platformVersion",j="https://docs.simpleanalytics.com",k=/(bot|spider|crawl)/i.test(o)&&!/(cubot)/i.test(o),x=i.currentScript||i.querySelector('script[src*="'+t+'"]');f=function(){var e=[].slice.call(arguments);return e.unshift("Simple Analytics:"),Function.prototype.apply.call(r.warn,r,e)};var E=function(e){return"string"==typeof e},A=function(e,t){return e&&e.getAttribute("data-"+t)},$=function(){for(var e,t,n,r={},a=arguments,i=0;i>e/4).toString(16)})}catch(r){return e.replace(n,function(e){var t=16*Math.random()|0;return(e<2?t:3&t|8).toString(16)})}},N=function(e){return"function"==typeof e},R="namespace",U=e[R]||A(x,R)||"sa",V=e.strictUtm||"true"==A(x,"strict-utm"),B=U+"_loaded";if(1==l[B])return f(c+"twice");l.sa_event_loaded=!0,l[B]=!0;var C,H=function(t,e,n,r){t=n?t:$(J,M,t),m.brave&&!n&&(t.brave=!0),m._duckduckgoloader_&&!n&&(t.duck=!0);var a=new Image,i=_+"/simple.gif?"+Object.keys(t).filter(function(e){return t[e]!=u}).map(function(e){return s(e)+"="+s(t[e])}).join("&")+"&time="+Date.now();a.src=i},T=e.hostname||A(x,"hostname"),F=T||g,z={version:"custom_light_12",hostname:F};e.mode||A(x,"mode");try{C=Intl.DateTimeFormat().resolvedOptions().timeZone}catch(X){f(X)}k&&(z.bot=!0);var J=$(z,{ua:o,https:p.protocol==n,timezone:C,page_id:I(),session_id:I()});if(J.sri=!0,w&&(J.mobile=w.mobile,J.brands=v(w.brands)),F!==g&&(J.hostname_original=g),a in m&&"1"==m[a])return f("Not sending request when "+a+" is enabled. See "+j+"/dnt");-1!=g.indexOf(".")&&!/^[0-9.:]+$/.test(g)||T||f("Set hostname on "+g+". See "+j+"/overwrite-domain-name");var L,M={},P=(e.referrer||A(x,"referrer")||i.referrer||"").replace(g,F).replace(/^https?:\/\/((m|l|w{2,3}([0-9]+)?)\.)?([^?#]+)(.*)$/,"$4").replace(/^([^/]+)$/,"$1")||u,Z=function(e,t){var n=$(z,{type:"append",original_id:t?e:J.page_id});if(t||!m.sendBeacon)H(n,0,!0);else try{m.sendBeacon.bind(m)(_+"/append",v(n))}catch(r){H(n,0,!0)}};y("pagehide",Z,!1);var G,K,Q=function(e){var t="";try{t=e||d(p.pathname)}catch(X){f(X)}return t},W=function(e,t,n,r,a,i){e&&Z(""+J.page_id,!0),J.page_id=I();var o,c=F+Q(),s=(o=t,(r||p.search).slice(1).split("&").filter(function(e){return!o&&new RegExp("^((utm_)"+(V?"":"?")+"(source|medium|content|term|campaign)"+(V?"":"|ref")+")=","i").test(e)}).join("&")||u);H({id:J.page_id,type:"pageview",referrer:!t||n?P:null,query:s}),P=c,0};!function(e,t,n,r){!r&&N(n)&&(r=n);var a,i;N(r);E(t)&&-1"); //# sourceMappingURL=light.js.map \ No newline at end of file diff --git a/dist/v12/custom/light.js.map b/dist/v12/custom/light.js.map index 4563a96f..07a0c737 100644 --- a/dist/v12/custom/light.js.map +++ b/dist/v12/custom/light.js.map @@ -1 +1 @@ -{"version":3,"file":"light.source.js","sources":["light.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n\n var collectMetricByString = function (metricAbbreviation) {\n // eslint-disable-next-line no-unreachable\n return true;\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n if (ignore) return falseVar;\n // eslint-disable-next-line no-redeclare\n var regex =\n \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \")=\";\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n return q || undefinedVar;\n };\n\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n\n\n\n\n\n\n\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n // eslint-disable-next-line no-redeclare\n var bot = isBotAgent;\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = trueVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n\n\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n sameSite = referrer\n ? referrer.split(slash)[0] == locationHostname\n : falseVar;\n\n\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n\n\n pageview();\n\n } catch (e) {\n warn(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_light_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","warn","undefinedVar","undefined","https","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","language","documentElement","uaData","userAgentData","platformText","platformVersionText","docsUrl","isBotAgent","test","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","isString","string","attr","attribute","getAttribute","assign","obj","prop","object","to","arg","index","length","nextSource","constructor","Object","nextKey","hasOwnProperty","settings","sa_settings","logSettings","keys","Date","now","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","replace","c","getRandomValues","Uint8Array","toString","error","r","Math","random","isFunction","func","namespaceText","namespace","strictUtm","loadedVariable","sa_event_loaded","timezone","sendData","data","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","Image","src","filter","key","map","join","overwrittenHostname","hostname","definedHostname","basePayload","version","mode","Intl","DateTimeFormat","resolvedOptions","timeZone","bot","ua","protocol","page_id","session_id","sri","mobile","brands","hostname_original","indexOf","lastSendPath","referrer","sendOnLeave","id","push","append","type","original_id","sendBeacon","bind","e","sameSite","userNavigated","getPath","overwrite","path","pathname","sendPageView","isPushState","deleteSourceInfo","search","metadata","ignoreSource","currentPage","query","split","keyValue","RegExp","pages","pathOverwrite","callbackRaw","querySearch","parts","shift","performaceEntryType","perf","performance","navigationText","getEntriesByType","triggerSendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","pageview"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"light.source.js","sources":["light.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n\n var collectMetricByString = function (metricAbbreviation) {\n // eslint-disable-next-line no-unreachable\n return true;\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n if (ignore) return falseVar;\n // eslint-disable-next-line no-redeclare\n var regex =\n \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \")=\";\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n return q || undefinedVar;\n };\n\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData, keepalive) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n var imageUrl =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n\n image.src = imageUrl;\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n\n\n\n\n\n\n\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n // eslint-disable-next-line no-redeclare\n var bot = isBotAgent;\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = trueVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n\n\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n sameSite = referrer\n ? referrer.split(slash)[0] == locationHostname\n : falseVar;\n\n\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n\n\n pageview();\n\n } catch (e) {\n warn(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_light_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","warn","undefinedVar","undefined","https","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","language","documentElement","uaData","userAgentData","platformText","platformVersionText","docsUrl","isBotAgent","test","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","isString","string","attr","attribute","getAttribute","assign","obj","prop","object","to","arg","index","length","nextSource","constructor","Object","nextKey","hasOwnProperty","settings","sa_settings","logSettings","keys","Date","now","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","replace","c","getRandomValues","Uint8Array","toString","error","r","Math","random","isFunction","func","namespaceText","namespace","strictUtm","loadedVariable","sa_event_loaded","timezone","sendData","data","callback","onlyThisData","keepalive","payload","page","brave","_duckduckgoloader_","duck","image","Image","imageUrl","filter","key","map","join","src","overwrittenHostname","hostname","definedHostname","basePayload","version","mode","Intl","DateTimeFormat","resolvedOptions","timeZone","bot","ua","protocol","page_id","session_id","sri","mobile","brands","hostname_original","indexOf","lastSendPath","referrer","sendOnLeave","id","push","append","type","original_id","sendBeacon","bind","e","sameSite","userNavigated","getPath","overwrite","path","pathname","sendPageView","isPushState","deleteSourceInfo","search","metadata","ignoreSource","currentPage","query","split","keyValue","RegExp","pages","pathOverwrite","callbackRaw","querySearch","parts","shift","performaceEntryType","perf","performance","navigationText","getEntriesByType","triggerSendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","pageview"],"mappings":"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"} \ No newline at end of file diff --git a/dist/v12/custom/proxy.js b/dist/v12/custom/proxy.js index e8c67911..c6cdbd30 100644 --- a/dist/v12/custom/proxy.js +++ b/dist/v12/custom/proxy.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-16; 6f40; SRI-version; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-15; 8696; SRI-version; v12) */ -!function(d,t,e,n,m){try{var v=undefined,g=!0,y=!1,r="true",a="https:",_="pageview",u="event",i="error",o=d.console,c="doNotTrack",w=d.navigator,s=d.location,b=s.host,l=d.document,p=w.userAgent,f="Not sending request ",h=f+"when ",x=y,O=encodeURIComponent,E=decodeURIComponent,S=JSON.stringify,k=d.addEventListener,M="https://"+e,q=l.documentElement||{},A="language",$="Height",j="scroll",D=w.userAgentData,C=j+$,H="offset"+$,P="client"+$,R="pagehide",T="platform",U="platformVersion",I="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),N=d.screen,z=l.currentScript||l.querySelector('script[src*="'+e+'"]');m=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){m("Error in your "+t+" function:",e)},W=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},G=function(t){return"string"==typeof t},J=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},L=function(t,e){return t&&t.getAttribute("data-"+e)},Y=function(t){return Array.isArray(t)?t:G(t)&&t.length?t.split(/, ?/):[]},Z=function(t){return t&&t.constructor===Object},K=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},it=function(t){return"function"==typeof t},ot="namespace",ct=t[ot]||L(z,ot)||"sa",st=function(t,e){var n=d[ct+"_metadata"];Z(n)&&(t=K(t,n));var r=d[Mt];if(!it(r))return Mt&&m(Mt+" not found, set window."+Mt),t;try{return K(t,r.call(d,K(t,e)))}catch(a){F("metadata",a)}},ut=t.strictUtm||L(z,"strict-utm")==r,lt=function(i,t){tt=!i&&nt("q")?"":y;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");tt!==y&&0"); +!function(h,t,e,n,m){try{var v=undefined,g=!0,y=!1,r="true",a="https:",_="pageview",l="event",i="error",o=h.console,c="doNotTrack",b=h.navigator,s=h.location,w=s.host,u=h.document,p=b.userAgent,f="Not sending request ",d=f+"when ",x=y,O=encodeURIComponent,E=decodeURIComponent,M=JSON.stringify,S=h.addEventListener,k="https://"+e,A=u.documentElement||{},q="language",C="Height",D="scroll",$=b.userAgentData,j=D+C,H="offset"+C,R="client"+C,L="pagehide",N="platform",P="platformVersion",T="https://docs.simpleanalytics.com",U=0,I=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),V=h.screen,B=u.currentScript||u.querySelector('script[src*="'+e+'"]');m=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){m("Error in your "+t+" function:",e)},z=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},W=function(t){return"string"==typeof t},G=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},J=function(t,e){return t&&t.getAttribute("data-"+e)},X=function(t){return Array.isArray(t)?t:W(t)&&t.length?t.split(/, ?/):[]},Y=function(t){return t&&t.constructor===Object},Z=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},it=function(t){return"function"==typeof t},ot="namespace",ct=t[ot]||J(B,ot)||"sa",st=function(t,e){var n=h[ct+"_metadata"];Y(n)&&(t=Z(t,n));var r=h[kt];if(!it(r))return kt&&m(kt+" not found, set window."+kt),t;try{return Z(t,r.call(h,Z(t,e)))}catch(a){F("metadata",a)}},ut=t.strictUtm||J(B,"strict-utm")==r,lt=function(i,t){tt=!i&&nt("q")?"":y;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");tt!==y&&0"); //# sourceMappingURL=proxy.js.map \ No newline at end of file diff --git a/dist/v12/custom/proxy.js.map b/dist/v12/custom/proxy.js.map index fe419aa0..c82de948 100644 --- a/dist/v12/custom/proxy.js.map +++ b/dist/v12/custom/proxy.js.map @@ -1 +1 @@ -{"version":3,"file":"proxy.source.js","sources":["proxy.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = trueVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_proxy_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","protocol","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"proxy.source.js","sources":["proxy.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData, keepalive) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n var imageUrl =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n\n // Inline events must survive navigation without taking over links or forms.\n if (keepalive && window.fetch) {\n try {\n window\n .fetch(imageUrl, {\n keepalive: trueVar,\n mode: \"no-cors\",\n credentials: \"omit\",\n })\n .catch(function () {\n image.src = imageUrl;\n });\n return;\n } catch (error) {}\n }\n image.src = imageUrl;\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = trueVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw, keepalive) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback,\n undefinedVar,\n keepalive\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n\n var inlineEvent = function (event) {\n var element = event.target;\n while (\n element &&\n element !== doc &&\n (!element.getAttribute || attr(element, \"simple-event\") === null)\n )\n element = element.parentNode;\n\n if (!element || element === doc) return;\n var isForm = element.tagName === \"FORM\";\n var name = attr(element, \"simple-event\");\n if (!name || isForm !== (event.type === \"submit\")) return;\n\n var metadata = { tag: element.tagName.toLowerCase() };\n var attributes = element.attributes;\n for (var i = 0; i < attributes.length; i++) {\n var attribute = attributes[i];\n if (attribute.name.indexOf(\"data-simple-event-\") === 0)\n metadata[attribute.name.slice(18).replace(/-/g, \"_\")] =\n attribute.value;\n }\n if (isForm) {\n var button = event.submitter;\n metadata.button_text = button\n ? (button.textContent || button.value || \"\")\n .replace(/\\s+/g, \" \")\n .trim()\n .slice(0, 200)\n : \"\";\n }\n sendEvent(name, metadata, undefinedVar, trueVar);\n };\n\n doc.addEventListener(\"click\", inlineEvent, falseVar);\n doc.addEventListener(\"submit\", inlineEvent, falseVar);\n\n // 404 confirmation adds a request, so existing installs must opt in.\n if (\n overwriteOptions.detect404 === trueVar ||\n attr(scriptElement, \"detect-404\") == trueText\n ) {\n var detect404 = function () {\n if (\n !/\\b404\\b/.test(doc.title + \" \" + (doc.body && doc.body.textContent))\n )\n return;\n try {\n var request = new window.XMLHttpRequest();\n request.open(\"HEAD\", loc.href, trueVar);\n request.onload = function () {\n if (request.status === 404)\n sendEvent(\"page_404\", {\n url: loc.protocol + \"//\" + definedHostname + loc.pathname,\n status: 404,\n });\n };\n request.send();\n } catch (error) {}\n };\n if (doc.readyState === \"loading\")\n doc.addEventListener(\"DOMContentLoaded\", detect404, falseVar);\n else detect404();\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_proxy_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","keepalive","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","imageUrl","key","fetch","mode","credentials","catch","src","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","protocol","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue","detect404","inlineEvent","element","target","parentNode","isForm","tagName","button","tag","toLowerCase","attributes","submitter","button_text","textContent","trim","title","request","XMLHttpRequest","open","href","status","url","send","readyState"],"mappings":"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"} \ No newline at end of file diff --git a/dist/v12/light.js b/dist/v12/light.js index 5ad37a9a..aca47cb2 100644 --- a/dist/v12/light.js +++ b/dist/v12/light.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-16; 12b3; SRI-version; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-15; 2d4f; SRI-version; v12) */ -!function(l,e,t,f){try{var u=undefined,n="https:",r=l.console,a="doNotTrack",m=l.navigator,p=l.location,g=p.host,i=l.document,o=m.userAgent,c="Not sending request ",h=!1,s=encodeURIComponent,d=decodeURIComponent,v=JSON.stringify,y=l.addEventListener,_="https://queue."+t,b=(i.documentElement,"language"),w=m.userAgentData,O="platform",S="platformVersion",j="https://docs.simpleanalytics.com",k=/(bot|spider|crawl)/i.test(o)&&!/(cubot)/i.test(o),E=i.currentScript||i.querySelector('script[src*="'+t+'"]');f=function(){var e=[].slice.call(arguments);return e.unshift("Simple Analytics:"),Function.prototype.apply.call(r.warn,r,e)};var q=function(e){return"string"==typeof e},x=function(e,t){return e&&e.getAttribute("data-"+t)},A=function(){for(var e,t,n,r={},a=arguments,i=0;i>e/4).toString(16)})}catch(r){return e.replace(n,function(e){var t=16*Math.random()|0;return(e<2?t:3&t|8).toString(16)})}},N=function(e){return"function"==typeof e},R="namespace",U=e[R]||x(E,R)||"sa",V=e.strictUtm||"true"==x(E,"strict-utm"),B=U+"_loaded";if(1==l[B])return f(c+"twice");l.sa_event_loaded=!0,l[B]=!0;var C,T=function(t,e,n){t=n?t:A(J,M,t),m.brave&&!n&&(t.brave=!0),m._duckduckgoloader_&&!n&&(t.duck=!0),(new Image).src=_+"/simple.gif?"+Object.keys(t).filter(function(e){return t[e]!=u}).map(function(e){return s(e)+"="+s(t[e])}).join("&")+"&time="+Date.now()},F=e.hostname||x(E,"hostname"),H=F||g,z={version:"cdn_light_12",hostname:H};e.mode||x(E,"mode");try{C=Intl.DateTimeFormat().resolvedOptions().timeZone}catch(X){f(X)}k&&(z.bot=!0);var J=A(z,{ua:o,https:p.protocol==n,timezone:C,page_id:I(),session_id:I()});if(J.sri=!0,w&&(J.mobile=w.mobile,J.brands=v(w.brands)),H!==g&&(J.hostname_original=g),a in m&&"1"==m[a])return f("Not sending request when "+a+" is enabled. See "+j+"/dnt");-1!=g.indexOf(".")&&!/^[0-9.:]+$/.test(g)||F||f("Set hostname on "+g+". See "+j+"/overwrite-domain-name");var L,M={},P=(e.referrer||x(E,"referrer")||i.referrer||"").replace(g,H).replace(/^https?:\/\/((m|l|w{2,3}([0-9]+)?)\.)?([^?#]+)(.*)$/,"$4").replace(/^([^/]+)$/,"$1")||u,Z=function(e,t){var n=A(z,{type:"append",original_id:t?e:J.page_id});if(t||!m.sendBeacon)T(n,0,!0);else try{m.sendBeacon.bind(m)(_+"/append",v(n))}catch(r){T(n,0,!0)}};y("pagehide",Z,!1);var G,K,Q=function(e){var t="";try{t=e||d(p.pathname)}catch(X){f(X)}return t},W=function(e,t,n,r,a,i){e&&Z(""+J.page_id,!0),J.page_id=I();var o,c=H+Q(),s=(o=t,(r||p.search).slice(1).split("&").filter(function(e){return!o&&new RegExp("^((utm_)"+(V?"":"?")+"(source|medium|content|term|campaign)"+(V?"":"|ref")+")=","i").test(e)}).join("&")||u);T({id:J.page_id,type:"pageview",referrer:!t||n?P:null,query:s}),P=c,0};!function(e,t,n,r){!r&&N(n)&&(r=n);var a,i;N(r);q(t)&&-1>e/4).toString(16)})}catch(r){return e.replace(n,function(e){var t=16*Math.random()|0;return(e<2?t:3&t|8).toString(16)})}},N=function(e){return"function"==typeof e},R="namespace",U=e[R]||x(E,R)||"sa",V=e.strictUtm||"true"==x(E,"strict-utm"),B=U+"_loaded";if(1==l[B])return f(c+"twice");l.sa_event_loaded=!0,l[B]=!0;var C,T=function(t,e,n,r){t=n?t:A(J,M,t),m.brave&&!n&&(t.brave=!0),m._duckduckgoloader_&&!n&&(t.duck=!0);var a=new Image,i=_+"/simple.gif?"+Object.keys(t).filter(function(e){return t[e]!=u}).map(function(e){return s(e)+"="+s(t[e])}).join("&")+"&time="+Date.now();a.src=i},F=e.hostname||x(E,"hostname"),H=F||g,z={version:"cdn_light_12",hostname:H};e.mode||x(E,"mode");try{C=Intl.DateTimeFormat().resolvedOptions().timeZone}catch(X){f(X)}k&&(z.bot=!0);var J=A(z,{ua:o,https:p.protocol==n,timezone:C,page_id:I(),session_id:I()});if(J.sri=!0,w&&(J.mobile=w.mobile,J.brands=v(w.brands)),H!==g&&(J.hostname_original=g),a in m&&"1"==m[a])return f("Not sending request when "+a+" is enabled. See "+j+"/dnt");-1!=g.indexOf(".")&&!/^[0-9.:]+$/.test(g)||F||f("Set hostname on "+g+". See "+j+"/overwrite-domain-name");var L,M={},P=(e.referrer||x(E,"referrer")||i.referrer||"").replace(g,H).replace(/^https?:\/\/((m|l|w{2,3}([0-9]+)?)\.)?([^?#]+)(.*)$/,"$4").replace(/^([^/]+)$/,"$1")||u,Z=function(e,t){var n=A(z,{type:"append",original_id:t?e:J.page_id});if(t||!m.sendBeacon)T(n,0,!0);else try{m.sendBeacon.bind(m)(_+"/append",v(n))}catch(r){T(n,0,!0)}};y("pagehide",Z,!1);var G,K,Q=function(e){var t="";try{t=e||d(p.pathname)}catch(X){f(X)}return t},W=function(e,t,n,r,a,i){e&&Z(""+J.page_id,!0),J.page_id=I();var o,c=H+Q(),s=(o=t,(r||p.search).slice(1).split("&").filter(function(e){return!o&&new RegExp("^((utm_)"+(V?"":"?")+"(source|medium|content|term|campaign)"+(V?"":"|ref")+")=","i").test(e)}).join("&")||u);T({id:J.page_id,type:"pageview",referrer:!t||n?P:null,query:s}),P=c,0};!function(e,t,n,r){!r&&N(n)&&(r=n);var a,i;N(r);q(t)&&-1> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n if (ignore) return falseVar;\n // eslint-disable-next-line no-redeclare\n var regex =\n \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \")=\";\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n return q || undefinedVar;\n };\n\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n\n\n\n\n\n\n\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n // eslint-disable-next-line no-redeclare\n var bot = isBotAgent;\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = trueVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n\n\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n sameSite = referrer\n ? referrer.split(slash)[0] == locationHostname\n : falseVar;\n\n\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n\n\n pageview();\n\n } catch (e) {\n warn(e);\n }\n})(\n window,\n {},\n \"simpleanalyticscdn.com\",\n \"queue.\",\n \"cdn_light_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","warn","undefinedVar","undefined","https","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","protocol","language","documentElement","uaData","userAgentData","platformText","platformVersionText","docsUrl","isBotAgent","test","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","isString","string","attr","attribute","getAttribute","assign","obj","prop","object","to","arg","index","length","nextSource","constructor","Object","nextKey","hasOwnProperty","settings","sa_settings","logSettings","keys","Date","now","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","replace","c","getRandomValues","Uint8Array","toString","error","r","Math","random","isFunction","func","namespaceText","namespace","strictUtm","loadedVariable","sa_event_loaded","timezone","sendData","data","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","Image","src","filter","key","map","join","overwrittenHostname","hostname","definedHostname","basePayload","version","mode","Intl","DateTimeFormat","resolvedOptions","timeZone","bot","ua","page_id","session_id","sri","mobile","brands","hostname_original","indexOf","lastSendPath","referrer","sendOnLeave","id","push","append","type","original_id","sendBeacon","bind","e","sameSite","userNavigated","getPath","overwrite","path","pathname","sendPageView","isPushState","deleteSourceInfo","search","metadata","ignoreSource","currentPage","query","split","keyValue","RegExp","pages","pathOverwrite","callbackRaw","querySearch","parts","shift","performaceEntryType","perf","performance","navigationText","getEntriesByType","triggerSendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","pageview"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"light.source.js","sources":["light.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n\n var collectMetricByString = function (metricAbbreviation) {\n // eslint-disable-next-line no-unreachable\n return true;\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n if (ignore) return falseVar;\n // eslint-disable-next-line no-redeclare\n var regex =\n \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \")=\";\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n return q || undefinedVar;\n };\n\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData, keepalive) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n var imageUrl =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n\n image.src = imageUrl;\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n\n\n\n\n\n\n\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n // eslint-disable-next-line no-redeclare\n var bot = isBotAgent;\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = trueVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n\n\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n sameSite = referrer\n ? referrer.split(slash)[0] == locationHostname\n : falseVar;\n\n\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n\n\n pageview();\n\n } catch (e) {\n warn(e);\n }\n})(\n window,\n {},\n \"simpleanalyticscdn.com\",\n \"queue.\",\n \"cdn_light_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","warn","undefinedVar","undefined","https","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","protocol","language","documentElement","uaData","userAgentData","platformText","platformVersionText","docsUrl","isBotAgent","test","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","isString","string","attr","attribute","getAttribute","assign","obj","prop","object","to","arg","index","length","nextSource","constructor","Object","nextKey","hasOwnProperty","settings","sa_settings","logSettings","keys","Date","now","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","replace","c","getRandomValues","Uint8Array","toString","error","r","Math","random","isFunction","func","namespaceText","namespace","strictUtm","loadedVariable","sa_event_loaded","timezone","sendData","data","callback","onlyThisData","keepalive","payload","page","brave","_duckduckgoloader_","duck","image","Image","imageUrl","filter","key","map","join","src","overwrittenHostname","hostname","definedHostname","basePayload","version","mode","Intl","DateTimeFormat","resolvedOptions","timeZone","bot","ua","page_id","session_id","sri","mobile","brands","hostname_original","indexOf","lastSendPath","referrer","sendOnLeave","id","push","append","type","original_id","sendBeacon","bind","e","sameSite","userNavigated","getPath","overwrite","path","pathname","sendPageView","isPushState","deleteSourceInfo","search","metadata","ignoreSource","currentPage","query","split","keyValue","RegExp","pages","pathOverwrite","callbackRaw","querySearch","parts","shift","performaceEntryType","perf","performance","navigationText","getEntriesByType","triggerSendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","pageview"],"mappings":"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"} \ No newline at end of file diff --git a/package.json b/package.json index 639b29a9..41f384b2 100644 --- a/package.json +++ b/package.json @@ -17,6 +17,7 @@ "deploy": "node --env-file-if-exists=.env deploy.mts", "pretest": "pnpm run build:testing", "test": "node -r dotenv/config ./test/index.js", + "test:unit": "mocha \"test/unit/*.test.js\" --exit", "test:matrix": "mocha test/helpers/get-browsers.test.js", "test:deploy": "node --test test/deploy.test.mts", "posttest": "pnpm run build", @@ -44,7 +45,8 @@ "dotenv": "^8.2.0", "eslint": "^6.7.2", "esprima": "^4.0.1", - "handlebars": "^4.7.6", + "handlebars": "^4.7.10", + "jsdom": "26.1.0", "mocha": "^6.2.3", "nodemon": "^1.19.4", "request": "^2.88.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index e88fece0..e24287ca 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -34,8 +34,11 @@ importers: specifier: ^4.0.1 version: 4.0.1 handlebars: - specifier: ^4.7.6 - version: 4.7.6 + specifier: ^4.7.10 + version: 4.7.10 + jsdom: + specifier: 26.1.0 + version: 26.1.0(supports-color@5.5.0) mocha: specifier: ^6.2.3 version: 6.2.3 @@ -60,6 +63,9 @@ importers: packages: + '@asamuzakjp/css-color@3.2.0': + resolution: {integrity: sha512-K1A6z8tS3XsmCMM86xoWdn7Fkdn9m6RSVtocUrJYIwZnFVkng/PvkEoWtOWmP+Scc6saYWHWZYbndEEXxl24jw==} + '@babel/code-frame@7.5.5': resolution: {integrity: sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw==} @@ -74,6 +80,34 @@ packages: resolution: {integrity: sha512-y7/yvZ2TPAnR9+jnc00klvNNLkJiXFFrQA/hlLCcxA9a2A4zQIOimyFQ9XfwYKiGD1fb5GY8vbKIIgO8d5Tb2A==} engines: {node: '>= 20.12.0'} + '@csstools/color-helpers@5.1.0': + resolution: {integrity: sha512-S11EXWJyy0Mz5SYvRmY8nJYTFFd1LCNV+7cXyAgQtOOuzb4EsgfqDufL+9esx72/eLhsRdGZwaldu/h+E4t4BA==} + engines: {node: '>=18'} + + '@csstools/css-calc@2.1.4': + resolution: {integrity: sha512-3N8oaj+0juUw/1H3YwmDDJXCgTB1gKU6Hc/bB502u9zR0q2vd786XJH9QfrKIEgFlZmhZiq6epXl4rHqhzsIgQ==} + engines: {node: '>=18'} + peerDependencies: + '@csstools/css-parser-algorithms': ^3.0.5 + '@csstools/css-tokenizer': ^3.0.4 + + '@csstools/css-color-parser@3.1.0': + resolution: {integrity: sha512-nbtKwh3a6xNVIp/VRuXV64yTKnb1IjTAEEh3irzS+HkKjAOYLTGNb9pmVNntZ8iVBHcWDA2Dof0QtPgFI1BaTA==} + engines: {node: '>=18'} + peerDependencies: + '@csstools/css-parser-algorithms': ^3.0.5 + '@csstools/css-tokenizer': ^3.0.4 + + '@csstools/css-parser-algorithms@3.0.5': + resolution: {integrity: sha512-DaDeUkXZKjdGhgYaHNJTV9pV7Y9B3b644jCLs9Upc3VeNGg6LWARAT6O+Q+/COo+2gg/bM5rhpMAtf70WqfBdQ==} + engines: {node: '>=18'} + peerDependencies: + '@csstools/css-tokenizer': ^3.0.4 + + '@csstools/css-tokenizer@3.0.4': + resolution: {integrity: sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==} + engines: {node: '>=18'} + '@types/keyv@3.1.4': resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==} @@ -225,6 +259,10 @@ packages: resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} engines: {node: '>= 6.0.0'} + agent-base@7.1.4: + resolution: {integrity: sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==} + engines: {node: '>= 14'} + ajv@6.10.2: resolution: {integrity: sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw==} @@ -456,10 +494,18 @@ packages: resolution: {integrity: sha512-GsVpkFPlycH7/fRR7Dhcmnoii54gV1nz7y4CWyeFS14N+JVBBhY+r8amRHE4BwSYal7BPTDp8isvAlCxyFt3Hg==} engines: {node: '>=4'} + cssstyle@4.6.0: + resolution: {integrity: sha512-2z+rWdzbbSZv6/rhtvzvqeZQHrBaqgogqt85sqFNbabZOuFbCVFb8kPeEtZjiKkbrm395irpNKiYeFeLiQnFPg==} + engines: {node: '>=18'} + dashdash@1.14.1: resolution: {integrity: sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==} engines: {node: '>=0.10'} + data-urls@5.0.0: + resolution: {integrity: sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==} + engines: {node: '>=18'} + debug@2.6.9: resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} peerDependencies: @@ -490,6 +536,9 @@ packages: resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} engines: {node: '>=0.10.0'} + decimal.js@10.6.0: + resolution: {integrity: sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==} + decode-uri-component@0.2.0: resolution: {integrity: sha512-hjf+xovcEn31w/EUYdTXQh/8smFL/dzYjohQGEIgjyNavaJfBY2p5F527Bo1VPATxv0VYTUC2bOcXvqFwk78Og==} engines: {node: '>=0.10'} @@ -556,6 +605,10 @@ packages: emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + entities@6.0.1: + resolution: {integrity: sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==} + engines: {node: '>=0.12'} + es-abstract@1.17.6: resolution: {integrity: sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw==} engines: {node: '>= 0.4'} @@ -779,8 +832,8 @@ packages: resolution: {integrity: sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==} engines: {node: '>=4.x'} - handlebars@4.7.6: - resolution: {integrity: sha512-1f2BACcBfiwAfStCKZNrUCgqNZkGsAT7UM3kkYtXuLo0KnaVfjKOyf7PRzB6++aK9STyT1Pd2ZCPe3EGOXleXA==} + handlebars@4.7.10: + resolution: {integrity: sha512-P5VJMVM7qgBn6vjXMw8WG9uVI+ncf2pi72j4de4yz5ZULLj2RGqLYaKOYGsgyrViQ0tePOVlN1tDCCXXtFqXKg==} engines: {node: '>=0.4.7'} hasBin: true @@ -825,6 +878,14 @@ packages: resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} hasBin: true + html-encoding-sniffer@4.0.0: + resolution: {integrity: sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==} + engines: {node: '>=18'} + + http-proxy-agent@7.0.2: + resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==} + engines: {node: '>= 14'} + http-signature@1.2.0: resolution: {integrity: sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==} engines: {node: '>=0.8', npm: '>=1.3.7'} @@ -833,10 +894,18 @@ packages: resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} engines: {node: '>= 6'} + https-proxy-agent@7.0.6: + resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==} + engines: {node: '>= 14'} + iconv-lite@0.4.24: resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} engines: {node: '>=0.10.0'} + iconv-lite@0.6.3: + resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} + engines: {node: '>=0.10.0'} + ignore-by-default@1.0.1: resolution: {integrity: sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==} @@ -977,6 +1046,9 @@ packages: resolution: {integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==} engines: {node: '>=0.10.0'} + is-potential-custom-element-name@1.0.1: + resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} + is-promise@2.1.0: resolution: {integrity: sha512-NECAi6wp6CgMesHuVUEK8JwjCvm/tvnn5pCbB42JOHp3mgUizN0nagXu4HEqQZBkieGEQ+jVcMKWqoVd6CDbLQ==} @@ -1037,6 +1109,15 @@ packages: jsbn@0.1.1: resolution: {integrity: sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==} + jsdom@26.1.0: + resolution: {integrity: sha512-Cvc9WUhxSMEo4McES3P7oK3QaXldCfNWp7pl2NNeiIFlCoLr3kfq9kb1fxftiwk1FLV7CvpvDfonxtzUDeSOPg==} + engines: {node: '>=18'} + peerDependencies: + canvas: ^3.0.0 + peerDependenciesMeta: + canvas: + optional: true + json-schema-traverse@0.4.1: resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} @@ -1098,6 +1179,9 @@ packages: resolution: {integrity: sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==} engines: {node: '>=0.10.0'} + lru-cache@10.4.3: + resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} + lru-cache@4.1.5: resolution: {integrity: sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==} @@ -1138,6 +1222,9 @@ packages: minimist@1.2.5: resolution: {integrity: sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==} + minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + mixin-deep@1.3.2: resolution: {integrity: sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==} engines: {node: '>=0.10.0'} @@ -1178,8 +1265,8 @@ packages: natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} - neo-async@2.6.1: - resolution: {integrity: sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==} + neo-async@2.6.2: + resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} nice-try@1.0.5: resolution: {integrity: sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==} @@ -1208,6 +1295,9 @@ packages: resolution: {integrity: sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==} engines: {node: '>=4'} + nwsapi@2.2.28: + resolution: {integrity: sha512-IlVB7OS7qrOsVYlpnFIkETjMwT9jwvmocJmmM+GZU/PAB3uGi9Ezd7vcWhWBUnSc0ya4ppmQITOyP1ez9gg8cg==} + oauth-sign@0.9.0: resolution: {integrity: sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==} @@ -1280,6 +1370,9 @@ packages: resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} engines: {node: '>=6'} + parse5@7.3.0: + resolution: {integrity: sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==} + pascalcase@0.1.1: resolution: {integrity: sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw==} engines: {node: '>=0.10.0'} @@ -1355,6 +1448,10 @@ packages: resolution: {integrity: sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==} engines: {node: '>=6'} + punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + qs@6.5.2: resolution: {integrity: sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==} engines: {node: '>=0.6'} @@ -1439,6 +1536,9 @@ packages: deprecated: Rimraf versions prior to v4 are no longer supported hasBin: true + rrweb-cssom@0.8.0: + resolution: {integrity: sha512-guoltQEx+9aMf2gDZ0s62EcV8lsXR+0w8915TC3ITdn2YueuNjdAYh/levpU9nFaoChh9RUS5ZdQMrKfVEN9tw==} + run-async@2.3.0: resolution: {integrity: sha512-Fx+QT3fGtS0jk8OvKyKgAB2YHPsrmqBRcMeTC5AZ+lp4vzXKPPrFSY3iLdgvjA3HVBkIvJeM6J80LRjx8bQwhA==} engines: {node: '>=0.12.0'} @@ -1456,6 +1556,10 @@ packages: safer-buffer@2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + saxes@6.0.0: + resolution: {integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==} + engines: {node: '>=v12.22.7'} + selenium-webdriver@4.3.1: resolution: {integrity: sha512-TjH/ls1WKRQoFEHcqtn6UtwcLnA3yvx08v9cSSFYvyhp8hJWRtbe9ae2I8uXPisEZ2EaGKKoxBZ4EHv0BJM15g==} engines: {node: '>= 10.15.0'} @@ -1603,6 +1707,9 @@ packages: resolution: {integrity: sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg==} engines: {node: '>=6'} + symbol-tree@3.2.4: + resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} + table@5.4.6: resolution: {integrity: sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==} engines: {node: '>=6.0.0'} @@ -1625,6 +1732,13 @@ packages: resolution: {integrity: sha512-G7r3AhovYtr5YKOWQkta8RKAPb+J9IsO4uVmzjl8AZwfhs8UcUwTiD6gcJYSgOtzyjvQKrKYn41syHbUWMkafA==} engines: {node: '>=0.10.0'} + tldts-core@6.1.86: + resolution: {integrity: sha512-Je6p7pkk+KMzMv2XXKmAE3McmolOQFdxkKw0R8EYNr7sELW46JqnNeTX8ybPiQgvg1ymCoF8LXs5fzFaZvJPTA==} + + tldts@6.1.86: + resolution: {integrity: sha512-WMi/OQ2axVTf/ykqCQgXiIct+mSQDFdH2fkwhPwgEwvJ1kSzZRiinb0zF2Xb8u4+OqPChmyI6MEu4EezNJz+FQ==} + hasBin: true + tmp@0.0.33: resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} engines: {node: '>=0.6.0'} @@ -1653,6 +1767,14 @@ packages: resolution: {integrity: sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==} engines: {node: '>=0.8'} + tough-cookie@5.1.2: + resolution: {integrity: sha512-FVDYdxtnj0G6Qm/DhNPSb8Ju59ULcup3tuJxkFb5K8Bv2pUXILbf0xZWU8PX8Ov19OXljbUyveOFwRMwkXzO+A==} + engines: {node: '>=16'} + + tr46@5.1.1: + resolution: {integrity: sha512-hdF5ZgjTqgAntKkklYw0R03MG2x/bSzTtkxmIRw/sTNV8YXsCJ1tfLAX23lhxhHJlEf3CRCOCGGWw3vI3GaSPw==} + engines: {node: '>=18'} + tslib@1.10.0: resolution: {integrity: sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==} @@ -1747,6 +1869,27 @@ packages: resolution: {integrity: sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==} engines: {'0': node >=0.6.0} + w3c-xmlserializer@5.0.0: + resolution: {integrity: sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==} + engines: {node: '>=18'} + + webidl-conversions@7.0.0: + resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==} + engines: {node: '>=12'} + + whatwg-encoding@3.1.1: + resolution: {integrity: sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==} + engines: {node: '>=18'} + deprecated: Use @exodus/bytes instead for a more spec-conformant and faster implementation + + whatwg-mimetype@4.0.0: + resolution: {integrity: sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==} + engines: {node: '>=18'} + + whatwg-url@14.2.0: + resolution: {integrity: sha512-De72GdQZzNTUBBChsXueQUnPKDkg/5A5zp7pFDuQAj5UFoENpiACU0wlCvzpAGnTkj++ihpKwKyYewn/XNUbKw==} + engines: {node: '>=18'} + which-module@2.0.0: resolution: {integrity: sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q==} @@ -1782,6 +1925,18 @@ packages: resolution: {integrity: sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==} engines: {node: '>=4'} + ws@8.22.0: + resolution: {integrity: sha512-Ydggc987+RO0AnWtZ/7Wq9FtNvcrL1b/RO0ud9mWjUPgDrsAAwQSF51sm2hm1XofbU/4jkpGEsLFsZZxU+1DOg==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + ws@8.8.1: resolution: {integrity: sha512-bGy2JzvzkPowEJV++hF07hAD6niYSr0JzBNo/J29WsB57A2r7Wlc1UFcTR9IzrPvuNVO4B8LGqF8qcpsVOhJCA==} engines: {node: '>=10.0.0'} @@ -1798,6 +1953,13 @@ packages: resolution: {integrity: sha512-1Dly4xqlulvPD3fZUQJLY+FUIeqN3N2MM3uqe4rCJftAvOjFa3jFGfctOgluGx4ahPbUCsZkmJILiP0Vi4T6lQ==} engines: {node: '>=4'} + xml-name-validator@5.0.0: + resolution: {integrity: sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==} + engines: {node: '>=18'} + + xmlchars@2.2.0: + resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} + y18n@4.0.0: resolution: {integrity: sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==} @@ -1816,6 +1978,14 @@ packages: snapshots: + '@asamuzakjp/css-color@3.2.0': + dependencies: + '@csstools/css-calc': 2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) + '@csstools/css-color-parser': 3.1.0(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) + '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) + '@csstools/css-tokenizer': 3.0.4 + lru-cache: 10.4.3 + '@babel/code-frame@7.5.5': dependencies: '@babel/highlight': 7.5.0 @@ -1838,6 +2008,26 @@ snapshots: fast-wrap-ansi: 0.2.2 sisteransi: 1.0.5 + '@csstools/color-helpers@5.1.0': {} + + '@csstools/css-calc@2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4)': + dependencies: + '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) + '@csstools/css-tokenizer': 3.0.4 + + '@csstools/css-color-parser@3.1.0(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4)': + dependencies: + '@csstools/color-helpers': 5.1.0 + '@csstools/css-calc': 2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) + '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) + '@csstools/css-tokenizer': 3.0.4 + + '@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4)': + dependencies: + '@csstools/css-tokenizer': 3.0.4 + + '@csstools/css-tokenizer@3.0.4': {} + '@types/keyv@3.1.4': dependencies: '@types/node': 24.13.3 @@ -1926,6 +2116,8 @@ snapshots: transitivePeerDependencies: - supports-color + agent-base@7.1.4: {} + ajv@6.10.2: dependencies: fast-deep-equal: 2.0.1 @@ -2195,10 +2387,20 @@ snapshots: crypto-random-string@1.0.0: {} + cssstyle@4.6.0: + dependencies: + '@asamuzakjp/css-color': 3.2.0 + rrweb-cssom: 0.8.0 + dashdash@1.14.1: dependencies: assert-plus: 1.0.0 + data-urls@5.0.0: + dependencies: + whatwg-mimetype: 4.0.0 + whatwg-url: 14.2.0 + debug@2.6.9(supports-color@5.5.0): dependencies: ms: 2.0.0 @@ -2225,6 +2427,8 @@ snapshots: decamelize@1.2.0: {} + decimal.js@10.6.0: {} + decode-uri-component@0.2.0: {} deep-eql@3.0.1: @@ -2279,6 +2483,8 @@ snapshots: emoji-regex@8.0.0: {} + entities@6.0.1: {} + es-abstract@1.17.6: dependencies: es-to-primitive: 1.2.1 @@ -2583,10 +2789,10 @@ snapshots: growl@1.10.5: {} - handlebars@4.7.6: + handlebars@4.7.10: dependencies: - minimist: 1.2.5 - neo-async: 2.6.1 + minimist: 1.2.8 + neo-async: 2.6.2 source-map: 0.6.1 wordwrap: 1.0.0 optionalDependencies: @@ -2628,6 +2834,17 @@ snapshots: he@1.2.0: {} + html-encoding-sniffer@4.0.0: + dependencies: + whatwg-encoding: 3.1.1 + + http-proxy-agent@7.0.2(supports-color@5.5.0): + dependencies: + agent-base: 7.1.4 + debug: 4.3.4(supports-color@5.5.0) + transitivePeerDependencies: + - supports-color + http-signature@1.2.0: dependencies: assert-plus: 1.0.0 @@ -2641,10 +2858,21 @@ snapshots: transitivePeerDependencies: - supports-color + https-proxy-agent@7.0.6(supports-color@5.5.0): + dependencies: + agent-base: 7.1.4 + debug: 4.3.4(supports-color@5.5.0) + transitivePeerDependencies: + - supports-color + iconv-lite@0.4.24: dependencies: safer-buffer: 2.1.2 + iconv-lite@0.6.3: + dependencies: + safer-buffer: 2.1.2 + ignore-by-default@1.0.1: {} ignore@4.0.6: {} @@ -2770,6 +2998,8 @@ snapshots: dependencies: isobject: 3.0.1 + is-potential-custom-element-name@1.0.1: {} + is-promise@2.1.0: {} is-redirect@1.0.0: {} @@ -2813,6 +3043,33 @@ snapshots: jsbn@0.1.1: {} + jsdom@26.1.0(supports-color@5.5.0): + dependencies: + cssstyle: 4.6.0 + data-urls: 5.0.0 + decimal.js: 10.6.0 + html-encoding-sniffer: 4.0.0 + http-proxy-agent: 7.0.2(supports-color@5.5.0) + https-proxy-agent: 7.0.6(supports-color@5.5.0) + is-potential-custom-element-name: 1.0.1 + nwsapi: 2.2.28 + parse5: 7.3.0 + rrweb-cssom: 0.8.0 + saxes: 6.0.0 + symbol-tree: 3.2.4 + tough-cookie: 5.1.2 + w3c-xmlserializer: 5.0.0 + webidl-conversions: 7.0.0 + whatwg-encoding: 3.1.1 + whatwg-mimetype: 4.0.0 + whatwg-url: 14.2.0 + ws: 8.22.0 + xml-name-validator: 5.0.0 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + json-schema-traverse@0.4.1: {} json-schema@0.2.3: {} @@ -2873,6 +3130,8 @@ snapshots: lowercase-keys@1.0.1: {} + lru-cache@10.4.3: {} + lru-cache@4.1.5: dependencies: pseudomap: 1.0.2 @@ -2922,6 +3181,8 @@ snapshots: minimist@1.2.5: {} + minimist@1.2.8: {} + mixin-deep@1.3.2: dependencies: for-in: 1.0.2 @@ -2990,7 +3251,7 @@ snapshots: natural-compare@1.4.0: {} - neo-async@2.6.1: {} + neo-async@2.6.2: {} nice-try@1.0.5: {} @@ -3026,6 +3287,8 @@ snapshots: dependencies: path-key: 2.0.1 + nwsapi@2.2.28: {} + oauth-sign@0.9.0: {} object-copy@0.1.0: @@ -3102,6 +3365,10 @@ snapshots: dependencies: callsites: 3.1.0 + parse5@7.3.0: + dependencies: + entities: 6.0.1 + pascalcase@0.1.1: {} path-dirname@1.0.2: {} @@ -3148,6 +3415,8 @@ snapshots: punycode@2.1.1: {} + punycode@2.3.1: {} + qs@6.5.2: {} rc@1.2.8: @@ -3247,6 +3516,8 @@ snapshots: dependencies: glob: 7.1.6 + rrweb-cssom@0.8.0: {} + run-async@2.3.0: dependencies: is-promise: 2.1.0 @@ -3263,6 +3534,10 @@ snapshots: safer-buffer@2.1.2: {} + saxes@6.0.0: + dependencies: + xmlchars: 2.2.0 + selenium-webdriver@4.3.1: dependencies: jszip: 3.10.0 @@ -3432,6 +3707,8 @@ snapshots: dependencies: has-flag: 3.0.0 + symbol-tree@3.2.4: {} + table@5.4.6: dependencies: ajv: 6.10.2 @@ -3453,6 +3730,12 @@ snapshots: timed-out@4.0.1: {} + tldts-core@6.1.86: {} + + tldts@6.1.86: + dependencies: + tldts-core: 6.1.86 + tmp@0.0.33: dependencies: os-tmpdir: 1.0.2 @@ -3486,6 +3769,14 @@ snapshots: psl: 1.7.0 punycode: 1.4.1 + tough-cookie@5.1.2: + dependencies: + tldts: 6.1.86 + + tr46@5.1.1: + dependencies: + punycode: 2.3.1 + tslib@1.10.0: {} tunnel-agent@0.6.0: @@ -3596,6 +3887,23 @@ snapshots: core-util-is: 1.0.2 extsprintf: 1.3.0 + w3c-xmlserializer@5.0.0: + dependencies: + xml-name-validator: 5.0.0 + + webidl-conversions@7.0.0: {} + + whatwg-encoding@3.1.1: + dependencies: + iconv-lite: 0.6.3 + + whatwg-mimetype@4.0.0: {} + + whatwg-url@14.2.0: + dependencies: + tr46: 5.1.1 + webidl-conversions: 7.0.0 + which-module@2.0.0: {} which@1.3.1: @@ -3632,10 +3940,16 @@ snapshots: dependencies: mkdirp: 0.5.5 + ws@8.22.0: {} + ws@8.8.1: {} xdg-basedir@3.0.0: {} + xml-name-validator@5.0.0: {} + + xmlchars@2.2.0: {} + y18n@4.0.0: {} yallist@2.1.2: {} diff --git a/src/default.js b/src/default.js index d8dd4c98..a22de199 100644 --- a/src/default.js +++ b/src/default.js @@ -333,7 +333,7 @@ // // Send data via image - var sendData = function (data, callback, onlyThisData) { + var sendData = function (data, callback, onlyThisData, keepalive) { data = onlyThisData ? data : assign(payload, page, data); if (nav.brave && !onlyThisData) data.brave = trueVar; @@ -350,7 +350,7 @@ image.onload = callback; } /** endif **/ - image.src = + var imageUrl = fullApiUrl + "/simple.gif?" + Object.keys(data) @@ -367,6 +367,25 @@ .join("&") + "&time=" + Date.now(); + + /** if events **/ + // Inline events must survive navigation without taking over links or forms. + if (keepalive && window.fetch) { + try { + window + .fetch(imageUrl, { + keepalive: trueVar, + mode: "no-cors", + credentials: "omit", + }) + .catch(function () { + image.src = imageUrl; + }); + return; + } catch (error) {} + } + /** endif **/ + image.src = imageUrl; }; // Customers can overwrite their hostname, here we check for that @@ -1035,7 +1054,7 @@ var validTypes = ["string", "number"]; - var sendEvent = function (event, metadata, callbackRaw) { + var sendEvent = function (event, metadata, callbackRaw, keepalive) { if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata; var eventIsFunction = isFunction(event); @@ -1087,7 +1106,9 @@ metadata: stringify(metadata), /** endif **/ }), - callback + callback, + undefinedVar, + keepalive ); } }; @@ -1116,6 +1137,71 @@ : sendEvent(queue[event]); } } + + var inlineEvent = function (event) { + var element = event.target; + while ( + element && + element !== doc && + (!element.getAttribute || attr(element, "simple-event") === null) + ) + element = element.parentNode; + + if (!element || element === doc) return; + var isForm = element.tagName === "FORM"; + var name = attr(element, "simple-event"); + if (!name || isForm !== (event.type === "submit")) return; + + var metadata = { tag: element.tagName.toLowerCase() }; + var attributes = element.attributes; + for (var i = 0; i < attributes.length; i++) { + var attribute = attributes[i]; + if (attribute.name.indexOf("data-simple-event-") === 0) + metadata[attribute.name.slice(18).replace(/-/g, "_")] = + attribute.value; + } + if (isForm) { + var button = event.submitter; + metadata.button_text = button + ? (button.textContent || button.value || "") + .replace(/\s+/g, " ") + .trim() + .slice(0, 200) + : ""; + } + sendEvent(name, metadata, undefinedVar, trueVar); + }; + + doc.addEventListener("click", inlineEvent, falseVar); + doc.addEventListener("submit", inlineEvent, falseVar); + + // 404 confirmation adds a request, so existing installs must opt in. + if ( + overwriteOptions.detect404 === trueVar || + attr(scriptElement, "detect-404") == trueText + ) { + var detect404 = function () { + if ( + !/\b404\b/.test(doc.title + " " + (doc.body && doc.body.textContent)) + ) + return; + try { + var request = new window.XMLHttpRequest(); + request.open("HEAD", loc.href, trueVar); + request.onload = function () { + if (request.status === 404) + sendEvent("page_404", { + url: loc.protocol + "//" + definedHostname + loc.pathname, + status: 404, + }); + }; + request.send(); + } catch (error) {} + }; + if (doc.readyState === "loading") + doc.addEventListener("DOMContentLoaded", detect404, falseVar); + else detect404(); + } /** endif **/ } catch (e) { /** if errorhandling **/ diff --git a/test/unit/inline-events.test.js b/test/unit/inline-events.test.js new file mode 100644 index 00000000..dbf5923e --- /dev/null +++ b/test/unit/inline-events.test.js @@ -0,0 +1,316 @@ +const { expect } = require("chai"); +const { runInContext } = require("vm"); +const { createDOM } = require("./helpers/dom"); + +describe("inline events", function () { + const windows = []; + const setup = (options = {}) => { + const dom = createDOM({ settings: { autoCollect: false }, ...options }); + windows.push(dom.window); + return dom; + }; + const events = (dom) => + dom.sent + .filter( + (request) => new URL(request.url).searchParams.get("type") === "event" + ) + .map((request) => { + const params = new URL(request.url).searchParams; + return { + name: params.get("event"), + metadata: JSON.parse(params.get("metadata")), + }; + }); + const click = (dom, element, options = {}) => { + const event = new dom.window.MouseEvent("click", { + bubbles: true, + cancelable: true, + ...options, + }); + element.dispatchEvent(event); + return event; + }; + const submit = (dom, form, button) => { + const event = new dom.window.SubmitEvent("submit", { + bubbles: true, + cancelable: true, + submitter: button, + }); + form.dispatchEvent(event); + return event; + }; + + afterEach(() => windows.splice(0).forEach((window) => window.close())); + + it("tracks nested clicks and new elements with current metadata", function () { + const dom = setup(); + dom.window.document.body.innerHTML = + ''; + const button = dom.window.document.querySelector("button"); + click(dom, button.firstChild); + button.setAttribute("data-simple-event", "upgrade"); + button.setAttribute("data-simple-event-plan-name", "enterprise"); + click(dom, button); + expect(events(dom)).to.deep.equal([ + { name: "choose", metadata: { tag: "button", plan_name: "pro" } }, + { name: "upgrade", metadata: { tag: "button", plan_name: "enterprise" } }, + ]); + }); + + it("leaves link behavior and modified clicks untouched", function () { + const dom = setup(); + dom.window.document.body.innerHTML = + 'Download'; + const link = dom.window.document.querySelector("a"); + const event = click(dom, link, { ctrlKey: true }); + expect(event.defaultPrevented).to.equal(false); + expect(link.getAttribute("target")).to.equal("_blank"); + expect(link.hasAttribute("download")).to.equal(true); + expect(link.hasAttribute("onclick")).to.equal(false); + expect(events(dom)).to.have.length(1); + }); + + it("tracks SPA clicks without undoing cancellation, and ignores untagged elements", function () { + const dom = setup(); + dom.window.document.body.innerHTML = + ''; + const buttons = dom.window.document.querySelectorAll("button"); + buttons[0].addEventListener("click", (event) => event.preventDefault()); + expect(click(dom, buttons[0]).defaultPrevented).to.equal(true); + click(dom, buttons[1]); + expect(events(dom)).to.have.length(1); + expect(events(dom)[0].name).to.equal("cancelled"); + }); + + it("uses the actual submitter and lets the browser submit the form", function () { + const dom = setup(); + dom.window.document.body.innerHTML = + '
'; + const form = dom.window.document.querySelector("form"); + const button = dom.window.document.querySelector("button"); + click(dom, form.querySelector("input")); + const event = submit(dom, form, button); + expect(event.defaultPrevented).to.equal(false); + expect(button.getAttribute("formaction")).to.equal("/other"); + expect(events(dom)).to.deep.equal([ + { name: "signup", metadata: { tag: "form", button_text: "Join" } }, + ]); + }); + + it("tracks SPA form submissions without submitting the form itself", function () { + const dom = setup(); + dom.window.document.body.innerHTML = + '
'; + const form = dom.window.document.querySelector("form"); + form.addEventListener("submit", (event) => event.preventDefault()); + let submits = 0; + form.submit = () => submits++; + expect(submit(dom, form, form.firstChild).defaultPrevented).to.equal(true); + expect(events(dom)).to.have.length(1); + expect(submits).to.equal(0); + }); + + it("does not disable built-in events when the beta helper is installed", function () { + const dom = setup({ + beforeRun(context) { + context.document.head.innerHTML = + ''; + }, + }); + dom.window.document.body.innerHTML = + ''; + click(dom, dom.window.document.querySelector("button")); + expect(events(dom)).to.have.length(1); + }); + + it("uses the button label, trims it, and limits its length", function () { + const dom = setup(); + dom.window.document.body.innerHTML = + '
'; + const form = dom.window.document.querySelector("form"); + const button = form.firstChild; + submit(dom, form, button); + expect(events(dom)[0].metadata.button_text).to.equal("Save changes"); + button.textContent = "x".repeat(5000); + submit(dom, form, button); + expect(events(dom)[1].metadata.button_text).to.equal("x".repeat(200)); + }); + + it("keeps submit labels stable when button markup is reformatted", function () { + const dom = setup(); + dom.window.document.body.innerHTML = + '
'; + const form = dom.window.document.querySelector("form"); + const button = form.firstChild; + submit(dom, form, button); + button.innerHTML = + "\n \n Save\n changes\n"; + submit(dom, form, button); + expect( + events(dom).map((event) => event.metadata.button_text) + ).to.deep.equal(["Save changes", "Save changes"]); + }); + + it("uses submit input labels and leaves missing submitter text empty", function () { + const dom = setup(); + dom.window.document.body.innerHTML = + '
'; + const form = dom.window.document.querySelector("form"); + submit(dom, form, form.lastChild); + expect(events(dom)[0].metadata.button_text).to.equal("Join"); + form.firstChild.focus(); + submit(dom, form); + expect(events(dom)[1].metadata.button_text).to.equal(""); + }); + + it("uses a keepalive GET for inline events", function () { + const requests = []; + const dom = setup(); + dom.window.fetch = (url, options) => { + requests.push({ url, options }); + return Promise.resolve(); + }; + dom.window.document.body.innerHTML = + ''; + click(dom, dom.window.document.querySelector("button")); + expect(requests).to.have.length(1); + expect(new URL(requests[0].url).searchParams.get("event")).to.equal( + "choose" + ); + expect(requests[0].options).to.include({ + keepalive: true, + mode: "no-cors", + credentials: "omit", + }); + expect(requests[0].options.method).to.equal(undefined); + expect(events(dom)).to.have.length(0); + }); + + it("falls back to the image when fetch fails", async function () { + const dom = setup(); + dom.window.fetch = () => Promise.reject(new Error("blocked")); + dom.window.document.body.innerHTML = + ''; + click(dom, dom.window.document.querySelector("button")); + await Promise.resolve(); + expect(events(dom)).to.have.length(1); + }); + + it("falls back when fetch throws synchronously", function () { + const dom = setup(); + dom.window.fetch = () => { + throw new Error("unsupported"); + }; + dom.window.document.body.innerHTML = + ''; + click(dom, dom.window.document.querySelector("button")); + expect(events(dom)).to.have.length(1); + }); + + it("uses the tracker namespace and global metadata", function () { + const dom = setup({ + settings: { autoCollect: false, namespace: "other" }, + beforeRun(context) { + runInContext('window.other_metadata = { source: "global" };', context); + }, + }); + dom.window.document.body.innerHTML = + ''; + click(dom, dom.window.document.querySelector("button")); + expect(events(dom)[0].metadata).to.include({ + source: "global", + tag: "button", + }); + }); + + it("only confirms 404s when opted in, and strips query strings and fragments", function () { + const requests = []; + const options = { + url: "https://example.test/missing?secret=private#fragment", + beforeRun(context) { + context.document.body.innerHTML = "Page 404 not found"; + context.XMLHttpRequest = function () { + this.open = (method, url) => requests.push({ method, url }); + this.send = () => { + this.status = 404; + this.onload(); + }; + }; + }, + }; + const off = setup(options); + off.window.document.dispatchEvent(new off.window.Event("DOMContentLoaded")); + expect(requests).to.have.length(0); + const on = setup({ + ...options, + settings: { autoCollect: false, detect404: true }, + }); + on.window.document.dispatchEvent(new on.window.Event("DOMContentLoaded")); + expect(requests).to.have.length(1); + expect(requests[0].method).to.equal("HEAD"); + expect(events(on)).to.deep.equal([ + { + name: "page_404", + metadata: { url: "https://example.test/missing", status: 404 }, + }, + ]); + }); + + it("supports the 404 script attribute after DOMContentLoaded", function () { + const dom = setup({ + beforeRun(context) { + context.document.head.innerHTML = + ''; + context.document.body.innerHTML = "Page 404 not found"; + Object.defineProperty(context.document, "readyState", { + value: "complete", + }); + context.XMLHttpRequest = function () { + this.open = () => {}; + this.send = () => { + this.status = 404; + this.onload(); + }; + }; + }, + }); + expect(events(dom)).to.have.length(1); + expect(events(dom)[0].name).to.equal("page_404"); + }); + + it("does not report a successful HEAD response as a 404", function () { + const dom = setup({ + settings: { autoCollect: false, detect404: true }, + beforeRun(context) { + context.document.body.innerHTML = "An article about 404 errors"; + context.XMLHttpRequest = function () { + this.open = () => {}; + this.send = () => { + this.status = 200; + this.onload(); + }; + }; + }, + }); + dom.window.document.dispatchEvent(new dom.window.Event("DOMContentLoaded")); + expect(events(dom)).to.have.length(0); + }); + + it("does not issue HEAD requests for 404 in HTML attributes", function () { + let requests = 0; + const dom = setup({ + settings: { autoCollect: false, detect404: true }, + beforeRun(context) { + context.document.head.innerHTML = + ''; + context.document.body.innerHTML = + '
A normal page
'; + context.XMLHttpRequest = function () { + requests++; + }; + }, + }); + dom.window.document.dispatchEvent(new dom.window.Event("DOMContentLoaded")); + expect(requests).to.equal(0); + }); +}); From ee45d523443a51f13697cd17551d6207bd9a0612 Mon Sep 17 00:00:00 2001 From: "simple-analytics-ai[bot]" <313929673+simple-analytics-ai[bot]@users.noreply.github.com> Date: Thu, 15 Oct 2026 16:32:36 +0200 Subject: [PATCH 54/62] Preserve distinct manual pageviews in v12 (#108) * Preserve distinct manual pageviews in v12 Requested in the compatibility review: fix query-only manual pageview loss and preserve full path-overwriter input. Keep the filtered outgoing path and review campaign attribution separately. Refs #107 * Preserve ignore-pages and hash routes for manual query paths Address automated review of item 1: normalize the manual query after the path-overwriter callback and before ignore-pages/hash handling, while keeping its query in the duplicate key. Refs #107 * Keep non-string manual paths compatible during query normalization Address review of item 1: only split string path values, preserving numeric manual paths and numeric path-overwriter results without introducing an exception into the customer page. Refs #107 * Preserve pathname-only input for path overwriters Requested during review: keep the existing path-overwriter behavior without query strings, while retaining distinct manual-query pageviews. Restore query splitting before getPath and update the callback and duplicate checks. --------- Co-authored-by: Simple Analytics Codex --- dist/latest/cloudflare.js | 101 +++---------------------------- dist/latest/custom/app.js | 4 +- dist/latest/custom/app.js.map | 2 +- dist/latest/custom/e.js | 4 +- dist/latest/custom/e.js.map | 2 +- dist/latest/custom/latest.dev.js | 101 +++---------------------------- dist/latest/custom/latest.js | 4 +- dist/latest/custom/latest.js.map | 2 +- dist/latest/custom/light.js | 4 +- dist/latest/custom/light.js.map | 2 +- dist/latest/custom/proxy.js | 4 +- dist/latest/custom/proxy.js.map | 2 +- dist/latest/hello.js | 4 +- dist/latest/hello.js.map | 2 +- dist/latest/latest.dev.js | 101 +++---------------------------- dist/latest/latest.js | 4 +- dist/latest/latest.js.map | 2 +- dist/latest/light.js | 4 +- dist/latest/light.js.map | 2 +- dist/v12/app.js | 4 +- dist/v12/app.js.map | 2 +- dist/v12/custom/app.js | 4 +- dist/v12/custom/app.js.map | 2 +- dist/v12/custom/light.js | 4 +- dist/v12/custom/light.js.map | 2 +- dist/v12/custom/proxy.js | 4 +- dist/v12/custom/proxy.js.map | 2 +- dist/v12/light.js | 4 +- dist/v12/light.js.map | 2 +- src/default.js | 7 ++- test/unit/pageview-query.test.js | 69 +++++++++++++++++++++ 31 files changed, 139 insertions(+), 318 deletions(-) diff --git a/dist/latest/cloudflare.js b/dist/latest/cloudflare.js index e6b4bf20..395a0b0f 100644 --- a/dist/latest/cloudflare.js +++ b/dist/latest/cloudflare.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-15; 6cf3; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-15; 6182; v12) */ /* eslint-env browser */ (function ( @@ -298,7 +298,7 @@ // // Send data via image - var sendData = function (data, callback, onlyThisData, keepalive) { + var sendData = function (data, callback, onlyThisData) { data = onlyThisData ? data : assign(payload, page, data); if (nav.brave && !onlyThisData) data.brave = trueVar; @@ -310,7 +310,7 @@ image.onerror = callback; image.onload = callback; } - var imageUrl = + image.src = fullApiUrl + "/simple.gif?" + Object.keys(data) @@ -327,23 +327,6 @@ .join("&") + "&time=" + Date.now(); - - // Inline events must survive navigation without taking over links or forms. - if (keepalive && window.fetch) { - try { - window - .fetch(imageUrl, { - keepalive: trueVar, - mode: "no-cors", - credentials: "omit", - }) - .catch(function () { - image.src = imageUrl; - }); - return; - } catch (error) {} - } - image.src = imageUrl; }; // Customers can overwrite their hostname, here we check for that @@ -731,7 +714,7 @@ ) { if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata; var callback = isFunction(callbackRaw) ? callbackRaw : function () {}; - var querySearch; + var querySearch = ""; if (isString(pathOverwrite) && pathOverwrite.indexOf("?") > -1) { // keep query from manual path var parts = pathOverwrite.split("?"); @@ -742,9 +725,10 @@ var path = getPath(pathOverwrite); // Don't send the last path again (this could happen when pushState is used to change the path hash or search) - if (!path || lastSendPath == path) return; + var pathKey = path + querySearch; + if (!path || lastSendPath == pathKey) return; - lastSendPath = path; + lastSendPath = pathKey; page.path = path; // v = viewportsizes @@ -922,7 +906,7 @@ var validTypes = ["string", "number"]; - var sendEvent = function (event, metadata, callbackRaw, keepalive) { + var sendEvent = function (event, metadata, callbackRaw) { if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata; var eventIsFunction = isFunction(event); @@ -970,9 +954,7 @@ metadata: stringify(metadata), }), - callback, - undefinedVar, - keepalive + callback ); } }; @@ -1001,71 +983,6 @@ : sendEvent(queue[event]); } } - - var inlineEvent = function (event) { - var element = event.target; - while ( - element && - element !== doc && - (!element.getAttribute || attr(element, "simple-event") === null) - ) - element = element.parentNode; - - if (!element || element === doc) return; - var isForm = element.tagName === "FORM"; - var name = attr(element, "simple-event"); - if (!name || isForm !== (event.type === "submit")) return; - - var metadata = { tag: element.tagName.toLowerCase() }; - var attributes = element.attributes; - for (var i = 0; i < attributes.length; i++) { - var attribute = attributes[i]; - if (attribute.name.indexOf("data-simple-event-") === 0) - metadata[attribute.name.slice(18).replace(/-/g, "_")] = - attribute.value; - } - if (isForm) { - var button = event.submitter; - metadata.button_text = button - ? (button.textContent || button.value || "") - .replace(/\s+/g, " ") - .trim() - .slice(0, 200) - : ""; - } - sendEvent(name, metadata, undefinedVar, trueVar); - }; - - doc.addEventListener("click", inlineEvent, falseVar); - doc.addEventListener("submit", inlineEvent, falseVar); - - // 404 confirmation adds a request, so existing installs must opt in. - if ( - overwriteOptions.detect404 === trueVar || - attr(scriptElement, "detect-404") == trueText - ) { - var detect404 = function () { - if ( - !/\b404\b/.test(doc.title + " " + (doc.body && doc.body.textContent)) - ) - return; - try { - var request = new window.XMLHttpRequest(); - request.open("HEAD", loc.href, trueVar); - request.onload = function () { - if (request.status === 404) - sendEvent("page_404", { - url: loc.protocol + "//" + definedHostname + loc.pathname, - status: 404, - }); - }; - request.send(); - } catch (error) {} - }; - if (doc.readyState === "loading") - doc.addEventListener("DOMContentLoaded", detect404, falseVar); - else detect404(); - } } catch (e) { sendError(e); } diff --git a/dist/latest/custom/app.js b/dist/latest/custom/app.js index 80658aca..608cb48a 100644 --- a/dist/latest/custom/app.js +++ b/dist/latest/custom/app.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-15; dced; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-15; 612b; v12) */ -!function(h,t,e,n,m){try{var v=undefined,g=!0,y=!1,r="true",a="https:",_="pageview",l="event",i="error",o=h.console,c="doNotTrack",b=h.navigator,s=h.location,w=s.host,u=h.document,p=b.userAgent,f="Not sending request ",d=f+"when ",O=y,x=encodeURIComponent,E=decodeURIComponent,M=JSON.stringify,S=h.addEventListener,k="https://"+e,A=u.documentElement||{},q="language",C="Height",D="scroll",$=b.userAgentData,j=D+C,H="offset"+C,R="client"+C,L="pagehide",N="platform",P="platformVersion",T="https://docs.simpleanalytics.com",U=0,I=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),V=h.screen,B=u.currentScript||u.querySelector('script[src*="'+e+'"]');m=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){m("Error in your "+t+" function:",e)},z=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},W=function(t){return"string"==typeof t},G=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},J=function(t,e){return t&&t.getAttribute("data-"+e)},X=function(t){return Array.isArray(t)?t:W(t)&&t.length?t.split(/, ?/):[]},Y=function(t){return t&&t.constructor===Object},Z=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},it=function(t){return"function"==typeof t},ot="namespace",ct=t[ot]||J(B,ot)||"sa",st=function(t,e){var n=h[ct+"_metadata"];Y(n)&&(t=Z(t,n));var r=h[kt];if(!it(r))return kt&&m(kt+" not found, set window."+kt),t;try{return Z(t,r.call(h,Z(t,e)))}catch(a){F("metadata",a)}},ut=t.strictUtm||J(B,"strict-utm")==r,lt=function(i,t){tt=!i&&nt("q")?"":y;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");tt!==y&&0"); +!function(m,t,e,n,v){try{var g=undefined,y=!0,_=!1,r="true",a="https:",w="pageview",u="event",i="error",o=m.console,c="doNotTrack",b=m.navigator,s=m.location,O=s.host,l=m.document,p=b.userAgent,f="Not sending request ",h=f+"when ",x=_,d=encodeURIComponent,E=decodeURIComponent,S=JSON.stringify,k=m.addEventListener,M="https://"+e,q=l.documentElement||{},A="language",$="Height",j="scroll",D=b.userAgentData,C=j+$,H="offset"+$,R="client"+$,P="pagehide",T="platform",U="platformVersion",I="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),N=m.screen,z=l.currentScript||l.querySelector('script[src*="'+e+'"]');v=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){v("Error in your "+t+" function:",e)},W=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},G=function(t){return"string"==typeof t},J=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},L=function(t,e){return t&&t.getAttribute("data-"+e)},Y=function(t){return Array.isArray(t)?t:G(t)&&t.length?t.split(/, ?/):[]},Z=function(t){return t&&t.constructor===Object},K=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},it=function(t){return"function"==typeof t},ot="namespace",ct=t[ot]||L(z,ot)||"sa",st=function(t,e){var n=m[ct+"_metadata"];Z(n)&&(t=K(t,n));var r=m[Mt];if(!it(r))return Mt&&v(Mt+" not found, set window."+Mt),t;try{return K(t,r.call(m,K(t,e)))}catch(a){F("metadata",a)}},ut=t.strictUtm||L(z,"strict-utm")==r,lt=function(i,t){tt=!i&&nt("q")?"":_;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");tt!==_&&0"); //# sourceMappingURL=app.js.map \ No newline at end of file diff --git a/dist/latest/custom/app.js.map b/dist/latest/custom/app.js.map index 81a83e2d..72ed4273 100644 --- a/dist/latest/custom/app.js.map +++ b/dist/latest/custom/app.js.map @@ -1 +1 @@ -{"version":3,"file":"app.source.js","sources":["app.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData, keepalive) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n var imageUrl =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n\n // Inline events must survive navigation without taking over links or forms.\n if (keepalive && window.fetch) {\n try {\n window\n .fetch(imageUrl, {\n keepalive: trueVar,\n mode: \"no-cors\",\n credentials: \"omit\",\n })\n .catch(function () {\n image.src = imageUrl;\n });\n return;\n } catch (error) {}\n }\n image.src = imageUrl;\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw, keepalive) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback,\n undefinedVar,\n keepalive\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n\n var inlineEvent = function (event) {\n var element = event.target;\n while (\n element &&\n element !== doc &&\n (!element.getAttribute || attr(element, \"simple-event\") === null)\n )\n element = element.parentNode;\n\n if (!element || element === doc) return;\n var isForm = element.tagName === \"FORM\";\n var name = attr(element, \"simple-event\");\n if (!name || isForm !== (event.type === \"submit\")) return;\n\n var metadata = { tag: element.tagName.toLowerCase() };\n var attributes = element.attributes;\n for (var i = 0; i < attributes.length; i++) {\n var attribute = attributes[i];\n if (attribute.name.indexOf(\"data-simple-event-\") === 0)\n metadata[attribute.name.slice(18).replace(/-/g, \"_\")] =\n attribute.value;\n }\n if (isForm) {\n var button = event.submitter;\n metadata.button_text = button\n ? (button.textContent || button.value || \"\")\n .replace(/\\s+/g, \" \")\n .trim()\n .slice(0, 200)\n : \"\";\n }\n sendEvent(name, metadata, undefinedVar, trueVar);\n };\n\n doc.addEventListener(\"click\", inlineEvent, falseVar);\n doc.addEventListener(\"submit\", inlineEvent, falseVar);\n\n // 404 confirmation adds a request, so existing installs must opt in.\n if (\n overwriteOptions.detect404 === trueVar ||\n attr(scriptElement, \"detect-404\") == trueText\n ) {\n var detect404 = function () {\n if (\n !/\\b404\\b/.test(doc.title + \" \" + (doc.body && doc.body.textContent))\n )\n return;\n try {\n var request = new window.XMLHttpRequest();\n request.open(\"HEAD\", loc.href, trueVar);\n request.onload = function () {\n if (request.status === 404)\n sendEvent(\"page_404\", {\n url: loc.protocol + \"//\" + definedHostname + loc.pathname,\n status: 404,\n });\n };\n request.send();\n } catch (error) {}\n };\n if (doc.readyState === \"loading\")\n doc.addEventListener(\"DOMContentLoaded\", detect404, falseVar);\n else detect404();\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_app_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","keepalive","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","imageUrl","key","fetch","mode","credentials","catch","src","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","protocol","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue","detect404","inlineEvent","element","target","parentNode","isForm","tagName","button","tag","toLowerCase","attributes","submitter","button_text","textContent","trim","title","request","XMLHttpRequest","open","href","status","url","send","readyState"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"app.source.js","sources":["app.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch = \"\";\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n var pathKey = path + querySearch;\n if (!path || lastSendPath == pathKey) return;\n\n lastSendPath = pathKey;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_app_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","protocol","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","parts","querySearch","shift","pathKey","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue"],"mappings":"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"} \ No newline at end of file diff --git a/dist/latest/custom/e.js b/dist/latest/custom/e.js index edf0362a..be761a73 100644 --- a/dist/latest/custom/e.js +++ b/dist/latest/custom/e.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-15; a84b; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-15; e660; v12) */ -!function(h,t,e,n,v){try{var m=undefined,g=!0,y=!1,r="true",a="https:",_="pageview",l="event",i="error",o=h.console,c="doNotTrack",b=h.navigator,s=h.location,w=s.host,u=h.document,f=b.userAgent,p="Not sending request ",d=p+"when ",O=y,x=encodeURIComponent,E=decodeURIComponent,M=JSON.stringify,S=h.addEventListener,k="https://"+e,A=u.documentElement||{},q="language",C="Height",D="scroll",$=b.userAgentData,j=D+C,H="offset"+C,R="client"+C,L="pagehide",N="platform",P="platformVersion",T="https://docs.simpleanalytics.com",U=0,I=/(bot|spider|crawl)/i.test(f)&&!/(cubot)/i.test(f),V=h.screen,B=u.currentScript||u.querySelector('script[src*="'+e+'"]');v=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){v("Error in your "+t+" function:",e)},z=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},W=function(t){return"string"==typeof t},G=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},J=function(t,e){return t&&t.getAttribute("data-"+e)},X=function(t){return Array.isArray(t)?t:W(t)&&t.length?t.split(/, ?/):[]},Y=function(t){return t&&t.constructor===Object},Z=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},it=function(t){return"function"==typeof t},ot="namespace",ct=t[ot]||J(B,ot)||"sa",st=function(t,e){var n=h[ct+"_metadata"];Y(n)&&(t=Z(t,n));var r=h[kt];if(!it(r))return kt&&v(kt+" not found, set window."+kt),t;try{return Z(t,r.call(h,Z(t,e)))}catch(a){F("metadata",a)}},ut=t.strictUtm||J(B,"strict-utm")==r,lt=function(i,t){tt=!i&&nt("q")?"":y;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");tt!==y&&0"); +!function(m,t,e,n,v){try{var g=undefined,y=!0,_=!1,r="true",a="https:",w="pageview",u="event",i="error",o=m.console,c="doNotTrack",b=m.navigator,s=m.location,O=s.host,l=m.document,p=b.userAgent,f="Not sending request ",h=f+"when ",x=_,d=encodeURIComponent,E=decodeURIComponent,S=JSON.stringify,k=m.addEventListener,M="https://"+e,q=l.documentElement||{},A="language",$="Height",j="scroll",D=b.userAgentData,C=j+$,H="offset"+$,R="client"+$,P="pagehide",T="platform",U="platformVersion",I="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),N=m.screen,z=l.currentScript||l.querySelector('script[src*="'+e+'"]');v=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){v("Error in your "+t+" function:",e)},W=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},G=function(t){return"string"==typeof t},J=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},L=function(t,e){return t&&t.getAttribute("data-"+e)},Y=function(t){return Array.isArray(t)?t:G(t)&&t.length?t.split(/, ?/):[]},Z=function(t){return t&&t.constructor===Object},K=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},it=function(t){return"function"==typeof t},ot="namespace",ct=t[ot]||L(z,ot)||"sa",st=function(t,e){var n=m[ct+"_metadata"];Z(n)&&(t=K(t,n));var r=m[Mt];if(!it(r))return Mt&&v(Mt+" not found, set window."+Mt),t;try{return K(t,r.call(m,K(t,e)))}catch(a){F("metadata",a)}},ut=t.strictUtm||L(z,"strict-utm")==r,lt=function(i,t){tt=!i&&nt("q")?"":_;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");tt!==_&&0"); //# sourceMappingURL=e.js.map \ No newline at end of file diff --git a/dist/latest/custom/e.js.map b/dist/latest/custom/e.js.map index 9bf41c9f..4dd11219 100644 --- a/dist/latest/custom/e.js.map +++ b/dist/latest/custom/e.js.map @@ -1 +1 @@ -{"version":3,"file":"e.source.js","sources":["e.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData, keepalive) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n var imageUrl =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n\n // Inline events must survive navigation without taking over links or forms.\n if (keepalive && window.fetch) {\n try {\n window\n .fetch(imageUrl, {\n keepalive: trueVar,\n mode: \"no-cors\",\n credentials: \"omit\",\n })\n .catch(function () {\n image.src = imageUrl;\n });\n return;\n } catch (error) {}\n }\n image.src = imageUrl;\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw, keepalive) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback,\n undefinedVar,\n keepalive\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n\n var inlineEvent = function (event) {\n var element = event.target;\n while (\n element &&\n element !== doc &&\n (!element.getAttribute || attr(element, \"simple-event\") === null)\n )\n element = element.parentNode;\n\n if (!element || element === doc) return;\n var isForm = element.tagName === \"FORM\";\n var name = attr(element, \"simple-event\");\n if (!name || isForm !== (event.type === \"submit\")) return;\n\n var metadata = { tag: element.tagName.toLowerCase() };\n var attributes = element.attributes;\n for (var i = 0; i < attributes.length; i++) {\n var attribute = attributes[i];\n if (attribute.name.indexOf(\"data-simple-event-\") === 0)\n metadata[attribute.name.slice(18).replace(/-/g, \"_\")] =\n attribute.value;\n }\n if (isForm) {\n var button = event.submitter;\n metadata.button_text = button\n ? (button.textContent || button.value || \"\")\n .replace(/\\s+/g, \" \")\n .trim()\n .slice(0, 200)\n : \"\";\n }\n sendEvent(name, metadata, undefinedVar, trueVar);\n };\n\n doc.addEventListener(\"click\", inlineEvent, falseVar);\n doc.addEventListener(\"submit\", inlineEvent, falseVar);\n\n // 404 confirmation adds a request, so existing installs must opt in.\n if (\n overwriteOptions.detect404 === trueVar ||\n attr(scriptElement, \"detect-404\") == trueText\n ) {\n var detect404 = function () {\n if (\n !/\\b404\\b/.test(doc.title + \" \" + (doc.body && doc.body.textContent))\n )\n return;\n try {\n var request = new window.XMLHttpRequest();\n request.open(\"HEAD\", loc.href, trueVar);\n request.onload = function () {\n if (request.status === 404)\n sendEvent(\"page_404\", {\n url: loc.protocol + \"//\" + definedHostname + loc.pathname,\n status: 404,\n });\n };\n request.send();\n } catch (error) {}\n };\n if (doc.readyState === \"loading\")\n doc.addEventListener(\"DOMContentLoaded\", detect404, falseVar);\n else detect404();\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_events_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","keepalive","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","imageUrl","key","fetch","mode","credentials","catch","src","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","protocol","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue","detect404","inlineEvent","element","target","parentNode","isForm","tagName","button","tag","toLowerCase","attributes","submitter","button_text","textContent","trim","title","request","XMLHttpRequest","open","href","status","url","send","readyState"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"e.source.js","sources":["e.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch = \"\";\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n var pathKey = path + querySearch;\n if (!path || lastSendPath == pathKey) return;\n\n lastSendPath = pathKey;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_events_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","protocol","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","parts","querySearch","shift","pathKey","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue"],"mappings":"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"} \ No newline at end of file diff --git a/dist/latest/custom/latest.dev.js b/dist/latest/custom/latest.dev.js index 3d22c764..6a83aaa5 100644 --- a/dist/latest/custom/latest.dev.js +++ b/dist/latest/custom/latest.dev.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-15; e9a1; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-15; cd25; v12) */ /* eslint-env browser */ (function ( @@ -296,7 +296,7 @@ // // Send data via image - var sendData = function (data, callback, onlyThisData, keepalive) { + var sendData = function (data, callback, onlyThisData) { data = onlyThisData ? data : assign(payload, page, data); if (nav.brave && !onlyThisData) data.brave = trueVar; @@ -309,7 +309,7 @@ image.onerror = callback; image.onload = callback; } - var imageUrl = + image.src = fullApiUrl + "/simple.gif?" + Object.keys(data) @@ -326,23 +326,6 @@ .join("&") + "&time=" + Date.now(); - - // Inline events must survive navigation without taking over links or forms. - if (keepalive && window.fetch) { - try { - window - .fetch(imageUrl, { - keepalive: trueVar, - mode: "no-cors", - credentials: "omit", - }) - .catch(function () { - image.src = imageUrl; - }); - return; - } catch (error) {} - } - image.src = imageUrl; }; // Customers can overwrite their hostname, here we check for that @@ -731,7 +714,7 @@ ) { if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata; var callback = isFunction(callbackRaw) ? callbackRaw : function () {}; - var querySearch; + var querySearch = ""; if (isString(pathOverwrite) && pathOverwrite.indexOf("?") > -1) { // keep query from manual path var parts = pathOverwrite.split("?"); @@ -742,9 +725,10 @@ var path = getPath(pathOverwrite); // Don't send the last path again (this could happen when pushState is used to change the path hash or search) - if (!path || lastSendPath == path) return; + var pathKey = path + querySearch; + if (!path || lastSendPath == pathKey) return; - lastSendPath = path; + lastSendPath = pathKey; page.path = path; // v = viewportsizes @@ -922,7 +906,7 @@ var validTypes = ["string", "number"]; - var sendEvent = function (event, metadata, callbackRaw, keepalive) { + var sendEvent = function (event, metadata, callbackRaw) { if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata; var eventIsFunction = isFunction(event); @@ -970,9 +954,7 @@ metadata: stringify(metadata), }), - callback, - undefinedVar, - keepalive + callback ); } }; @@ -1001,71 +983,6 @@ : sendEvent(queue[event]); } } - - var inlineEvent = function (event) { - var element = event.target; - while ( - element && - element !== doc && - (!element.getAttribute || attr(element, "simple-event") === null) - ) - element = element.parentNode; - - if (!element || element === doc) return; - var isForm = element.tagName === "FORM"; - var name = attr(element, "simple-event"); - if (!name || isForm !== (event.type === "submit")) return; - - var metadata = { tag: element.tagName.toLowerCase() }; - var attributes = element.attributes; - for (var i = 0; i < attributes.length; i++) { - var attribute = attributes[i]; - if (attribute.name.indexOf("data-simple-event-") === 0) - metadata[attribute.name.slice(18).replace(/-/g, "_")] = - attribute.value; - } - if (isForm) { - var button = event.submitter; - metadata.button_text = button - ? (button.textContent || button.value || "") - .replace(/\s+/g, " ") - .trim() - .slice(0, 200) - : ""; - } - sendEvent(name, metadata, undefinedVar, trueVar); - }; - - doc.addEventListener("click", inlineEvent, falseVar); - doc.addEventListener("submit", inlineEvent, falseVar); - - // 404 confirmation adds a request, so existing installs must opt in. - if ( - overwriteOptions.detect404 === trueVar || - attr(scriptElement, "detect-404") == trueText - ) { - var detect404 = function () { - if ( - !/\b404\b/.test(doc.title + " " + (doc.body && doc.body.textContent)) - ) - return; - try { - var request = new window.XMLHttpRequest(); - request.open("HEAD", loc.href, trueVar); - request.onload = function () { - if (request.status === 404) - sendEvent("page_404", { - url: loc.protocol + "//" + definedHostname + loc.pathname, - status: 404, - }); - }; - request.send(); - } catch (error) {} - }; - if (doc.readyState === "loading") - doc.addEventListener("DOMContentLoaded", detect404, falseVar); - else detect404(); - } } catch (e) { sendError(e); } diff --git a/dist/latest/custom/latest.js b/dist/latest/custom/latest.js index d61b736a..0ead48e4 100644 --- a/dist/latest/custom/latest.js +++ b/dist/latest/custom/latest.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-15; 1805; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-15; efb5; v12) */ -!function(h,t,e,n,m){try{var v=undefined,g=!0,y=!1,r="true",a="https:",_="pageview",l="event",i="error",o=h.console,c="doNotTrack",b=h.navigator,s=h.location,w=s.host,u=h.document,f=b.userAgent,p="Not sending request ",d=p+"when ",O=y,x=encodeURIComponent,E=decodeURIComponent,M=JSON.stringify,S=h.addEventListener,k="https://"+e,A=u.documentElement||{},q="language",C="Height",D="scroll",$=b.userAgentData,j=D+C,H="offset"+C,R="client"+C,L="pagehide",N="platform",P="platformVersion",T="https://docs.simpleanalytics.com",U=0,I=/(bot|spider|crawl)/i.test(f)&&!/(cubot)/i.test(f),V=h.screen,B=u.currentScript||u.querySelector('script[src*="'+e+'"]');m=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){m("Error in your "+t+" function:",e)},z=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},W=function(t){return"string"==typeof t},G=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},J=function(t,e){return t&&t.getAttribute("data-"+e)},X=function(t){return Array.isArray(t)?t:W(t)&&t.length?t.split(/, ?/):[]},Y=function(t){return t&&t.constructor===Object},Z=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},it=function(t){return"function"==typeof t},ot="namespace",ct=t[ot]||J(B,ot)||"sa",st=function(t,e){var n=h[ct+"_metadata"];Y(n)&&(t=Z(t,n));var r=h[kt];if(!it(r))return kt&&m(kt+" not found, set window."+kt),t;try{return Z(t,r.call(h,Z(t,e)))}catch(a){F("metadata",a)}},ut=t.strictUtm||J(B,"strict-utm")==r,lt=function(i,t){tt=!i&&nt("q")?"":y;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");tt!==y&&0"); +!function(m,t,e,n,v){try{var g=undefined,y=!0,_=!1,r="true",a="https:",w="pageview",u="event",i="error",o=m.console,c="doNotTrack",b=m.navigator,s=m.location,O=s.host,l=m.document,p=b.userAgent,f="Not sending request ",h=f+"when ",x=_,d=encodeURIComponent,E=decodeURIComponent,S=JSON.stringify,k=m.addEventListener,M="https://"+e,q=l.documentElement||{},A="language",$="Height",j="scroll",D=b.userAgentData,C=j+$,H="offset"+$,R="client"+$,P="pagehide",T="platform",U="platformVersion",I="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),N=m.screen,z=l.currentScript||l.querySelector('script[src*="'+e+'"]');v=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){v("Error in your "+t+" function:",e)},W=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},G=function(t){return"string"==typeof t},J=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},L=function(t,e){return t&&t.getAttribute("data-"+e)},Y=function(t){return Array.isArray(t)?t:G(t)&&t.length?t.split(/, ?/):[]},Z=function(t){return t&&t.constructor===Object},K=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},it=function(t){return"function"==typeof t},ot="namespace",ct=t[ot]||L(z,ot)||"sa",st=function(t,e){var n=m[ct+"_metadata"];Z(n)&&(t=K(t,n));var r=m[Mt];if(!it(r))return Mt&&v(Mt+" not found, set window."+Mt),t;try{return K(t,r.call(m,K(t,e)))}catch(a){F("metadata",a)}},ut=t.strictUtm||L(z,"strict-utm")==r,lt=function(i,t){tt=!i&&nt("q")?"":_;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");tt!==_&&0"); //# sourceMappingURL=latest.js.map \ No newline at end of file diff --git a/dist/latest/custom/latest.js.map b/dist/latest/custom/latest.js.map index 82a6992f..92d15e30 100644 --- a/dist/latest/custom/latest.js.map +++ b/dist/latest/custom/latest.js.map @@ -1 +1 @@ -{"version":3,"file":"latest.source.js","sources":["latest.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData, keepalive) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n var imageUrl =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n\n // Inline events must survive navigation without taking over links or forms.\n if (keepalive && window.fetch) {\n try {\n window\n .fetch(imageUrl, {\n keepalive: trueVar,\n mode: \"no-cors\",\n credentials: \"omit\",\n })\n .catch(function () {\n image.src = imageUrl;\n });\n return;\n } catch (error) {}\n }\n image.src = imageUrl;\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw, keepalive) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback,\n undefinedVar,\n keepalive\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n\n var inlineEvent = function (event) {\n var element = event.target;\n while (\n element &&\n element !== doc &&\n (!element.getAttribute || attr(element, \"simple-event\") === null)\n )\n element = element.parentNode;\n\n if (!element || element === doc) return;\n var isForm = element.tagName === \"FORM\";\n var name = attr(element, \"simple-event\");\n if (!name || isForm !== (event.type === \"submit\")) return;\n\n var metadata = { tag: element.tagName.toLowerCase() };\n var attributes = element.attributes;\n for (var i = 0; i < attributes.length; i++) {\n var attribute = attributes[i];\n if (attribute.name.indexOf(\"data-simple-event-\") === 0)\n metadata[attribute.name.slice(18).replace(/-/g, \"_\")] =\n attribute.value;\n }\n if (isForm) {\n var button = event.submitter;\n metadata.button_text = button\n ? (button.textContent || button.value || \"\")\n .replace(/\\s+/g, \" \")\n .trim()\n .slice(0, 200)\n : \"\";\n }\n sendEvent(name, metadata, undefinedVar, trueVar);\n };\n\n doc.addEventListener(\"click\", inlineEvent, falseVar);\n doc.addEventListener(\"submit\", inlineEvent, falseVar);\n\n // 404 confirmation adds a request, so existing installs must opt in.\n if (\n overwriteOptions.detect404 === trueVar ||\n attr(scriptElement, \"detect-404\") == trueText\n ) {\n var detect404 = function () {\n if (\n !/\\b404\\b/.test(doc.title + \" \" + (doc.body && doc.body.textContent))\n )\n return;\n try {\n var request = new window.XMLHttpRequest();\n request.open(\"HEAD\", loc.href, trueVar);\n request.onload = function () {\n if (request.status === 404)\n sendEvent(\"page_404\", {\n url: loc.protocol + \"//\" + definedHostname + loc.pathname,\n status: 404,\n });\n };\n request.send();\n } catch (error) {}\n };\n if (doc.readyState === \"loading\")\n doc.addEventListener(\"DOMContentLoaded\", detect404, falseVar);\n else detect404();\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_latest_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","keepalive","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","imageUrl","key","fetch","mode","credentials","catch","src","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","protocol","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue","detect404","inlineEvent","element","target","parentNode","isForm","tagName","button","tag","toLowerCase","attributes","submitter","button_text","textContent","trim","title","request","XMLHttpRequest","open","href","status","url","send","readyState"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"latest.source.js","sources":["latest.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch = \"\";\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n var pathKey = path + querySearch;\n if (!path || lastSendPath == pathKey) return;\n\n lastSendPath = pathKey;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_latest_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","protocol","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","parts","querySearch","shift","pathKey","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue"],"mappings":"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"} \ No newline at end of file diff --git a/dist/latest/custom/light.js b/dist/latest/custom/light.js index 6aa847a6..33d5ca46 100644 --- a/dist/latest/custom/light.js +++ b/dist/latest/custom/light.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-15; fa6c; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-15; deb8; v12) */ -!function(l,e,t,f){try{var u=undefined,n="https:",r=l.console,a="doNotTrack",m=l.navigator,p=l.location,g=p.host,i=l.document,o=m.userAgent,c="Not sending request ",h=!1,s=encodeURIComponent,d=decodeURIComponent,v=JSON.stringify,y=l.addEventListener,_="https://"+t,b=(i.documentElement,"language"),w=m.userAgentData,O="platform",S="platformVersion",j="https://docs.simpleanalytics.com",k=/(bot|spider|crawl)/i.test(o)&&!/(cubot)/i.test(o),x=i.currentScript||i.querySelector('script[src*="'+t+'"]');f=function(){var e=[].slice.call(arguments);return e.unshift("Simple Analytics:"),Function.prototype.apply.call(r.warn,r,e)};var E=function(e){return"string"==typeof e},A=function(e,t){return e&&e.getAttribute("data-"+t)},$=function(){for(var e,t,n,r={},a=arguments,i=0;i>e/4).toString(16)})}catch(r){return e.replace(n,function(e){var t=16*Math.random()|0;return(e<2?t:3&t|8).toString(16)})}},N=function(e){return"function"==typeof e},R="namespace",U=e[R]||A(x,R)||"sa",V=e.strictUtm||"true"==A(x,"strict-utm"),B=U+"_loaded";if(1==l[B])return f(c+"twice");l.sa_event_loaded=!0,l[B]=!0;var C,H=function(t,e,n,r){t=n?t:$(J,M,t),m.brave&&!n&&(t.brave=!0),m._duckduckgoloader_&&!n&&(t.duck=!0);var a=new Image,i=_+"/simple.gif?"+Object.keys(t).filter(function(e){return t[e]!=u}).map(function(e){return s(e)+"="+s(t[e])}).join("&")+"&time="+Date.now();a.src=i},T=e.hostname||A(x,"hostname"),F=T||g,z={version:"custom_light_12",hostname:F};e.mode||A(x,"mode");try{C=Intl.DateTimeFormat().resolvedOptions().timeZone}catch(X){f(X)}k&&(z.bot=!0);var J=$(z,{ua:o,https:p.protocol==n,timezone:C,page_id:I(),session_id:I()});if(J.sri=!1,w&&(J.mobile=w.mobile,J.brands=v(w.brands)),F!==g&&(J.hostname_original=g),a in m&&"1"==m[a])return f("Not sending request when "+a+" is enabled. See "+j+"/dnt");-1!=g.indexOf(".")&&!/^[0-9.:]+$/.test(g)||T||f("Set hostname on "+g+". See "+j+"/overwrite-domain-name");var L,M={},P=(e.referrer||A(x,"referrer")||i.referrer||"").replace(g,F).replace(/^https?:\/\/((m|l|w{2,3}([0-9]+)?)\.)?([^?#]+)(.*)$/,"$4").replace(/^([^/]+)$/,"$1")||u,Z=function(e,t){var n=$(z,{type:"append",original_id:t?e:J.page_id});if(t||!m.sendBeacon)H(n,0,!0);else try{m.sendBeacon.bind(m)(_+"/append",v(n))}catch(r){H(n,0,!0)}};y("pagehide",Z,!1);var G,K,Q=function(e){var t="";try{t=e||d(p.pathname)}catch(X){f(X)}return t},W=function(e,t,n,r,a,i){e&&Z(""+J.page_id,!0),J.page_id=I();var o,c=F+Q(),s=(o=t,(r||p.search).slice(1).split("&").filter(function(e){return!o&&new RegExp("^((utm_)"+(V?"":"?")+"(source|medium|content|term|campaign)"+(V?"":"|ref")+")=","i").test(e)}).join("&")||u);H({id:J.page_id,type:"pageview",referrer:!t||n?P:null,query:s}),P=c,0};!function(e,t,n,r){!r&&N(n)&&(r=n);var a,i;N(r);E(t)&&-1"); +!function(f,e,t,m){try{var u=undefined,n="https:",r=f.console,i="doNotTrack",g=f.navigator,p=f.location,h=p.host,a=f.document,o=g.userAgent,c="Not sending request ",v=!1,s=encodeURIComponent,d=decodeURIComponent,l=JSON.stringify,y=f.addEventListener,_="https://"+t,b=(a.documentElement,"language"),w=g.userAgentData,O="platform",S="platformVersion",j="https://docs.simpleanalytics.com",k=/(bot|spider|crawl)/i.test(o)&&!/(cubot)/i.test(o),x=a.currentScript||a.querySelector('script[src*="'+t+'"]');m=function(){var e=[].slice.call(arguments);return e.unshift("Simple Analytics:"),Function.prototype.apply.call(r.warn,r,e)};var E=function(e){return"string"==typeof e},A=function(e,t){return e&&e.getAttribute("data-"+t)},$=function(){for(var e,t,n,r={},i=arguments,a=0;a>e/4).toString(16)})}catch(r){return e.replace(n,function(e){var t=16*Math.random()|0;return(e<2?t:3&t|8).toString(16)})}},N=function(e){return"function"==typeof e},R="namespace",U=e[R]||A(x,R)||"sa",V=e.strictUtm||"true"==A(x,"strict-utm"),B=U+"_loaded";if(1==f[B])return m(c+"twice");f.sa_event_loaded=!0,f[B]=!0;var C,H=function(t,e,n){t=n?t:$(J,M,t),g.brave&&!n&&(t.brave=!0),g._duckduckgoloader_&&!n&&(t.duck=!0),(new Image).src=_+"/simple.gif?"+Object.keys(t).filter(function(e){return t[e]!=u}).map(function(e){return s(e)+"="+s(t[e])}).join("&")+"&time="+Date.now()},T=e.hostname||A(x,"hostname"),F=T||h,z={version:"custom_light_12",hostname:F};e.mode||A(x,"mode");try{C=Intl.DateTimeFormat().resolvedOptions().timeZone}catch(X){m(X)}k&&(z.bot=!0);var J=$(z,{ua:o,https:p.protocol==n,timezone:C,page_id:I(),session_id:I()});if(J.sri=!1,w&&(J.mobile=w.mobile,J.brands=l(w.brands)),F!==h&&(J.hostname_original=h),i in g&&"1"==g[i])return m("Not sending request when "+i+" is enabled. See "+j+"/dnt");-1!=h.indexOf(".")&&!/^[0-9.:]+$/.test(h)||T||m("Set hostname on "+h+". See "+j+"/overwrite-domain-name");var L,M={},P=(e.referrer||A(x,"referrer")||a.referrer||"").replace(h,F).replace(/^https?:\/\/((m|l|w{2,3}([0-9]+)?)\.)?([^?#]+)(.*)$/,"$4").replace(/^([^/]+)$/,"$1")||u,Z=function(e,t){var n=$(z,{type:"append",original_id:t?e:J.page_id});if(t||!g.sendBeacon)H(n,0,!0);else try{g.sendBeacon.bind(g)(_+"/append",l(n))}catch(r){H(n,0,!0)}};y("pagehide",Z,!1);var G,K,Q=function(e){var t="";try{t=e||d(p.pathname)}catch(X){m(X)}return t},W=function(e,t,n,r,i,a){e&&Z(""+J.page_id,!0),J.page_id=I();var o,c=F+Q(),s=(o=t,(r||p.search).slice(1).split("&").filter(function(e){return!o&&new RegExp("^((utm_)"+(V?"":"?")+"(source|medium|content|term|campaign)"+(V?"":"|ref")+")=","i").test(e)}).join("&")||u);H({id:J.page_id,type:"pageview",referrer:!t||n?P:null,query:s}),P=c,0};!function(e,t,n,r){!r&&N(n)&&(r=n);N(r);var i,a="";E(t)&&-1"); //# sourceMappingURL=light.js.map \ No newline at end of file diff --git a/dist/latest/custom/light.js.map b/dist/latest/custom/light.js.map index 8672605f..1ac2f196 100644 --- a/dist/latest/custom/light.js.map +++ b/dist/latest/custom/light.js.map @@ -1 +1 @@ -{"version":3,"file":"light.source.js","sources":["light.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n\n var collectMetricByString = function (metricAbbreviation) {\n // eslint-disable-next-line no-unreachable\n return true;\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n if (ignore) return falseVar;\n // eslint-disable-next-line no-redeclare\n var regex =\n \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \")=\";\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n return q || undefinedVar;\n };\n\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData, keepalive) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n var imageUrl =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n\n image.src = imageUrl;\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n\n\n\n\n\n\n\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n // eslint-disable-next-line no-redeclare\n var bot = isBotAgent;\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n\n\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n sameSite = referrer\n ? referrer.split(slash)[0] == locationHostname\n : falseVar;\n\n\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n\n\n pageview();\n\n } catch (e) {\n warn(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_light_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","warn","undefinedVar","undefined","https","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","language","documentElement","uaData","userAgentData","platformText","platformVersionText","docsUrl","isBotAgent","test","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","isString","string","attr","attribute","getAttribute","assign","obj","prop","object","to","arg","index","length","nextSource","constructor","Object","nextKey","hasOwnProperty","settings","sa_settings","logSettings","keys","Date","now","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","replace","c","getRandomValues","Uint8Array","toString","error","r","Math","random","isFunction","func","namespaceText","namespace","strictUtm","loadedVariable","sa_event_loaded","timezone","sendData","data","callback","onlyThisData","keepalive","payload","page","brave","_duckduckgoloader_","duck","image","Image","imageUrl","filter","key","map","join","src","overwrittenHostname","hostname","definedHostname","basePayload","version","mode","Intl","DateTimeFormat","resolvedOptions","timeZone","bot","ua","protocol","page_id","session_id","sri","mobile","brands","hostname_original","indexOf","lastSendPath","referrer","sendOnLeave","id","push","append","type","original_id","sendBeacon","bind","e","sameSite","userNavigated","getPath","overwrite","path","pathname","sendPageView","isPushState","deleteSourceInfo","search","metadata","ignoreSource","currentPage","query","split","keyValue","RegExp","pages","pathOverwrite","callbackRaw","querySearch","parts","shift","performaceEntryType","perf","performance","navigationText","getEntriesByType","triggerSendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","pageview"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"light.source.js","sources":["light.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n\n var collectMetricByString = function (metricAbbreviation) {\n // eslint-disable-next-line no-unreachable\n return true;\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n if (ignore) return falseVar;\n // eslint-disable-next-line no-redeclare\n var regex =\n \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \")=\";\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n return q || undefinedVar;\n };\n\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n\n\n\n\n\n\n\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n // eslint-disable-next-line no-redeclare\n var bot = isBotAgent;\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n\n\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch = \"\";\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n var pathKey = path + querySearch;\n if (!path || lastSendPath == pathKey) return;\n\n lastSendPath = pathKey;\n page.path = path;\n\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n sameSite = referrer\n ? referrer.split(slash)[0] == locationHostname\n : falseVar;\n\n\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n\n\n pageview();\n\n } catch (e) {\n warn(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_light_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","warn","undefinedVar","undefined","https","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","language","documentElement","uaData","userAgentData","platformText","platformVersionText","docsUrl","isBotAgent","test","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","isString","string","attr","attribute","getAttribute","assign","obj","prop","object","to","arg","index","length","nextSource","constructor","Object","nextKey","hasOwnProperty","settings","sa_settings","logSettings","keys","Date","now","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","replace","c","getRandomValues","Uint8Array","toString","error","r","Math","random","isFunction","func","namespaceText","namespace","strictUtm","loadedVariable","sa_event_loaded","timezone","sendData","data","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","Image","src","filter","key","map","join","overwrittenHostname","hostname","definedHostname","basePayload","version","mode","Intl","DateTimeFormat","resolvedOptions","timeZone","bot","ua","protocol","page_id","session_id","sri","mobile","brands","hostname_original","indexOf","lastSendPath","referrer","sendOnLeave","id","push","append","type","original_id","sendBeacon","bind","e","sameSite","userNavigated","getPath","overwrite","path","pathname","sendPageView","isPushState","deleteSourceInfo","search","metadata","ignoreSource","currentPage","query","split","keyValue","RegExp","pages","pathOverwrite","callbackRaw","parts","querySearch","shift","pathKey","performaceEntryType","perf","performance","navigationText","getEntriesByType","triggerSendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","pageview"],"mappings":"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"} \ No newline at end of file diff --git a/dist/latest/custom/proxy.js b/dist/latest/custom/proxy.js index 77796331..5fa25001 100644 --- a/dist/latest/custom/proxy.js +++ b/dist/latest/custom/proxy.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-15; 09c1; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-15; 7e4c; v12) */ -!function(h,t,e,n,m){try{var v=undefined,g=!0,y=!1,r="true",a="https:",_="pageview",l="event",i="error",o=h.console,c="doNotTrack",b=h.navigator,s=h.location,w=s.host,u=h.document,p=b.userAgent,f="Not sending request ",d=f+"when ",x=y,O=encodeURIComponent,E=decodeURIComponent,M=JSON.stringify,S=h.addEventListener,k="https://"+e,A=u.documentElement||{},q="language",C="Height",D="scroll",$=b.userAgentData,j=D+C,H="offset"+C,R="client"+C,L="pagehide",N="platform",P="platformVersion",T="https://docs.simpleanalytics.com",U=0,I=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),V=h.screen,B=u.currentScript||u.querySelector('script[src*="'+e+'"]');m=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){m("Error in your "+t+" function:",e)},z=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},W=function(t){return"string"==typeof t},G=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},J=function(t,e){return t&&t.getAttribute("data-"+e)},X=function(t){return Array.isArray(t)?t:W(t)&&t.length?t.split(/, ?/):[]},Y=function(t){return t&&t.constructor===Object},Z=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},it=function(t){return"function"==typeof t},ot="namespace",ct=t[ot]||J(B,ot)||"sa",st=function(t,e){var n=h[ct+"_metadata"];Y(n)&&(t=Z(t,n));var r=h[kt];if(!it(r))return kt&&m(kt+" not found, set window."+kt),t;try{return Z(t,r.call(h,Z(t,e)))}catch(a){F("metadata",a)}},ut=t.strictUtm||J(B,"strict-utm")==r,lt=function(i,t){tt=!i&&nt("q")?"":y;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");tt!==y&&0"); +!function(m,t,e,n,v){try{var g=undefined,y=!0,_=!1,r="true",a="https:",w="pageview",u="event",i="error",o=m.console,c="doNotTrack",b=m.navigator,s=m.location,x=s.host,l=m.document,p=b.userAgent,f="Not sending request ",h=f+"when ",O=_,d=encodeURIComponent,E=decodeURIComponent,S=JSON.stringify,k=m.addEventListener,M="https://"+e,q=l.documentElement||{},A="language",$="Height",j="scroll",D=b.userAgentData,C=j+$,H="offset"+$,P="client"+$,R="pagehide",T="platform",U="platformVersion",I="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),N=m.screen,z=l.currentScript||l.querySelector('script[src*="'+e+'"]');v=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){v("Error in your "+t+" function:",e)},W=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},G=function(t){return"string"==typeof t},J=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},L=function(t,e){return t&&t.getAttribute("data-"+e)},Y=function(t){return Array.isArray(t)?t:G(t)&&t.length?t.split(/, ?/):[]},Z=function(t){return t&&t.constructor===Object},K=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},it=function(t){return"function"==typeof t},ot="namespace",ct=t[ot]||L(z,ot)||"sa",st=function(t,e){var n=m[ct+"_metadata"];Z(n)&&(t=K(t,n));var r=m[Mt];if(!it(r))return Mt&&v(Mt+" not found, set window."+Mt),t;try{return K(t,r.call(m,K(t,e)))}catch(a){F("metadata",a)}},ut=t.strictUtm||L(z,"strict-utm")==r,lt=function(i,t){tt=!i&&nt("q")?"":_;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");tt!==_&&0"); //# sourceMappingURL=proxy.js.map \ No newline at end of file diff --git a/dist/latest/custom/proxy.js.map b/dist/latest/custom/proxy.js.map index 0219736d..163c9add 100644 --- a/dist/latest/custom/proxy.js.map +++ b/dist/latest/custom/proxy.js.map @@ -1 +1 @@ -{"version":3,"file":"proxy.source.js","sources":["proxy.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData, keepalive) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n var imageUrl =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n\n // Inline events must survive navigation without taking over links or forms.\n if (keepalive && window.fetch) {\n try {\n window\n .fetch(imageUrl, {\n keepalive: trueVar,\n mode: \"no-cors\",\n credentials: \"omit\",\n })\n .catch(function () {\n image.src = imageUrl;\n });\n return;\n } catch (error) {}\n }\n image.src = imageUrl;\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw, keepalive) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback,\n undefinedVar,\n keepalive\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n\n var inlineEvent = function (event) {\n var element = event.target;\n while (\n element &&\n element !== doc &&\n (!element.getAttribute || attr(element, \"simple-event\") === null)\n )\n element = element.parentNode;\n\n if (!element || element === doc) return;\n var isForm = element.tagName === \"FORM\";\n var name = attr(element, \"simple-event\");\n if (!name || isForm !== (event.type === \"submit\")) return;\n\n var metadata = { tag: element.tagName.toLowerCase() };\n var attributes = element.attributes;\n for (var i = 0; i < attributes.length; i++) {\n var attribute = attributes[i];\n if (attribute.name.indexOf(\"data-simple-event-\") === 0)\n metadata[attribute.name.slice(18).replace(/-/g, \"_\")] =\n attribute.value;\n }\n if (isForm) {\n var button = event.submitter;\n metadata.button_text = button\n ? (button.textContent || button.value || \"\")\n .replace(/\\s+/g, \" \")\n .trim()\n .slice(0, 200)\n : \"\";\n }\n sendEvent(name, metadata, undefinedVar, trueVar);\n };\n\n doc.addEventListener(\"click\", inlineEvent, falseVar);\n doc.addEventListener(\"submit\", inlineEvent, falseVar);\n\n // 404 confirmation adds a request, so existing installs must opt in.\n if (\n overwriteOptions.detect404 === trueVar ||\n attr(scriptElement, \"detect-404\") == trueText\n ) {\n var detect404 = function () {\n if (\n !/\\b404\\b/.test(doc.title + \" \" + (doc.body && doc.body.textContent))\n )\n return;\n try {\n var request = new window.XMLHttpRequest();\n request.open(\"HEAD\", loc.href, trueVar);\n request.onload = function () {\n if (request.status === 404)\n sendEvent(\"page_404\", {\n url: loc.protocol + \"//\" + definedHostname + loc.pathname,\n status: 404,\n });\n };\n request.send();\n } catch (error) {}\n };\n if (doc.readyState === \"loading\")\n doc.addEventListener(\"DOMContentLoaded\", detect404, falseVar);\n else detect404();\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_proxy_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","keepalive","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","imageUrl","key","fetch","mode","credentials","catch","src","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","protocol","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue","detect404","inlineEvent","element","target","parentNode","isForm","tagName","button","tag","toLowerCase","attributes","submitter","button_text","textContent","trim","title","request","XMLHttpRequest","open","href","status","url","send","readyState"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"proxy.source.js","sources":["proxy.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch = \"\";\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n var pathKey = path + querySearch;\n if (!path || lastSendPath == pathKey) return;\n\n lastSendPath = pathKey;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_proxy_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","protocol","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","parts","querySearch","shift","pathKey","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue"],"mappings":"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"} \ No newline at end of file diff --git a/dist/latest/hello.js b/dist/latest/hello.js index bbca586f..dc6d3071 100644 --- a/dist/latest/hello.js +++ b/dist/latest/hello.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-15; 4044) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-15; 4ed2) */ -!function(h,t,e,n,m){try{var v=undefined,g=!0,y=!1,r="true",a="https:",_="pageview",l="event",i="error",o=h.console,c="doNotTrack",b=h.navigator,s=h.location,w=s.host,u=h.document,p=b.userAgent,f="Not sending request ",d=f+"when ",O=y,E=encodeURIComponent,x=decodeURIComponent,M=JSON.stringify,S=h.addEventListener,k="https://queue."+e,q=u.documentElement||{},A="language",C="Height",D="scroll",$=b.userAgentData,j=D+C,R="offset"+C,H="client"+C,L="pagehide",N="platform",P="platformVersion",T="https://docs.simpleanalytics.com",U=0,I=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),V=h.screen,B=u.currentScript||u.querySelector('script[src*="'+e+'"]');m=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){m("Error in your "+t+" function:",e)},z=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},W=function(t){return"string"==typeof t},G=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},J=function(t,e){return t&&t.getAttribute("data-"+e)},X=function(t){return Array.isArray(t)?t:W(t)&&t.length?t.split(/, ?/):[]},Y=function(t){return t&&t.constructor===Object},Z=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},it=function(t){return"function"==typeof t},ot="namespace",ct=t[ot]||J(B,ot)||"sa",st=function(t,e){var n=h[ct+"_metadata"];Y(n)&&(t=Z(t,n));var r=h[kt];if(!it(r))return kt&&m(kt+" not found, set window."+kt),t;try{return Z(t,r.call(h,Z(t,e)))}catch(a){F("metadata",a)}},ut=t.strictUtm||J(B,"strict-utm")==r,lt=function(i,t){tt=!i&&nt("q")?"":y;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");tt!==y&&0>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},it=function(t){return"function"==typeof t},ot="namespace",ct=t[ot]||L(z,ot)||"sa",st=function(t,e){var n=m[ct+"_metadata"];Z(n)&&(t=K(t,n));var r=m[qt];if(!it(r))return qt&&v(qt+" not found, set window."+qt),t;try{return K(t,r.call(m,K(t,e)))}catch(a){F("metadata",a)}},ut=t.strictUtm||L(z,"strict-utm")==r,lt=function(i,t){tt=!i&&nt("q")?"":_;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");tt!==_&&0> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData, keepalive) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n var imageUrl =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n\n // Inline events must survive navigation without taking over links or forms.\n if (keepalive && window.fetch) {\n try {\n window\n .fetch(imageUrl, {\n keepalive: trueVar,\n mode: \"no-cors\",\n credentials: \"omit\",\n })\n .catch(function () {\n image.src = imageUrl;\n });\n return;\n } catch (error) {}\n }\n image.src = imageUrl;\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw, keepalive) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback,\n undefinedVar,\n keepalive\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n\n var inlineEvent = function (event) {\n var element = event.target;\n while (\n element &&\n element !== doc &&\n (!element.getAttribute || attr(element, \"simple-event\") === null)\n )\n element = element.parentNode;\n\n if (!element || element === doc) return;\n var isForm = element.tagName === \"FORM\";\n var name = attr(element, \"simple-event\");\n if (!name || isForm !== (event.type === \"submit\")) return;\n\n var metadata = { tag: element.tagName.toLowerCase() };\n var attributes = element.attributes;\n for (var i = 0; i < attributes.length; i++) {\n var attribute = attributes[i];\n if (attribute.name.indexOf(\"data-simple-event-\") === 0)\n metadata[attribute.name.slice(18).replace(/-/g, \"_\")] =\n attribute.value;\n }\n if (isForm) {\n var button = event.submitter;\n metadata.button_text = button\n ? (button.textContent || button.value || \"\")\n .replace(/\\s+/g, \" \")\n .trim()\n .slice(0, 200)\n : \"\";\n }\n sendEvent(name, metadata, undefinedVar, trueVar);\n };\n\n doc.addEventListener(\"click\", inlineEvent, falseVar);\n doc.addEventListener(\"submit\", inlineEvent, falseVar);\n\n // 404 confirmation adds a request, so existing installs must opt in.\n if (\n overwriteOptions.detect404 === trueVar ||\n attr(scriptElement, \"detect-404\") == trueText\n ) {\n var detect404 = function () {\n if (\n !/\\b404\\b/.test(doc.title + \" \" + (doc.body && doc.body.textContent))\n )\n return;\n try {\n var request = new window.XMLHttpRequest();\n request.open(\"HEAD\", loc.href, trueVar);\n request.onload = function () {\n if (request.status === 404)\n sendEvent(\"page_404\", {\n url: loc.protocol + \"//\" + definedHostname + loc.pathname,\n status: 404,\n });\n };\n request.send();\n } catch (error) {}\n };\n if (doc.readyState === \"loading\")\n doc.addEventListener(\"DOMContentLoaded\", detect404, falseVar);\n else detect404();\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"simpleanalyticscdn.com\",\n \"queue.\",\n \"cdn_hello_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","protocol","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","keepalive","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","imageUrl","key","fetch","mode","credentials","catch","src","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue","detect404","inlineEvent","element","target","parentNode","isForm","tagName","button","tag","toLowerCase","attributes","submitter","button_text","textContent","trim","title","request","XMLHttpRequest","open","href","status","url","send","readyState"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"hello.source.js","sources":["hello.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch = \"\";\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n var pathKey = path + querySearch;\n if (!path || lastSendPath == pathKey) return;\n\n lastSendPath = pathKey;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"simpleanalyticscdn.com\",\n \"queue.\",\n \"cdn_hello_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","protocol","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","parts","querySearch","shift","pathKey","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue"],"mappings":"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"} \ No newline at end of file diff --git a/dist/latest/latest.dev.js b/dist/latest/latest.dev.js index 7fcde746..1ecd5d5d 100644 --- a/dist/latest/latest.dev.js +++ b/dist/latest/latest.dev.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-15; 9630; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-15; 4ad7; v12) */ /* eslint-env browser */ (function ( @@ -296,7 +296,7 @@ // // Send data via image - var sendData = function (data, callback, onlyThisData, keepalive) { + var sendData = function (data, callback, onlyThisData) { data = onlyThisData ? data : assign(payload, page, data); if (nav.brave && !onlyThisData) data.brave = trueVar; @@ -309,7 +309,7 @@ image.onerror = callback; image.onload = callback; } - var imageUrl = + image.src = fullApiUrl + "/simple.gif?" + Object.keys(data) @@ -326,23 +326,6 @@ .join("&") + "&time=" + Date.now(); - - // Inline events must survive navigation without taking over links or forms. - if (keepalive && window.fetch) { - try { - window - .fetch(imageUrl, { - keepalive: trueVar, - mode: "no-cors", - credentials: "omit", - }) - .catch(function () { - image.src = imageUrl; - }); - return; - } catch (error) {} - } - image.src = imageUrl; }; // Customers can overwrite their hostname, here we check for that @@ -731,7 +714,7 @@ ) { if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata; var callback = isFunction(callbackRaw) ? callbackRaw : function () {}; - var querySearch; + var querySearch = ""; if (isString(pathOverwrite) && pathOverwrite.indexOf("?") > -1) { // keep query from manual path var parts = pathOverwrite.split("?"); @@ -742,9 +725,10 @@ var path = getPath(pathOverwrite); // Don't send the last path again (this could happen when pushState is used to change the path hash or search) - if (!path || lastSendPath == path) return; + var pathKey = path + querySearch; + if (!path || lastSendPath == pathKey) return; - lastSendPath = path; + lastSendPath = pathKey; page.path = path; // v = viewportsizes @@ -922,7 +906,7 @@ var validTypes = ["string", "number"]; - var sendEvent = function (event, metadata, callbackRaw, keepalive) { + var sendEvent = function (event, metadata, callbackRaw) { if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata; var eventIsFunction = isFunction(event); @@ -970,9 +954,7 @@ metadata: stringify(metadata), }), - callback, - undefinedVar, - keepalive + callback ); } }; @@ -1001,71 +983,6 @@ : sendEvent(queue[event]); } } - - var inlineEvent = function (event) { - var element = event.target; - while ( - element && - element !== doc && - (!element.getAttribute || attr(element, "simple-event") === null) - ) - element = element.parentNode; - - if (!element || element === doc) return; - var isForm = element.tagName === "FORM"; - var name = attr(element, "simple-event"); - if (!name || isForm !== (event.type === "submit")) return; - - var metadata = { tag: element.tagName.toLowerCase() }; - var attributes = element.attributes; - for (var i = 0; i < attributes.length; i++) { - var attribute = attributes[i]; - if (attribute.name.indexOf("data-simple-event-") === 0) - metadata[attribute.name.slice(18).replace(/-/g, "_")] = - attribute.value; - } - if (isForm) { - var button = event.submitter; - metadata.button_text = button - ? (button.textContent || button.value || "") - .replace(/\s+/g, " ") - .trim() - .slice(0, 200) - : ""; - } - sendEvent(name, metadata, undefinedVar, trueVar); - }; - - doc.addEventListener("click", inlineEvent, falseVar); - doc.addEventListener("submit", inlineEvent, falseVar); - - // 404 confirmation adds a request, so existing installs must opt in. - if ( - overwriteOptions.detect404 === trueVar || - attr(scriptElement, "detect-404") == trueText - ) { - var detect404 = function () { - if ( - !/\b404\b/.test(doc.title + " " + (doc.body && doc.body.textContent)) - ) - return; - try { - var request = new window.XMLHttpRequest(); - request.open("HEAD", loc.href, trueVar); - request.onload = function () { - if (request.status === 404) - sendEvent("page_404", { - url: loc.protocol + "//" + definedHostname + loc.pathname, - status: 404, - }); - }; - request.send(); - } catch (error) {} - }; - if (doc.readyState === "loading") - doc.addEventListener("DOMContentLoaded", detect404, falseVar); - else detect404(); - } } catch (e) { sendError(e); } diff --git a/dist/latest/latest.js b/dist/latest/latest.js index 51b46912..f57b93ad 100644 --- a/dist/latest/latest.js +++ b/dist/latest/latest.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-15; 986a; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-15; c1d8; v12) */ -!function(h,t,e,n,m){try{var v=undefined,g=!0,y=!1,r="true",a="https:",_="pageview",l="event",i="error",o=h.console,c="doNotTrack",b=h.navigator,s=h.location,w=s.host,u=h.document,p=b.userAgent,f="Not sending request ",d=f+"when ",O=y,E=encodeURIComponent,x=decodeURIComponent,M=JSON.stringify,S=h.addEventListener,k="https://queue."+e,q=u.documentElement||{},A="language",C="Height",D="scroll",$=b.userAgentData,j=D+C,R="offset"+C,H="client"+C,L="pagehide",N="platform",P="platformVersion",T="https://docs.simpleanalytics.com",U=0,I=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),V=h.screen,B=u.currentScript||u.querySelector('script[src*="'+e+'"]');m=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){m("Error in your "+t+" function:",e)},z=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},W=function(t){return"string"==typeof t},G=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},J=function(t,e){return t&&t.getAttribute("data-"+e)},X=function(t){return Array.isArray(t)?t:W(t)&&t.length?t.split(/, ?/):[]},Y=function(t){return t&&t.constructor===Object},Z=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},it=function(t){return"function"==typeof t},ot="namespace",ct=t[ot]||J(B,ot)||"sa",st=function(t,e){var n=h[ct+"_metadata"];Y(n)&&(t=Z(t,n));var r=h[kt];if(!it(r))return kt&&m(kt+" not found, set window."+kt),t;try{return Z(t,r.call(h,Z(t,e)))}catch(a){F("metadata",a)}},ut=t.strictUtm||J(B,"strict-utm")==r,lt=function(i,t){tt=!i&&nt("q")?"":y;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");tt!==y&&0>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},it=function(t){return"function"==typeof t},ot="namespace",ct=t[ot]||L(z,ot)||"sa",st=function(t,e){var n=m[ct+"_metadata"];Z(n)&&(t=K(t,n));var r=m[qt];if(!it(r))return qt&&v(qt+" not found, set window."+qt),t;try{return K(t,r.call(m,K(t,e)))}catch(a){F("metadata",a)}},ut=t.strictUtm||L(z,"strict-utm")==r,lt=function(i,t){tt=!i&&nt("q")?"":_;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");tt!==_&&0> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData, keepalive) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n var imageUrl =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n\n // Inline events must survive navigation without taking over links or forms.\n if (keepalive && window.fetch) {\n try {\n window\n .fetch(imageUrl, {\n keepalive: trueVar,\n mode: \"no-cors\",\n credentials: \"omit\",\n })\n .catch(function () {\n image.src = imageUrl;\n });\n return;\n } catch (error) {}\n }\n image.src = imageUrl;\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw, keepalive) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback,\n undefinedVar,\n keepalive\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n\n var inlineEvent = function (event) {\n var element = event.target;\n while (\n element &&\n element !== doc &&\n (!element.getAttribute || attr(element, \"simple-event\") === null)\n )\n element = element.parentNode;\n\n if (!element || element === doc) return;\n var isForm = element.tagName === \"FORM\";\n var name = attr(element, \"simple-event\");\n if (!name || isForm !== (event.type === \"submit\")) return;\n\n var metadata = { tag: element.tagName.toLowerCase() };\n var attributes = element.attributes;\n for (var i = 0; i < attributes.length; i++) {\n var attribute = attributes[i];\n if (attribute.name.indexOf(\"data-simple-event-\") === 0)\n metadata[attribute.name.slice(18).replace(/-/g, \"_\")] =\n attribute.value;\n }\n if (isForm) {\n var button = event.submitter;\n metadata.button_text = button\n ? (button.textContent || button.value || \"\")\n .replace(/\\s+/g, \" \")\n .trim()\n .slice(0, 200)\n : \"\";\n }\n sendEvent(name, metadata, undefinedVar, trueVar);\n };\n\n doc.addEventListener(\"click\", inlineEvent, falseVar);\n doc.addEventListener(\"submit\", inlineEvent, falseVar);\n\n // 404 confirmation adds a request, so existing installs must opt in.\n if (\n overwriteOptions.detect404 === trueVar ||\n attr(scriptElement, \"detect-404\") == trueText\n ) {\n var detect404 = function () {\n if (\n !/\\b404\\b/.test(doc.title + \" \" + (doc.body && doc.body.textContent))\n )\n return;\n try {\n var request = new window.XMLHttpRequest();\n request.open(\"HEAD\", loc.href, trueVar);\n request.onload = function () {\n if (request.status === 404)\n sendEvent(\"page_404\", {\n url: loc.protocol + \"//\" + definedHostname + loc.pathname,\n status: 404,\n });\n };\n request.send();\n } catch (error) {}\n };\n if (doc.readyState === \"loading\")\n doc.addEventListener(\"DOMContentLoaded\", detect404, falseVar);\n else detect404();\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"simpleanalyticscdn.com\",\n \"queue.\",\n \"cdn_latest_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","protocol","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","keepalive","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","imageUrl","key","fetch","mode","credentials","catch","src","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue","detect404","inlineEvent","element","target","parentNode","isForm","tagName","button","tag","toLowerCase","attributes","submitter","button_text","textContent","trim","title","request","XMLHttpRequest","open","href","status","url","send","readyState"],"mappings":";;CAEA,SACEA,EACAC,EACAC,EAIAC,EACAC,GAEA,IAQE,IAAIC,EAAeC,UACfC,GAAU,EACVC,GAAW,EACXC,EAAW,OACXC,EAAQ,SACRC,EAAe,WACfC,EAAY,QACZC,EAAY,QAGZC,EAAMd,EAAOe,QACbC,EAAa,aACbC,EAAMjB,EAAOkB,UACbC,EAAMnB,EAAOoB,SACbC,EAAmBF,EAAIG,KACvBC,EAAMvB,EAAOwB,SACbC,EAAYR,EAAIQ,UAChBC,EAAa,uBACbC,EAAiBD,EAAa,QAC9BE,EAA2BpB,EAC3BqB,EAAyBC,mBACzBC,EAAyBC,mBACzBC,EAAYC,KAAKD,UAEjBE,EAAuBnC,EAAOoC,iBAC9BC,EAAaC,iBAA0BpC,EACvCqC,EAAkBhB,EAAIgB,iBAAmB,GACzCC,EAAW,WACXC,EAAS,SAETC,EAAS,SACTC,EAAS1B,EAAI2B,cACbC,EAAeH,EAASD,EACxBK,EAAe,SAAWL,EAC1BM,EAAe,SAAWN,EAE1BO,EAAW,WACXC,EAAe,WACfC,EAAsB,kBACtBC,EAAU,mCACVC,EAAQ,EACRC,EACF,sBAAsBC,KAAK7B,KAAe,WAAW6B,KAAK7B,GACxD8B,EAASvD,EAAOuD,OAIhBC,EACFjC,EAAIkC,eAAiBlC,EAAImC,cAAc,gBAAkBxD,EAAU,MAOrEE,EAAO,WAEL,IAAIuD,EAAO,GAAGC,MAAMC,KAAKC,WAOzB,OAJAH,EAAKI,QAAQ,qBAINC,SAASC,UAAUC,MAAML,KAAK/C,EAAIV,KAAMU,EAAK6C,IAGtD,IAAIQ,EAAiB,SAAUC,EAAMC,GACnCjE,EAAK,iBAAmBgE,EAAO,aAAcC,IAG3CC,EAAU,SAAUC,EAAKC,GAC3B,OAAOC,OAAOR,UAAUS,eAAeb,KAAKU,EAAKC,IAG/CG,EAAW,SAAUC,GACvB,MAAwB,iBAAVA,GAGZC,EAAc,SAAUC,GAC1B,OAAOA,EAAKC,QAAQ,sBAAuB,SAGzCC,EAAO,SAAUxB,EAAeyB,GAClC,OAAOzB,GAAiBA,EAAc0B,aAAa,QAAUD,IAG3DE,EAA+B,SAAUC,GAC3C,OAAOC,MAAMC,QAAQF,GACjBA,EACAT,EAASS,IAAQA,EAAIG,OACnBH,EAAII,MAAM,OACV,IAGJC,EAAW,SAAUC,GACvB,OAAOA,GAAUA,EAAOC,cAAgBlB,QAGtCmB,EAAS,WAGX,IAFA,IAAIC,EAAK,GACLC,EAAMhC,UACDiC,EAAQ,EAAGA,EAAQD,EAAIP,OAAQQ,IAAS,CAC/C,IAAIC,EAAaF,EAAIC,GACrB,GAAIN,EAASO,GACX,IAAK,IAAIC,KAAWD,EACd1B,EAAQ0B,EAAYC,KACtBJ,EAAGI,GAAWD,EAAWC,IAKjC,OAAOJ,GAGLK,EAAWlG,EAAOmG,YAClBC,EAAcF,GAAYzB,OAAO4B,KAAKpG,GAAkBsF,OAG5DtF,EAAmB2F,EAAO3F,EAAkBiG,GAExCE,GAAahG,EAAK,WAAYH,GAGlC,IA+EIqG,GA/EAC,GAAgBpB,EAClBlF,EAAiBsG,eAAiBvB,EAAKxB,EAAe,mBAGpDgD,GAAwB,SAAUC,GAEpC,OAGgB,IAFdF,GAAcG,OAAO,SAAU5B,GAC7B,OAAO,IAAI6B,OAAO,IAAMF,GAAoBnD,KAAKwB,KAChDS,QAIHqB,GAAMC,KAAKD,IAEXE,GAAO,WACT,IAAIC,EAAe/G,EAAOgH,QAAUhH,EAAOiH,SACvCC,EAAY,CAAC,MAAQ,KAAO,KAAO,KAAO,KAC1CC,EAAY,SAEhB,IACE,OAAOD,EAAUnC,QAAQoC,EAAW,SAAUC,GAC5C,OACEA,EACCL,EAAaM,gBAAgB,IAAIC,WAAW,IAAI,GAC9C,IAAOF,EAAI,GACdG,SAAS,MAEb,MAAOlD,GACP,OAAO6C,EAAUnC,QAAQoC,EAAW,SAAUC,GAC5C,IAAII,EAAqB,GAAhBC,KAAKC,SAAiB,EAE/B,OADMN,EAAI,EAAII,EAAS,EAAJA,EAAW,GACrBD,SAAS,QAKpBI,GAAa,SAAUC,GACzB,MAAsB,mBAARA,GAIZC,GAAgB,YAChBC,GACF7H,EAAiB4H,KACjB7C,EAAKxB,EAAeqE,KAq3BxB,KAl3BME,GAAiB,SAAUC,EAAUC,GACvC,IAAIC,EAAiBlI,EAAO8H,GAAY,aACpCrC,EAASyC,KAAiBF,EAAWpC,EAAOoC,EAAUE,IAC1D,IAAIC,EAA4BnI,EAAOoI,IACvC,IAAKT,GAAWQ,GAKd,OAJIC,IACFhI,EACEgI,GAAoB,0BAA4BA,IAE7CJ,EAET,IACE,OAAOpC,EACLoC,EACAG,EAA0BtE,KAAK7D,EAAQ4F,EAAOoC,EAAUC,KAE1D,MAAO5D,GACPF,EAAe,WAAYE,KAU3BgE,GACFpI,EAAiBoI,WACjBrD,EAAKxB,EAAe,eAAiB/C,EAInC6H,GAAiB,SAAUC,EAAcC,GAC3ClC,IAAKiC,GAAgB/B,GAAsB,KAAO,GAAKhG,EACvD,IAAIiI,GAAKD,GAAmBrH,EAAIuH,QAC7B9E,MAAM,GACN4B,MAAM,KACNkB,OAAO,SAAUiC,GAChB,IAAIC,EAAID,EAASE,QAAQ,KACrBvC,KAAM9F,GAAgB,EAAJoI,GAASD,EAAS/E,MAAMgF,EAAI,KAChDtC,KAAMA,GAAI,IAAM,IAAMqC,EAAS/E,MAAM,EAAGgF,IAE1C,IAAIE,EAASP,IAAiB/B,GAAsB,MAEhDuC,EAAkBC,GAAYC,IAAIpE,GAAaqE,KAAK,KACpDC,EAAQL,EACR,KAAOC,EAAkB,KACzB,YACCV,GAAY,GAAK,KAClB,yCACCA,GAAY,GAAK,QAClB,IACAU,EACA,KACJ,OAAID,IAAWE,GAAYzD,OAAe/E,EAInC,IAAImG,OAAOwC,EAAO,KAAK7F,KAAKqF,KAEpCO,KAAK,KAGR,OADA5C,GAAIA,IAAKjG,EACFoI,GAAKpI,GA+BV+I,GAAiBtB,GAAY,UACjC,GAAI9H,EAAOoJ,KAAmB7I,EAAS,OAAOH,EAAKsB,EAAa,SAChE1B,EAAOqJ,gBAAkB9I,EACzBP,EAAOoJ,IAAkB7I,EAOzB,IAAI+I,GAAW,SAAUrB,EAAMsB,EAAUC,EAAcC,GACrDxB,EAAOuB,EAAevB,EAAOrC,EAAO8D,GAASC,GAAM1B,GAE/ChH,EAAI2I,QAAUJ,IAAcvB,EAAK2B,MAAQrJ,GACzCU,EAAI4I,qBAAuBL,IAAcvB,EAAK6B,KAAOvJ,GAGzD,IAAIwJ,EAAQ,IAAIC,MACZT,IACFQ,EAAME,QAAUV,EAChBQ,EAAMG,OAASX,GAEjB,IAAIY,EACF9H,EACA,eACAoC,OAAO4B,KAAK4B,GACTvB,OAAO,SAAU0D,GAChB,OAAOnC,EAAKmC,IAAQ/J,IAErB4I,IAAI,SAAUmB,GACb,OACEvI,EAAuBuI,GACvB,IACAvI,EAAuBoG,EAAKmC,MAG/BlB,KAAK,KACR,SACArC,KAAKD,MAGP,GAAI6C,GAAazJ,EAAOqK,MACtB,IAUE,YATArK,EACGqK,MAAMF,EAAU,CACfV,UAAWlJ,EACX+J,KAAM,UACNC,YAAa,SAEdC,SAAM,WACLT,EAAMU,IAAMN,IAGhB,MAAO9F,IAEX0F,EAAMU,IAAMN,GAIVO,GACFzK,EAAiB0K,UAAY3F,EAAKxB,EAAe,YAC/CoH,GAAkBF,IAAuBrJ,EAEzCwJ,GAAc,CAChBC,QAktBJ,gBAjtBIH,SAAUC,IASZzK,EAAY,SAAU4K,GACpBA,EAAiBA,EAAeC,MAC5BD,EAAiB,IAAMA,EAAeC,MACtCD,EACJ3K,EAAK2K,GACLzB,GACE1D,EAAOiF,GAAa,CAClBI,KAAMpK,EACNwD,MAAO0G,EACPG,KAAM/J,EAAIgK,WAEZ9K,EACAE,IAMJ4B,EACEtB,EACA,SAAUuK,GACJA,EAAMC,WAA+C,EAAnCD,EAAMC,SAASxC,QAAQ3I,IAC3CC,EAAUiL,EAAME,UAGpB9K,GAOF,IAwDI+K,GAxDAC,GAAQ5E,KAER6E,GAAW,EAOXnB,GAAOrK,EAAiBqK,MAAQtF,EAAKxB,EAAe,QAGpDkI,MAhMsBC,GAgMC1L,EAAiByL,cA/LvBC,GAgMjB1L,EAAiByL,WACjB1G,EAAKxB,EAAe,eAAiB/C,GACrCuE,EAAKxB,EAAe,aAAe/C,GACnCuE,EAAKxB,EAAe,gBAAkB/C,EAGtCmL,KACqC,SAAvC5G,EAAKxB,EAAe,iBACpBvD,EAAiB2L,cAAgBpL,GAI/BqL,GACF5L,EAAiB6L,UACjB9G,EAAKxB,EAAe,cACpBsE,GAAY,IAAMlH,EAGhBmL,GAAc5G,EAChBlF,EAAiB8L,aAAe/G,EAAKxB,EAAe,iBAIlDwF,GAAc7D,EAChBlF,EAAiB+I,aAAehE,EAAKxB,EAAe,iBAIlDwI,GAAqB7G,EACvBlF,EAAiB+L,oBACfhH,EAAKxB,EAAe,yBAIpByI,GACFhM,EAAiBgM,gBAAkBjH,EAAKxB,EAAe,mBAGrD4E,GACFnI,EAAiBmI,mBACjBpD,EAAKxB,EAAe,sBAItB,IAEE+H,GAAW/E,GAAsB,KAC7B0F,KAAKC,iBAAiBC,kBAAkBC,SACxChM,EACJ,MAAOgE,IACPjE,EAAKiE,IAOP,IAAIiI,GAAUtM,EAAOsM,QACjBC,GACFtL,EAAIuL,WACJxM,EAAOyM,aACPzM,EAAO0M,aACP1M,EAAO2M,UACNL,KAAYA,GAAQM,QACrB5M,EAAO6M,YACP7M,EAAO8M,MACPzJ,GACAoE,KAAKC,UAAYD,KAAKC,SAGpBqF,GACFvG,GAAsB,MAAQA,GAAsB,QAElD+F,KAAK1B,GAAY0B,IAAMhM,GAE3B,IAAImJ,GAAU9D,EAAOiF,GAAa,CAEhCmC,GAAIxG,GAAsB,MAAQ/E,EAAYpB,EAE9CK,MAAOS,EAAImB,UAAY5B,EACvB6K,SAAUA,GACV0B,QAASF,GAAqBjG,KAASzG,EAGvC6M,WAAY1G,GAAsB,MAAQM,KAASzG,IA0BrD,GAvBAqJ,GAAQyD,IAAM3M,EAIVmC,IACF+G,GAAQ0D,OAASzK,EAAOyK,OACxB1D,GAAQ2D,OAASpL,EAAUU,EAAO0K,SAS/B9L,EAAI+L,SAASlN,EAAK,4CAInBwK,KAAoBvJ,IACtBqI,GAAQ6D,kBAAoBlM,IAGzBqK,IAAc1K,KAAcC,GAA0B,KAAnBA,EAAID,GAC1C,OAAOZ,EACLuB,EAAiBX,EAAa,oBAAsBmC,EAAU,SAK7B,GAAlC9B,EAAiBwH,QAAQ,OACxB,aAAavF,KAAKjC,IACnBqJ,IAEDtK,EACE,mBACEiB,EACA,SACA8B,EACA,0BAON,IACIqK,GA0DAC,GA3DA9D,GAAO,GAGP+D,GAAc,WAKhB,OAFEzN,EAAiB0N,UAAY3I,EAAKxB,EAAe,aAGzBjC,EAAIoM,UAAY,IACrC5I,QAAQ1D,EAAkBuJ,IAC1B7F,QAAQ,sDAAuD,MAC/DA,QAAQ,YAAa,OAAS1E,GAKjCsN,GAAWD,KAOXE,GAAW,EAEXC,GAAc,SAAUC,EAAIC,GAC9B,GAAKhB,GAAL,CAEA,IAAIiB,EAASpI,EAAOiF,GAAa,CAC/BI,KAAM,SACNgD,YAAaF,EAAOD,EAAKpE,GAAQuD,UAenC,GAXIzG,GAAsB,OACxBwH,EAAOE,SAAWzG,KAAK0G,OAAOvH,KAAQ4E,GAAQoC,IAphBnC,MAshBbA,GAAW,EACXpC,GAAQ5E,KAGJJ,GAAsB,UACxBwH,EAAOvC,SAAWhE,KAAK2G,IAAI,EAAG3C,GAAU4C,OAGtCN,IAAS9M,EAAIqN,WAEfhF,GAAS0E,EAAQ3N,EAAcE,QAE/B,IACEU,EAAIqN,WAAWC,KAAKtN,EAApBA,CAAyBoB,EAAa,UAAWJ,EAAU+L,IAC3D,MAAOQ,GAEPlF,GAAS0E,EAAQ3N,EAAcE,MAMrC4B,EACE,mBACA,WACMZ,EAAIkN,QACA,KAAOzL,KAAYhD,GAAS6N,KAClCJ,GAAc7G,MACTgH,IAAYhH,KAAQ6G,IAE7BjN,GAGF2B,EAAqBa,EAAU6K,GAAarN,GAE5C,IAAIkO,GAAOnN,EAAImN,MAAQ,GACnBL,GAAW,WACb,IACE,IAAIM,EAAuBpM,EAAgBQ,IAAiB,EACxD6L,EAASnH,KAAK2G,IAChBM,GAAK7L,IAAiB,EACtB6L,GAAK5L,IAAiB,EACtBP,EAAgBQ,IAAiB,EACjCR,EAAgBM,IAAiB,EACjCN,EAAgBO,IAAiB,GAEnC,OAAO2E,KAAKoH,IACV,IAKI,EAJJpH,KAAK0G,MACF,MAAQ5L,EAAgBuM,WAAa,GAAKH,GACzCC,EACA,IAGN,MAAOvK,IAEP,OADAjE,EAAKiE,IACE,IAIXlC,EAAqB,OAAQ,WAC3BsJ,GAAW4C,KACXlM,EACEO,EACA,WACM+I,GAAW4C,OAAY5C,GAAW4C,OAExC7N,KAQJ,IAgCIuO,GAoCAC,GAAUC,GApEVC,GAAU,SAAUC,GACtB,IAAIjE,EAAO,GAIX,IACEA,EAAOiE,GAAapN,EAAuBZ,EAAIgK,UAC/C,MAAO9G,IACPjE,EAAKiE,IAGP,IAAI+K,EAAyBpP,EAAOiM,IACpC,GAAItE,GAAWyH,GACb,IACElE,EAAOkE,EAAuBvL,KAAK7D,EAAQ,CAAEkL,KAAMA,KAAWA,EAC9D,MAAO7G,IACPF,EAAe,OAAQE,IAK3B,IA7ZiB,SAAU6G,GAC3B,IAAK,IAAItC,KAAKmD,GAAa,CACzB,IAAIsD,EAAgBtD,GAAYnD,GAChC,GAAKyG,EAAL,CAGA,IAAIC,EA9OI,KA+OND,EAAc,GAAcA,EA/OtB,IA+O8CA,EAEtD,GACEC,IAAepE,GACf,IAAIvE,OACF,IAAM9B,EAAYyK,GAAYvK,QAAQ,SAAU,QAAU,IAC1D,KACAzB,KAAK4H,GAEP,OAAO3K,GAEX,OAAOC,EA2YH+O,CAAarE,GAQjB,MAFY,QAARZ,IAAkBnJ,EAAIqO,OAAMtE,GAAQ/J,EAAIqO,KAAKhK,MAAM,KAAK,IAErD0F,EAPL9K,EAAKuB,EAAiB,YAAcuJ,IAgDpCuE,GAAW,SACbC,EACAC,EACA3H,EACA4H,IAEKA,GAAejI,GAAWK,KAAW4H,EAAc5H,GACxD,IACI6H,EAGEC,EAJFvG,EAAW5B,GAAWiI,GAAeA,EAAc,aAEnDjL,EAASgL,KAAgD,EAA9BA,EAAc9G,QAAQ,OAGnD8G,GADIG,EAAQH,EAAcnK,MAAM,MACVuK,QACtBF,EAAc,IAAMC,EAAM5G,KAAK,MAGjC,IAAIgC,EAAOgE,GAAQS,GAGnB,GAAKzE,GAAQsC,IAAgBtC,EAA7B,CAEAsC,GAAetC,EACfvB,GAAKuB,KAAOA,EAGR1E,GAAsB,OACxBmD,GAAKqG,eACHvI,KAAK2G,IAAI7L,EAA2B,aAAK,EAAGvC,EAAOiQ,YAAc,IACjE,KACFtG,GAAKuG,gBACHzI,KAAK2G,IACH7L,EAAgBQ,IAAiB,EACjC/C,EAAOmQ,aAAe,IACnB,MAIL3J,GAAsB,MACpBvF,EAAIuB,KAAWmH,GAAKnH,GAAYvB,EAAIuB,IAItCe,GAAUiD,GAAsB,QAClCmD,GAAKyG,aAAe7M,EAAO8M,MAC3B1G,GAAK2G,cAAgB/M,EAAOqL,QAI9B,IAII2B,EAJAC,EAAOxQ,EAAOyQ,YACdC,EAAiB,aAIrB,IACEH,EAAsBC,EAAKG,iBAAiBD,GAAgB,GAAGzF,KAC/D,MAAO5G,IACPjE,EAAKiE,IAGP4K,GAAgBsB,GAC+C,EAA3D,CAAC,SAAU,gBAAgB1H,QAAQ0H,GAGnCC,GACAA,EAAKE,KACwC,EAA7C,CAAC,EAAG,GAAG7H,QAAQ2H,EAAKE,GAAgBzF,MAGxC,IAAI2F,EAA0BjD,GAC1BA,GAASnI,MA3vBH,KA2vBgB,GACtBnF,EACJ2O,GAAWrB,IACgD,EAAvD3B,GAAmBnD,QAAQ+H,IAC3BA,GAA2BvP,EAC3Bb,EAGJmJ,GAAKkH,OACH,QAAQvN,KAAKoK,OAAkBgC,GAAeT,GAC1CzO,GACCwO,GAEPhH,EAAWD,GAAeC,EAAU,CAClCiD,KAAMtK,EACNuK,KAAMvB,GAAKuB,OAGb,IAAI4F,EAAsB,WACxBlP,EAA2BrB,EAC3B,IAAIwQ,EACFrB,GAAeT,KAAkBzI,GAAsB,MA7H1C,SACjBkJ,EACAsB,EACAhC,EACAtG,EACAV,EACAuB,GAEImG,GAAa7B,GAAY,GAAKnE,GAAQuD,QAAS1M,GAC/CwM,KAAoBrD,GAAQuD,QAAUnG,MAE1C,IAAImK,EAAcrG,GAAkBsE,KAChCgC,EAAQ5I,GAAe0I,EAAkBtI,GAE7CY,GACE,CACEwE,GAAIpE,GAAQuD,QACZhC,KAAMtK,EACNgN,UAAWqD,GAAoBhC,EAAWrB,GAAW,KACrDuD,MAAOA,EACP5K,EAAGA,GAEH0B,SAAU/F,EAAU+F,IAEtBuB,GAGFwF,GAAmBpB,GACnBA,GAAWsD,EAEX7N,IAgGE+N,CACEzB,EACAqB,EACA/B,GACAa,EACA7H,EACAuB,IAIJ,GAAK3H,EAmBHkP,SAjBA,IACMnO,GAAUgF,GAAWhF,EAAOyO,sBAC9BzO,EACGyO,qBAAqB,CAACnO,EAAcC,IACpCmO,KAAK,SAAUC,GACd5H,GAAQ6H,QAAUD,EAAkBrO,GACpCyG,GAAQ8H,WAAaF,EAAkBpO,GACvC4N,MAEDtG,SAAMsG,GAETA,IAEF,MAAOtC,GACPsC,OAWFW,GAAMzR,EAAO0R,QACbC,GAAeF,GAAMA,GAAIG,UAAYvR,EACrCwR,GAAM7R,EAAO8R,cACbC,GAAgB,YAIhBnG,IAAe+F,IAAgBK,OAASH,KAqB1CJ,GAAIG,WAnBEK,GAAOR,GADiBxG,GAoBA8G,IAlBrB,WACL,IAEI3G,EAFAtF,EAAMhC,UACNoO,EAAKD,GAAK/N,MAAMiO,KAAMrM,GAY1B,OAVI6B,GAAWqK,OACb5G,EAAQ,IAAI4G,MAAM/G,KAIlBG,EAAQ7J,EAAI6Q,YAAY,UAClBC,UAAUpH,GAAM1K,EAASA,GAEjC6K,EAAMtH,UAAYgC,EAClB+L,GAAIzG,GACG8G,IAMX/P,EACE4P,GACA,WACEtC,GAAS,IAEXjP,GAGF2B,EACE,WACA,WACEsN,GAAS,IAEXjP,IAKAoL,IAAuB,QAARtB,IAAkB,iBAAkBtK,GACrDmC,EACE,aACA,WACEsN,GAAS,IAEXjP,GAIAoL,IAAa6D,KAEjBzP,EAAOsS,YAAc,SAAUpH,EAAMlD,EAAUuB,GAC7CkG,GAAS,EAAGvE,EAAMlD,EAAUuB,IAQ9B,IAAIgJ,GAAa,CAAC,SAAU,UAExBC,GAAY,SAAUpH,EAAOpD,EAAU4H,EAAanG,IACjDmG,GAAejI,GAAWK,KAAW4H,EAAc5H,GAExD,IAAIyK,EAAkB9K,GAAWyD,GAC7B7B,EAAW5B,GAAWiI,GAAeA,EAAc,aACnD8C,SAAmBtH,EAEvB,GAAImH,GAAW1J,QAAQ6J,GAAa,IAAMD,EAExC,OADAtO,EAAe0H,GAAmBjL,EAAY,aAAe8R,GACtDnJ,IAGT,IACE,GAAIkJ,EAAiB,CACnB,IAAIE,EAAcvH,IAClB,GAAImH,GAAW1J,eAAe8J,GAAe,EAK3C,OAJAxO,EACE0H,GACAT,EAAQ,uBAAyBuH,GAE5BpJ,IAET6B,EAAQuH,GAEV,MAAOtO,IAEP,OADAF,EAAe0H,GAAmBxH,IAC3BkF,IAGT6B,GAAS,GAAKA,GAAOrG,QAAQ,eAAgB,KAAKA,QAAQ,WAAY,IAEtE,IAAI6N,EAAc,CAAE3H,KAAMrK,EAAWwK,MAAOA,GACxCyH,GAAa5D,IAAiB7L,EAAQ,EAE1C4E,EAAWD,GAAeC,EAAU4K,GAEhCxH,GACF9B,GACE1D,EAAOgN,EAAa,CAClB9E,GAAIhH,KACJoK,MAAO5I,IAAgBuK,GACvBlF,UACGkF,GAAa7D,KAAaxI,GAAsB,KAC7CuI,GACA,KAEN/G,SAAU/F,EAAU+F,KAEtBuB,EACAlJ,EACAoJ,IAKFqJ,GAAmB,SAAU1H,EAAOpD,EAAUuB,GAChDiJ,GAAUpH,EAAOpD,EAAUuB,IAIxBvJ,EAAO6L,MACV7L,EAAO6L,IAAqBiH,IAE9B,IAAIC,GAAY/S,EAAO6L,IAGnBmH,GAAQD,IAAaA,GAAUtK,EAAIsK,GAAUtK,EAAI,GAMrD,IAAK,IAAI2C,MAHTpL,EAAO6L,IAAqBiH,GAGVE,GACZ1O,EAAQ0O,GAAO5H,MACjB/F,MAAMC,QAAQ0N,GAAM5H,KAChBoH,GAAUtO,MAAM,KAAM8O,GAAM5H,KAC5BoH,GAAUQ,GAAM5H,MAIxB,IA0CM6H,GA1CFC,GAAc,SAAU9H,GAE1B,IADA,IAAI+H,EAAU/H,EAAMgI,OAElBD,GACAA,IAAY5R,KACV4R,EAAQjO,cAAkD,OAAlCF,EAAKmO,EAAS,kBAExCA,EAAUA,EAAQE,WAEpB,GAAKF,GAAWA,IAAY5R,EAA5B,CACA,IAAI+R,EAA6B,SAApBH,EAAQI,QACjBnP,EAAOY,EAAKmO,EAAS,gBACzB,GAAK/O,GAAQkP,IAA2B,WAAflI,EAAMH,MAA/B,CAIA,IAFA,IASMuI,EATFxL,EAAW,CAAEyL,IAAKN,EAAQI,QAAQG,eAClCC,EAAaR,EAAQQ,WAChB/K,EAAI,EAAGA,EAAI+K,EAAWpO,OAAQqD,IAAK,CAC1C,IAAI3D,EAAY0O,EAAW/K,GAC0B,IAAjD3D,EAAUb,KAAKyE,QAAQ,wBACzBb,EAAS/C,EAAUb,KAAKR,MAAM,IAAImB,QAAQ,KAAM,MAC9CE,EAAU0G,OAEZ2H,IACEE,EAASpI,EAAMwI,UACnB5L,EAAS6L,YAAcL,GAClBA,EAAOM,aAAeN,EAAO7H,OAAS,IACpC5G,QAAQ,OAAQ,KAChBgP,OACAnQ,MAAM,EAAG,KACZ,IAEN4O,GAAUpO,EAAM4D,EAAU3H,EAAcE,MAG1CgB,EAAIa,iBAAiB,QAAS8Q,GAAa1S,GAC3Ce,EAAIa,iBAAiB,SAAU8Q,GAAa1S,GAI1CP,EAAiBgT,YAAc1S,GAC/ByE,EAAKxB,EAAe,eAAiB/C,IAEjCwS,GAAY,WACd,GACG,UAAU3P,KAAK/B,EAAIyS,MAAQ,KAAOzS,EAAImN,MAAQnN,EAAImN,KAAKoF,cAG1D,IACE,IAAIG,EAAU,IAAIjU,EAAOkU,eACzBD,EAAQE,KAAK,OAAQhT,EAAIiT,KAAM7T,GAC/B0T,EAAQ/J,OAAS,WACQ,MAAnB+J,EAAQI,QACV7B,GAAU,WAAY,CACpB8B,IAAKnT,EAAImB,SAAW,KAAOsI,GAAkBzJ,EAAIgK,SACjDkJ,OAAQ,OAGdJ,EAAQM,OACR,MAAOlQ,OAEY,YAAnB9C,EAAIiT,WACNjT,EAAIa,iBAAiB,mBAAoB6Q,GAAWzS,GACjDyS,MAEP,MAAOzE,IACPrO,EAAUqO,IAhNY,IAAUvD,GACxBgH,GAtoBkBtG,GAnN9B,CA2iCE3L,OACA,uBACA"} \ No newline at end of file +{"version":3,"file":"latest.source.js","sources":["latest.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch = \"\";\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n var pathKey = path + querySearch;\n if (!path || lastSendPath == pathKey) return;\n\n lastSendPath = pathKey;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"simpleanalyticscdn.com\",\n \"queue.\",\n \"cdn_latest_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","protocol","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","parts","querySearch","shift","pathKey","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue"],"mappings":"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"} \ No newline at end of file diff --git a/dist/latest/light.js b/dist/latest/light.js index 807f3d77..b9c0174b 100644 --- a/dist/latest/light.js +++ b/dist/latest/light.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-15; a4f9; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-15; 4572; v12) */ -!function(l,e,t,f){try{var u=undefined,n="https:",r=l.console,a="doNotTrack",m=l.navigator,p=l.location,g=p.host,i=l.document,o=m.userAgent,c="Not sending request ",h=!1,s=encodeURIComponent,d=decodeURIComponent,v=JSON.stringify,y=l.addEventListener,_="https://queue."+t,b=(i.documentElement,"language"),w=m.userAgentData,O="platform",S="platformVersion",j="https://docs.simpleanalytics.com",k=/(bot|spider|crawl)/i.test(o)&&!/(cubot)/i.test(o),E=i.currentScript||i.querySelector('script[src*="'+t+'"]');f=function(){var e=[].slice.call(arguments);return e.unshift("Simple Analytics:"),Function.prototype.apply.call(r.warn,r,e)};var q=function(e){return"string"==typeof e},x=function(e,t){return e&&e.getAttribute("data-"+t)},A=function(){for(var e,t,n,r={},a=arguments,i=0;i>e/4).toString(16)})}catch(r){return e.replace(n,function(e){var t=16*Math.random()|0;return(e<2?t:3&t|8).toString(16)})}},N=function(e){return"function"==typeof e},R="namespace",U=e[R]||x(E,R)||"sa",V=e.strictUtm||"true"==x(E,"strict-utm"),B=U+"_loaded";if(1==l[B])return f(c+"twice");l.sa_event_loaded=!0,l[B]=!0;var C,T=function(t,e,n,r){t=n?t:A(J,M,t),m.brave&&!n&&(t.brave=!0),m._duckduckgoloader_&&!n&&(t.duck=!0);var a=new Image,i=_+"/simple.gif?"+Object.keys(t).filter(function(e){return t[e]!=u}).map(function(e){return s(e)+"="+s(t[e])}).join("&")+"&time="+Date.now();a.src=i},F=e.hostname||x(E,"hostname"),H=F||g,z={version:"cdn_light_12",hostname:H};e.mode||x(E,"mode");try{C=Intl.DateTimeFormat().resolvedOptions().timeZone}catch(X){f(X)}k&&(z.bot=!0);var J=A(z,{ua:o,https:p.protocol==n,timezone:C,page_id:I(),session_id:I()});if(J.sri=!1,w&&(J.mobile=w.mobile,J.brands=v(w.brands)),H!==g&&(J.hostname_original=g),a in m&&"1"==m[a])return f("Not sending request when "+a+" is enabled. See "+j+"/dnt");-1!=g.indexOf(".")&&!/^[0-9.:]+$/.test(g)||F||f("Set hostname on "+g+". See "+j+"/overwrite-domain-name");var L,M={},P=(e.referrer||x(E,"referrer")||i.referrer||"").replace(g,H).replace(/^https?:\/\/((m|l|w{2,3}([0-9]+)?)\.)?([^?#]+)(.*)$/,"$4").replace(/^([^/]+)$/,"$1")||u,Z=function(e,t){var n=A(z,{type:"append",original_id:t?e:J.page_id});if(t||!m.sendBeacon)T(n,0,!0);else try{m.sendBeacon.bind(m)(_+"/append",v(n))}catch(r){T(n,0,!0)}};y("pagehide",Z,!1);var G,K,Q=function(e){var t="";try{t=e||d(p.pathname)}catch(X){f(X)}return t},W=function(e,t,n,r,a,i){e&&Z(""+J.page_id,!0),J.page_id=I();var o,c=H+Q(),s=(o=t,(r||p.search).slice(1).split("&").filter(function(e){return!o&&new RegExp("^((utm_)"+(V?"":"?")+"(source|medium|content|term|campaign)"+(V?"":"|ref")+")=","i").test(e)}).join("&")||u);T({id:J.page_id,type:"pageview",referrer:!t||n?P:null,query:s}),P=c,0};!function(e,t,n,r){!r&&N(n)&&(r=n);var a,i;N(r);q(t)&&-1>e/4).toString(16)})}catch(r){return e.replace(n,function(e){var t=16*Math.random()|0;return(e<2?t:3&t|8).toString(16)})}},N=function(e){return"function"==typeof e},R="namespace",U=e[R]||x(E,R)||"sa",V=e.strictUtm||"true"==x(E,"strict-utm"),B=U+"_loaded";if(1==f[B])return m(c+"twice");f.sa_event_loaded=!0,f[B]=!0;var C,T=function(t,e,n){t=n?t:A(J,M,t),g.brave&&!n&&(t.brave=!0),g._duckduckgoloader_&&!n&&(t.duck=!0),(new Image).src=_+"/simple.gif?"+Object.keys(t).filter(function(e){return t[e]!=u}).map(function(e){return s(e)+"="+s(t[e])}).join("&")+"&time="+Date.now()},F=e.hostname||x(E,"hostname"),H=F||h,z={version:"cdn_light_12",hostname:H};e.mode||x(E,"mode");try{C=Intl.DateTimeFormat().resolvedOptions().timeZone}catch(X){m(X)}k&&(z.bot=!0);var J=A(z,{ua:o,https:p.protocol==n,timezone:C,page_id:I(),session_id:I()});if(J.sri=!1,w&&(J.mobile=w.mobile,J.brands=l(w.brands)),H!==h&&(J.hostname_original=h),a in g&&"1"==g[a])return m("Not sending request when "+a+" is enabled. See "+j+"/dnt");-1!=h.indexOf(".")&&!/^[0-9.:]+$/.test(h)||F||m("Set hostname on "+h+". See "+j+"/overwrite-domain-name");var L,M={},P=(e.referrer||x(E,"referrer")||i.referrer||"").replace(h,H).replace(/^https?:\/\/((m|l|w{2,3}([0-9]+)?)\.)?([^?#]+)(.*)$/,"$4").replace(/^([^/]+)$/,"$1")||u,Z=function(e,t){var n=A(z,{type:"append",original_id:t?e:J.page_id});if(t||!g.sendBeacon)T(n,0,!0);else try{g.sendBeacon.bind(g)(_+"/append",l(n))}catch(r){T(n,0,!0)}};y("pagehide",Z,!1);var G,K,Q=function(e){var t="";try{t=e||d(p.pathname)}catch(X){m(X)}return t},W=function(e,t,n,r,a,i){e&&Z(""+J.page_id,!0),J.page_id=I();var o,c=H+Q(),s=(o=t,(r||p.search).slice(1).split("&").filter(function(e){return!o&&new RegExp("^((utm_)"+(V?"":"?")+"(source|medium|content|term|campaign)"+(V?"":"|ref")+")=","i").test(e)}).join("&")||u);T({id:J.page_id,type:"pageview",referrer:!t||n?P:null,query:s}),P=c,0};!function(e,t,n,r){!r&&N(n)&&(r=n);N(r);var a,i="";q(t)&&-1> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n if (ignore) return falseVar;\n // eslint-disable-next-line no-redeclare\n var regex =\n \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \")=\";\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n return q || undefinedVar;\n };\n\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData, keepalive) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n var imageUrl =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n\n image.src = imageUrl;\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n\n\n\n\n\n\n\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n // eslint-disable-next-line no-redeclare\n var bot = isBotAgent;\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n\n\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n sameSite = referrer\n ? referrer.split(slash)[0] == locationHostname\n : falseVar;\n\n\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n\n\n pageview();\n\n } catch (e) {\n warn(e);\n }\n})(\n window,\n {},\n \"simpleanalyticscdn.com\",\n \"queue.\",\n \"cdn_light_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","warn","undefinedVar","undefined","https","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","protocol","language","documentElement","uaData","userAgentData","platformText","platformVersionText","docsUrl","isBotAgent","test","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","isString","string","attr","attribute","getAttribute","assign","obj","prop","object","to","arg","index","length","nextSource","constructor","Object","nextKey","hasOwnProperty","settings","sa_settings","logSettings","keys","Date","now","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","replace","c","getRandomValues","Uint8Array","toString","error","r","Math","random","isFunction","func","namespaceText","namespace","strictUtm","loadedVariable","sa_event_loaded","timezone","sendData","data","callback","onlyThisData","keepalive","payload","page","brave","_duckduckgoloader_","duck","image","Image","imageUrl","filter","key","map","join","src","overwrittenHostname","hostname","definedHostname","basePayload","version","mode","Intl","DateTimeFormat","resolvedOptions","timeZone","bot","ua","page_id","session_id","sri","mobile","brands","hostname_original","indexOf","lastSendPath","referrer","sendOnLeave","id","push","append","type","original_id","sendBeacon","bind","e","sameSite","userNavigated","getPath","overwrite","path","pathname","sendPageView","isPushState","deleteSourceInfo","search","metadata","ignoreSource","currentPage","query","split","keyValue","RegExp","pages","pathOverwrite","callbackRaw","querySearch","parts","shift","performaceEntryType","perf","performance","navigationText","getEntriesByType","triggerSendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","pageview"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"light.source.js","sources":["light.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n\n var collectMetricByString = function (metricAbbreviation) {\n // eslint-disable-next-line no-unreachable\n return true;\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n if (ignore) return falseVar;\n // eslint-disable-next-line no-redeclare\n var regex =\n \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \")=\";\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n return q || undefinedVar;\n };\n\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n\n\n\n\n\n\n\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n // eslint-disable-next-line no-redeclare\n var bot = isBotAgent;\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n\n\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch = \"\";\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n var pathKey = path + querySearch;\n if (!path || lastSendPath == pathKey) return;\n\n lastSendPath = pathKey;\n page.path = path;\n\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n sameSite = referrer\n ? referrer.split(slash)[0] == locationHostname\n : falseVar;\n\n\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n\n\n pageview();\n\n } catch (e) {\n warn(e);\n }\n})(\n window,\n {},\n \"simpleanalyticscdn.com\",\n \"queue.\",\n \"cdn_light_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","warn","undefinedVar","undefined","https","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","protocol","language","documentElement","uaData","userAgentData","platformText","platformVersionText","docsUrl","isBotAgent","test","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","isString","string","attr","attribute","getAttribute","assign","obj","prop","object","to","arg","index","length","nextSource","constructor","Object","nextKey","hasOwnProperty","settings","sa_settings","logSettings","keys","Date","now","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","replace","c","getRandomValues","Uint8Array","toString","error","r","Math","random","isFunction","func","namespaceText","namespace","strictUtm","loadedVariable","sa_event_loaded","timezone","sendData","data","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","Image","src","filter","key","map","join","overwrittenHostname","hostname","definedHostname","basePayload","version","mode","Intl","DateTimeFormat","resolvedOptions","timeZone","bot","ua","page_id","session_id","sri","mobile","brands","hostname_original","indexOf","lastSendPath","referrer","sendOnLeave","id","push","append","type","original_id","sendBeacon","bind","e","sameSite","userNavigated","getPath","overwrite","path","pathname","sendPageView","isPushState","deleteSourceInfo","search","metadata","ignoreSource","currentPage","query","split","keyValue","RegExp","pages","pathOverwrite","callbackRaw","parts","querySearch","shift","pathKey","performaceEntryType","perf","performance","navigationText","getEntriesByType","triggerSendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","pageview"],"mappings":"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"} \ No newline at end of file diff --git a/dist/v12/app.js b/dist/v12/app.js index d8677e31..a234d2f1 100644 --- a/dist/v12/app.js +++ b/dist/v12/app.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-15; 093c; SRI-version; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-15; 0459; SRI-version; v12) */ -!function(h,t,e,n,m){try{var v=undefined,g=!0,y=!1,r="true",a="https:",_="pageview",l="event",i="error",o=h.console,c="doNotTrack",b=h.navigator,s=h.location,w=s.host,u=h.document,p=b.userAgent,f="Not sending request ",d=f+"when ",O=y,E=encodeURIComponent,x=decodeURIComponent,M=JSON.stringify,S=h.addEventListener,k="https://queue."+e,q=u.documentElement||{},A="language",C="Height",D="scroll",$=b.userAgentData,j=D+C,R="offset"+C,H="client"+C,L="pagehide",N="platform",P="platformVersion",T="https://docs.simpleanalytics.com",U=0,I=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),V=h.screen,B=u.currentScript||u.querySelector('script[src*="'+e+'"]');m=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){m("Error in your "+t+" function:",e)},z=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},W=function(t){return"string"==typeof t},G=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},J=function(t,e){return t&&t.getAttribute("data-"+e)},X=function(t){return Array.isArray(t)?t:W(t)&&t.length?t.split(/, ?/):[]},Y=function(t){return t&&t.constructor===Object},Z=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},it=function(t){return"function"==typeof t},ot="namespace",ct=t[ot]||J(B,ot)||"sa",st=function(t,e){var n=h[ct+"_metadata"];Y(n)&&(t=Z(t,n));var r=h[kt];if(!it(r))return kt&&m(kt+" not found, set window."+kt),t;try{return Z(t,r.call(h,Z(t,e)))}catch(a){F("metadata",a)}},ut=t.strictUtm||J(B,"strict-utm")==r,lt=function(i,t){tt=!i&&nt("q")?"":y;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");tt!==y&&0>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},it=function(t){return"function"==typeof t},ot="namespace",ct=t[ot]||L(z,ot)||"sa",st=function(t,e){var n=m[ct+"_metadata"];Z(n)&&(t=K(t,n));var r=m[qt];if(!it(r))return qt&&v(qt+" not found, set window."+qt),t;try{return K(t,r.call(m,K(t,e)))}catch(a){F("metadata",a)}},ut=t.strictUtm||L(z,"strict-utm")==r,lt=function(i,t){tt=!i&&nt("q")?"":_;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");tt!==_&&0> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData, keepalive) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n var imageUrl =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n\n // Inline events must survive navigation without taking over links or forms.\n if (keepalive && window.fetch) {\n try {\n window\n .fetch(imageUrl, {\n keepalive: trueVar,\n mode: \"no-cors\",\n credentials: \"omit\",\n })\n .catch(function () {\n image.src = imageUrl;\n });\n return;\n } catch (error) {}\n }\n image.src = imageUrl;\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = trueVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw, keepalive) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback,\n undefinedVar,\n keepalive\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n\n var inlineEvent = function (event) {\n var element = event.target;\n while (\n element &&\n element !== doc &&\n (!element.getAttribute || attr(element, \"simple-event\") === null)\n )\n element = element.parentNode;\n\n if (!element || element === doc) return;\n var isForm = element.tagName === \"FORM\";\n var name = attr(element, \"simple-event\");\n if (!name || isForm !== (event.type === \"submit\")) return;\n\n var metadata = { tag: element.tagName.toLowerCase() };\n var attributes = element.attributes;\n for (var i = 0; i < attributes.length; i++) {\n var attribute = attributes[i];\n if (attribute.name.indexOf(\"data-simple-event-\") === 0)\n metadata[attribute.name.slice(18).replace(/-/g, \"_\")] =\n attribute.value;\n }\n if (isForm) {\n var button = event.submitter;\n metadata.button_text = button\n ? (button.textContent || button.value || \"\")\n .replace(/\\s+/g, \" \")\n .trim()\n .slice(0, 200)\n : \"\";\n }\n sendEvent(name, metadata, undefinedVar, trueVar);\n };\n\n doc.addEventListener(\"click\", inlineEvent, falseVar);\n doc.addEventListener(\"submit\", inlineEvent, falseVar);\n\n // 404 confirmation adds a request, so existing installs must opt in.\n if (\n overwriteOptions.detect404 === trueVar ||\n attr(scriptElement, \"detect-404\") == trueText\n ) {\n var detect404 = function () {\n if (\n !/\\b404\\b/.test(doc.title + \" \" + (doc.body && doc.body.textContent))\n )\n return;\n try {\n var request = new window.XMLHttpRequest();\n request.open(\"HEAD\", loc.href, trueVar);\n request.onload = function () {\n if (request.status === 404)\n sendEvent(\"page_404\", {\n url: loc.protocol + \"//\" + definedHostname + loc.pathname,\n status: 404,\n });\n };\n request.send();\n } catch (error) {}\n };\n if (doc.readyState === \"loading\")\n doc.addEventListener(\"DOMContentLoaded\", detect404, falseVar);\n else detect404();\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"simpleanalyticscdn.com\",\n \"queue.\",\n \"cdn_latest_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","protocol","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","keepalive","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","imageUrl","key","fetch","mode","credentials","catch","src","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue","detect404","inlineEvent","element","target","parentNode","isForm","tagName","button","tag","toLowerCase","attributes","submitter","button_text","textContent","trim","title","request","XMLHttpRequest","open","href","status","url","send","readyState"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"app.js","sources":["app.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = trueVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch = \"\";\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n var pathKey = path + querySearch;\n if (!path || lastSendPath == pathKey) return;\n\n lastSendPath = pathKey;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"simpleanalyticscdn.com\",\n \"queue.\",\n \"cdn_latest_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","protocol","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","parts","querySearch","shift","pathKey","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue"],"mappings":";;CAEA,SACEA,EACAC,EACAC,EAIAC,EACAC,GAEA,IAQE,IAAIC,EAAeC,UACfC,GAAU,EACVC,GAAW,EACXC,EAAW,OACXC,EAAQ,SACRC,EAAe,WACfC,EAAY,QACZC,EAAY,QAGZC,EAAMd,EAAOe,QACbC,EAAa,aACbC,EAAMjB,EAAOkB,UACbC,EAAMnB,EAAOoB,SACbC,EAAmBF,EAAIG,KACvBC,EAAMvB,EAAOwB,SACbC,EAAYR,EAAIQ,UAChBC,EAAa,uBACbC,EAAiBD,EAAa,QAC9BE,EAA2BpB,EAC3BqB,EAAyBC,mBACzBC,EAAyBC,mBACzBC,EAAYC,KAAKD,UAEjBE,EAAuBnC,EAAOoC,iBAC9BC,EAAaC,iBAA0BpC,EACvCqC,EAAkBhB,EAAIgB,iBAAmB,GACzCC,EAAW,WACXC,EAAS,SAETC,EAAS,SACTC,EAAS1B,EAAI2B,cACbC,EAAeH,EAASD,EACxBK,EAAe,SAAWL,EAC1BM,EAAe,SAAWN,EAE1BO,EAAW,WACXC,EAAe,WACfC,EAAsB,kBACtBC,EAAU,mCACVC,EAAQ,EACRC,EACF,sBAAsBC,KAAK7B,KAAe,WAAW6B,KAAK7B,GACxD8B,EAASvD,EAAOuD,OAIhBC,EACFjC,EAAIkC,eAAiBlC,EAAImC,cAAc,gBAAkBxD,EAAU,MAOrEE,EAAO,WAEL,IAAIuD,EAAO,GAAGC,MAAMC,KAAKC,WAOzB,OAJAH,EAAKI,QAAQ,qBAINC,SAASC,UAAUC,MAAML,KAAK/C,EAAIV,KAAMU,EAAK6C,IAGtD,IAAIQ,EAAiB,SAAUC,EAAMC,GACnCjE,EAAK,iBAAmBgE,EAAO,aAAcC,IAG3CC,EAAU,SAAUC,EAAKC,GAC3B,OAAOC,OAAOR,UAAUS,eAAeb,KAAKU,EAAKC,IAG/CG,EAAW,SAAUC,GACvB,MAAwB,iBAAVA,GAGZC,EAAc,SAAUC,GAC1B,OAAOA,EAAKC,QAAQ,sBAAuB,SAGzCC,EAAO,SAAUxB,EAAeyB,GAClC,OAAOzB,GAAiBA,EAAc0B,aAAa,QAAUD,IAG3DE,EAA+B,SAAUC,GAC3C,OAAOC,MAAMC,QAAQF,GACjBA,EACAT,EAASS,IAAQA,EAAIG,OACnBH,EAAII,MAAM,OACV,IAGJC,EAAW,SAAUC,GACvB,OAAOA,GAAUA,EAAOC,cAAgBlB,QAGtCmB,EAAS,WAGX,IAFA,IAAIC,EAAK,GACLC,EAAMhC,UACDiC,EAAQ,EAAGA,EAAQD,EAAIP,OAAQQ,IAAS,CAC/C,IAAIC,EAAaF,EAAIC,GACrB,GAAIN,EAASO,GACX,IAAK,IAAIC,KAAWD,EACd1B,EAAQ0B,EAAYC,KACtBJ,EAAGI,GAAWD,EAAWC,IAKjC,OAAOJ,GAGLK,EAAWlG,EAAOmG,YAClBC,EAAcF,GAAYzB,OAAO4B,KAAKpG,GAAkBsF,OAG5DtF,EAAmB2F,EAAO3F,EAAkBiG,GAExCE,GAAahG,EAAK,WAAYH,GAGlC,IA+EIqG,GA/EAC,GAAgBpB,EAClBlF,EAAiBsG,eAAiBvB,EAAKxB,EAAe,mBAGpDgD,GAAwB,SAAUC,GAEpC,OAGgB,IAFdF,GAAcG,OAAO,SAAU5B,GAC7B,OAAO,IAAI6B,OAAO,IAAMF,GAAoBnD,KAAKwB,KAChDS,QAIHqB,GAAMC,KAAKD,IAEXE,GAAO,WACT,IAAIC,EAAe/G,EAAOgH,QAAUhH,EAAOiH,SACvCC,EAAY,CAAC,MAAQ,KAAO,KAAO,KAAO,KAC1CC,EAAY,SAEhB,IACE,OAAOD,EAAUnC,QAAQoC,EAAW,SAAUC,GAC5C,OACEA,EACCL,EAAaM,gBAAgB,IAAIC,WAAW,IAAI,GAC9C,IAAOF,EAAI,GACdG,SAAS,MAEb,MAAOlD,GACP,OAAO6C,EAAUnC,QAAQoC,EAAW,SAAUC,GAC5C,IAAII,EAAqB,GAAhBC,KAAKC,SAAiB,EAE/B,OADMN,EAAI,EAAII,EAAS,EAAJA,EAAW,GACrBD,SAAS,QAKpBI,GAAa,SAAUC,GACzB,MAAsB,mBAARA,GAIZC,GAAgB,YAChBC,GACF7H,EAAiB4H,KACjB7C,EAAKxB,EAAeqE,KAkyBxB,KA/xBME,GAAiB,SAAUC,EAAUC,GACvC,IAAIC,EAAiBlI,EAAO8H,GAAY,aACpCrC,EAASyC,KAAiBF,EAAWpC,EAAOoC,EAAUE,IAC1D,IAAIC,EAA4BnI,EAAOoI,IACvC,IAAKT,GAAWQ,GAKd,OAJIC,IACFhI,EACEgI,GAAoB,0BAA4BA,IAE7CJ,EAET,IACE,OAAOpC,EACLoC,EACAG,EAA0BtE,KAAK7D,EAAQ4F,EAAOoC,EAAUC,KAE1D,MAAO5D,GACPF,EAAe,WAAYE,KAU3BgE,GACFpI,EAAiBoI,WACjBrD,EAAKxB,EAAe,eAAiB/C,EAInC6H,GAAiB,SAAUC,EAAcC,GAC3ClC,IAAKiC,GAAgB/B,GAAsB,KAAO,GAAKhG,EACvD,IAAIiI,GAAKD,GAAmBrH,EAAIuH,QAC7B9E,MAAM,GACN4B,MAAM,KACNkB,OAAO,SAAUiC,GAChB,IAAIC,EAAID,EAASE,QAAQ,KACrBvC,KAAM9F,GAAgB,EAAJoI,GAASD,EAAS/E,MAAMgF,EAAI,KAChDtC,KAAMA,GAAI,IAAM,IAAMqC,EAAS/E,MAAM,EAAGgF,IAE1C,IAAIE,EAASP,IAAiB/B,GAAsB,MAEhDuC,EAAkBC,GAAYC,IAAIpE,GAAaqE,KAAK,KACpDC,EAAQL,EACR,KAAOC,EAAkB,KACzB,YACCV,GAAY,GAAK,KAClB,yCACCA,GAAY,GAAK,QAClB,IACAU,EACA,KACJ,OAAID,IAAWE,GAAYzD,OAAe/E,EAInC,IAAImG,OAAOwC,EAAO,KAAK7F,KAAKqF,KAEpCO,KAAK,KAGR,OADA5C,GAAIA,IAAKjG,EACFoI,GAAKpI,GA+BV+I,GAAiBtB,GAAY,UACjC,GAAI9H,EAAOoJ,KAAmB7I,EAAS,OAAOH,EAAKsB,EAAa,SAChE1B,EAAOqJ,gBAAkB9I,EACzBP,EAAOoJ,IAAkB7I,EAOzB,IAAI+I,GAAW,SAAUrB,EAAMsB,EAAUC,GACvCvB,EAAOuB,EAAevB,EAAOrC,EAAO6D,GAASC,GAAMzB,GAE/ChH,EAAI0I,QAAUH,IAAcvB,EAAK0B,MAAQpJ,GACzCU,EAAI2I,qBAAuBJ,IAAcvB,EAAK4B,KAAOtJ,GAGzD,IAAIuJ,EAAQ,IAAIC,MACZR,IACFO,EAAME,QAAUT,EAChBO,EAAMG,OAASV,GAEjBO,EAAMI,IACJ7H,EACA,eACAoC,OAAO4B,KAAK4B,GACTvB,OAAO,SAAUyD,GAChB,OAAOlC,EAAKkC,IAAQ9J,IAErB4I,IAAI,SAAUkB,GACb,OACEtI,EAAuBsI,GACvB,IACAtI,EAAuBoG,EAAKkC,MAG/BjB,KAAK,KACR,SACArC,KAAKD,OAILwD,GACFnK,EAAiBoK,UAAYrF,EAAKxB,EAAe,YAC/C8G,GAAkBF,IAAuB/I,EAEzCkJ,GAAc,CAChBC,QAgpBJ,gBA/oBIH,SAAUC,IASZnK,EAAY,SAAUsK,GACpBA,EAAiBA,EAAeC,MAC5BD,EAAiB,IAAMA,EAAeC,MACtCD,EACJrK,EAAKqK,GACLnB,GACE1D,EAAO2E,GAAa,CAClBI,KAAM9J,EACNwD,MAAOoG,EACPG,KAAMzJ,EAAI0J,WAEZxK,EACAE,IAMJ4B,EACEtB,EACA,SAAUiK,GACJA,EAAMC,WAA+C,EAAnCD,EAAMC,SAASlC,QAAQ3I,IAC3CC,EAAU2K,EAAME,UAGpBxK,GAOF,IAwDIyK,GAxDAC,GAAQtE,KAERuE,GAAW,EAOXC,GAAOnL,EAAiBmL,MAAQpG,EAAKxB,EAAe,QAGpD6H,MA/KsBC,GA+KCrL,EAAiBoL,cA9KvBC,GA+KjBrL,EAAiBoL,WACjBrG,EAAKxB,EAAe,eAAiB/C,GACrCuE,EAAKxB,EAAe,aAAe/C,GACnCuE,EAAKxB,EAAe,gBAAkB/C,EAGtC8K,KACqC,SAAvCvG,EAAKxB,EAAe,iBACpBvD,EAAiBsL,cAAgB/K,GAI/BgL,GACFvL,EAAiBwL,UACjBzG,EAAKxB,EAAe,cACpBsE,GAAY,IAAMlH,EAGhB8K,GAAcvG,EAChBlF,EAAiByL,aAAe1G,EAAKxB,EAAe,iBAIlDwF,GAAc7D,EAChBlF,EAAiB+I,aAAehE,EAAKxB,EAAe,iBAIlDmI,GAAqBxG,EACvBlF,EAAiB0L,oBACf3G,EAAKxB,EAAe,yBAIpBoI,GACF3L,EAAiB2L,gBAAkB5G,EAAKxB,EAAe,mBAGrD4E,GACFnI,EAAiBmI,mBACjBpD,EAAKxB,EAAe,sBAItB,IAEEyH,GAAWzE,GAAsB,KAC7BqF,KAAKC,iBAAiBC,kBAAkBC,SACxC3L,EACJ,MAAOgE,IACPjE,EAAKiE,IAOP,IAAI4H,GAAUjM,EAAOiM,QACjBC,GACFjL,EAAIkL,WACJnM,EAAOoM,aACPpM,EAAOqM,aACPrM,EAAOsM,UACNL,KAAYA,GAAQM,QACrBvM,EAAOwM,YACPxM,EAAOyM,MACPpJ,GACAoE,KAAKC,UAAYD,KAAKC,SAGpBgF,GACFlG,GAAsB,MAAQA,GAAsB,QAElD0F,KAAK3B,GAAY2B,IAAM3L,GAE3B,IAAIkJ,GAAU7D,EAAO2E,GAAa,CAEhCoC,GAAInG,GAAsB,MAAQ/E,EAAYpB,EAE9CK,MAAOS,EAAImB,UAAY5B,EACvBuK,SAAUA,GACV2B,QAASF,GAAqB5F,KAASzG,EAGvCwM,WAAYrG,GAAsB,MAAQM,KAASzG,IA0BrD,GAvBAoJ,GAAQqD,IAAMvM,EAIVoC,IACF8G,GAAQsD,OAASpK,EAAOoK,OACxBtD,GAAQuD,OAAS/K,EAAUU,EAAOqK,SAS/BzL,EAAI0L,SAAS7M,EAAK,4CAInBkK,KAAoBjJ,IACtBoI,GAAQyD,kBAAoB7L,IAGzBgK,IAAcrK,KAAcC,GAA0B,KAAnBA,EAAID,GAC1C,OAAOZ,EACLuB,EAAiBX,EAAa,oBAAsBmC,EAAU,SAK7B,GAAlC9B,EAAiBwH,QAAQ,OACxB,aAAavF,KAAKjC,IACnB+I,IAEDhK,EACE,mBACEiB,EACA,SACA8B,EACA,0BAON,IACIgK,GA0DAC,GA3DA1D,GAAO,GAGP2D,GAAc,WAKhB,OAFEpN,EAAiBqN,UAAYtI,EAAKxB,EAAe,aAGzBjC,EAAI+L,UAAY,IACrCvI,QAAQ1D,EAAkBiJ,IAC1BvF,QAAQ,sDAAuD,MAC/DA,QAAQ,YAAa,OAAS1E,GAKjCiN,GAAWD,KAOXE,GAAW,EAEXC,GAAc,SAAUC,EAAIC,GAC9B,GAAKhB,GAAL,CAEA,IAAIiB,EAAS/H,EAAO2E,GAAa,CAC/BI,KAAM,SACNiD,YAAaF,EAAOD,EAAKhE,GAAQmD,UAenC,GAXIpG,GAAsB,OACxBmH,EAAOE,SAAWpG,KAAKqG,OAAOlH,KAAQsE,GAAQqC,IAngBnC,MAqgBbA,GAAW,EACXrC,GAAQtE,KAGJJ,GAAsB,UACxBmH,EAAOxC,SAAW1D,KAAKsG,IAAI,EAAG5C,GAAU6C,OAGtCN,IAASzM,EAAIgN,WAEf3E,GAASqE,EAAQtN,EAAcE,QAE/B,IACEU,EAAIgN,WAAWC,KAAKjN,EAApBA,CAAyBoB,EAAa,UAAWJ,EAAU0L,IAC3D,MAAOQ,GAEP7E,GAASqE,EAAQtN,EAAcE,MAMrC4B,EACE,mBACA,WACMZ,EAAI6M,QACA,KAAOpL,KAAYhD,GAASwN,KAClCJ,GAAcxG,MACT2G,IAAY3G,KAAQwG,IAE7B5M,GAGF2B,EAAqBa,EAAUwK,GAAahN,GAE5C,IAAI6N,GAAO9M,EAAI8M,MAAQ,GACnBL,GAAW,WACb,IACE,IAAIM,EAAuB/L,EAAgBQ,IAAiB,EACxDwL,EAAS9G,KAAKsG,IAChBM,GAAKxL,IAAiB,EACtBwL,GAAKvL,IAAiB,EACtBP,EAAgBQ,IAAiB,EACjCR,EAAgBM,IAAiB,EACjCN,EAAgBO,IAAiB,GAEnC,OAAO2E,KAAK+G,IACV,IAKI,EAJJ/G,KAAKqG,MACF,MAAQvL,EAAgBkM,WAAa,GAAKH,GACzCC,EACA,IAGN,MAAOlK,IAEP,OADAjE,EAAKiE,IACE,IAIXlC,EAAqB,OAAQ,WAC3BgJ,GAAW6C,KACX7L,EACEO,EACA,WACMyI,GAAW6C,OAAY7C,GAAW6C,OAExCxN,KAQJ,IAgCIkO,GAoCAC,GAAUC,GApEVC,GAAU,SAAUC,GACtB,IAAIlE,EAAO,GAIX,IACEA,EAAOkE,GAAa/M,EAAuBZ,EAAI0J,UAC/C,MAAOxG,IACPjE,EAAKiE,IAGP,IAAI0K,EAAyB/O,EAAO4L,IACpC,GAAIjE,GAAWoH,GACb,IACEnE,EAAOmE,EAAuBlL,KAAK7D,EAAQ,CAAE4K,KAAMA,KAAWA,EAC9D,MAAOvG,IACPF,EAAe,OAAQE,IAK3B,IA5YiB,SAAUuG,GAC3B,IAAK,IAAIhC,KAAK8C,GAAa,CACzB,IAAIsD,EAAgBtD,GAAY9C,GAChC,GAAKoG,EAAL,CAGA,IAAIC,EA9OI,KA+OND,EAAc,GAAcA,EA/OtB,IA+O8CA,EAEtD,GACEC,IAAerE,GACf,IAAIjE,OACF,IAAM9B,EAAYoK,GAAYlK,QAAQ,SAAU,QAAU,IAC1D,KACAzB,KAAKsH,GAEP,OAAOrK,GAEX,OAAOC,EA0XH0O,CAAatE,GAQjB,MAFY,QAARQ,IAAkBjK,EAAIgO,OAAMvE,GAAQzJ,EAAIgO,KAAK3J,MAAM,KAAK,IAErDoF,EAPLxK,EAAKuB,EAAiB,YAAciJ,IAgDpCwE,GAAW,SACbC,EACAC,EACAtH,EACAuH,IAEKA,GAAe5H,GAAWK,KAAWuH,EAAcvH,GACxD,IAIMwH,EAJFjG,EAAW5B,GAAW4H,GAAeA,EAAc,aACnDE,EAAc,GACd9K,EAAS2K,KAAgD,EAA9BA,EAAczG,QAAQ,OAGnDyG,GADIE,EAAQF,EAAc9J,MAAM,MACVkK,QACtBD,EAAc,IAAMD,EAAMtG,KAAK,MAGjC,IAAI0B,EAAOiE,GAAQS,GAGfK,EAAU/E,EAAO6E,EACrB,GAAK7E,GAAQuC,IAAgBwC,EAA7B,CAEAxC,GAAewC,EACfjG,GAAKkB,KAAOA,EAGRpE,GAAsB,OACxBkD,GAAKkG,eACHnI,KAAKsG,IAAIxL,EAA2B,aAAK,EAAGvC,EAAO6P,YAAc,IACjE,KACFnG,GAAKoG,gBACHrI,KAAKsG,IACHxL,EAAgBQ,IAAiB,EACjC/C,EAAO+P,aAAe,IACnB,MAILvJ,GAAsB,MACpBvF,EAAIuB,KAAWkH,GAAKlH,GAAYvB,EAAIuB,IAItCe,GAAUiD,GAAsB,QAClCkD,GAAKsG,aAAezM,EAAO0M,MAC3BvG,GAAKwG,cAAgB3M,EAAOgL,QAI9B,IAII4B,EAJAC,EAAOpQ,EAAOqQ,YACdC,EAAiB,aAIrB,IACEH,EAAsBC,EAAKG,iBAAiBD,GAAgB,GAAG3F,KAC/D,MAAOtG,IACPjE,EAAKiE,IAGPuK,GAAgBuB,GAC+C,EAA3D,CAAC,SAAU,gBAAgBtH,QAAQsH,GAGnCC,GACAA,EAAKE,KACwC,EAA7C,CAAC,EAAG,GAAGzH,QAAQuH,EAAKE,GAAgB3F,MAGxC,IAAI6F,EAA0BlD,GAC1BA,GAAS9H,MA3uBH,KA2uBgB,GACtBnF,EACJsO,GAAWrB,IACgD,EAAvD3B,GAAmB9C,QAAQ2H,IAC3BA,GAA2BnP,EAC3Bb,EAGJkJ,GAAK+G,OACH,QAAQnN,KAAK+J,OAAkBgC,GAAeT,GAC1CpO,GACCmO,GAEP3G,EAAWD,GAAeC,EAAU,CAClC2C,KAAMhK,EACNiK,KAAMlB,GAAKkB,OAGb,IAAI8F,EAAsB,WACxB9O,EAA2BrB,EAC3B,IAAIoQ,EACFtB,GAAeT,KAAkBpI,GAAsB,MA9H1C,SACjB6I,EACAuB,EACAjC,EACAjG,EACAV,EACAuB,GAEI8F,GAAa7B,GAAY,GAAK/D,GAAQmD,QAASrM,GAC/CmM,KAAoBjD,GAAQmD,QAAU9F,MAE1C,IAAI+J,EAAcvG,GAAkBuE,KAChCiC,EAAQxI,GAAesI,EAAkBlI,GAE7CY,GACE,CACEmE,GAAIhE,GAAQmD,QACZjC,KAAMhK,EACN2M,UAAWsD,GAAoBjC,EAAWrB,GAAW,KACrDwD,MAAOA,EACPxK,EAAGA,GAEH0B,SAAU/F,EAAU+F,IAEtBuB,GAGFmF,GAAmBpB,GACnBA,GAAWuD,EAEXzN,IAiGE2N,CACE1B,EACAsB,EACAhC,GACAc,EACAzH,EACAuB,IAIJ,GAAK3H,EAmBH8O,SAjBA,IACM/N,GAAUgF,GAAWhF,EAAOqO,sBAC9BrO,EACGqO,qBAAqB,CAAC/N,EAAcC,IACpC+N,KAAK,SAAUC,GACdzH,GAAQ0H,QAAUD,EAAkBjO,GACpCwG,GAAQ2H,WAAaF,EAAkBhO,GACvCwN,MAEDW,SAAMX,GAETA,IAEF,MAAOvC,GACPuC,OAWFY,GAAMtR,EAAOuR,QACbC,GAAeF,GAAMA,GAAIG,UAAYpR,EACrCqR,GAAM1R,EAAO2R,cACbC,GAAgB,YAIhBrG,IAAeiG,IAAgBK,OAASH,KAqB1CJ,GAAIG,WAnBEK,GAAOR,GADiB3G,GAoBAiH,IAlBrB,WACL,IAEI9G,EAFAhF,EAAMhC,UACNiO,EAAKD,GAAK5N,MAAM8N,KAAMlM,GAY1B,OAVI6B,GAAWkK,OACb/G,EAAQ,IAAI+G,MAAMlH,KAIlBG,EAAQvJ,EAAI0Q,YAAY,UAClBC,UAAUvH,GAAMpK,EAASA,GAEjCuK,EAAMhH,UAAYgC,EAClB4L,GAAI5G,GACGiH,IAMX5P,EACEyP,GACA,WACExC,GAAS,IAEX5O,GAGF2B,EACE,WACA,WACEiN,GAAS,IAEX5O,IAKA+K,IAAuB,QAARH,IAAkB,iBAAkBpL,GACrDmC,EACE,aACA,WACEiN,GAAS,IAEX5O,GAIA+K,IAAa6D,KAEjBpP,EAAOmS,YAAc,SAAUvH,EAAM5C,EAAUuB,GAC7C6F,GAAS,EAAGxE,EAAM5C,EAAUuB,IAQ9B,IAAI6I,GAAa,CAAC,SAAU,UAExBC,GAAY,SAAUvH,EAAO9C,EAAUuH,IACpCA,GAAe5H,GAAWK,KAAWuH,EAAcvH,GAExD,IAAIsK,EAAkB3K,GAAWmD,GAC7BvB,EAAW5B,GAAW4H,GAAeA,EAAc,aACnDgD,SAAmBzH,EAEvB,GAAIsH,GAAWvJ,QAAQ0J,GAAa,IAAMD,EAExC,OADAnO,EAAeqH,GAAmB5K,EAAY,aAAe2R,GACtDhJ,IAGT,IACE,GAAI+I,EAAiB,CACnB,IAAIE,EAAc1H,IAClB,GAAIsH,GAAWvJ,eAAe2J,GAAe,EAK3C,OAJArO,EACEqH,GACAV,EAAQ,uBAAyB0H,GAE5BjJ,IAETuB,EAAQ0H,GAEV,MAAOnO,IAEP,OADAF,EAAeqH,GAAmBnH,IAC3BkF,IAGTuB,GAAS,GAAKA,GAAO/F,QAAQ,eAAgB,KAAKA,QAAQ,WAAY,IAEtE,IAAI0N,EAAc,CAAE9H,KAAM/J,EAAWkK,MAAOA,GACxC4H,GAAa9D,IAAiBxL,EAAQ,EAE1C4E,EAAWD,GAAeC,EAAUyK,GAEhC3H,GACFxB,GACE1D,EAAO6M,EAAa,CAClBhF,GAAI3G,KACJgK,MAAOxI,IAAgBoK,GACvBpF,UACGoF,GAAa/D,KAAanI,GAAsB,KAC7CkI,GACA,KAEN1G,SAAU/F,EAAU+F,KAEtBuB,IAKFoJ,GAAmB,SAAU7H,EAAO9C,EAAUuB,GAChD8I,GAAUvH,EAAO9C,EAAUuB,IAIxBvJ,EAAOwL,MACVxL,EAAOwL,IAAqBmH,IAE9B,IAAIC,GAAY5S,EAAOwL,IAGnBqH,GAAQD,IAAaA,GAAUnK,EAAImK,GAAUnK,EAAI,GAMrD,IAAK,IAAIqC,MAHT9K,EAAOwL,IAAqBmH,GAGVE,GACZvO,EAAQuO,GAAO/H,MACjBzF,MAAMC,QAAQuN,GAAM/H,KAChBuH,GAAUnO,MAAM,KAAM2O,GAAM/H,KAC5BuH,GAAUQ,GAAM/H,MAGxB,MAAOqD,IACPhO,EAAUgO,IA7IY,IAAUxD,GACxBmH,GAtnBkBxG,GAnN9B,CAw9BEtL,OACA,uBACA"} \ No newline at end of file diff --git a/dist/v12/custom/app.js b/dist/v12/custom/app.js index 3cb3cb71..69d40ee5 100644 --- a/dist/v12/custom/app.js +++ b/dist/v12/custom/app.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-15; 5aad; SRI-version; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-15; 91bc; SRI-version; v12) */ -!function(h,t,e,n,m){try{var v=undefined,g=!0,y=!1,r="true",a="https:",_="pageview",l="event",i="error",o=h.console,c="doNotTrack",b=h.navigator,s=h.location,w=s.host,u=h.document,p=b.userAgent,f="Not sending request ",d=f+"when ",O=y,x=encodeURIComponent,E=decodeURIComponent,M=JSON.stringify,S=h.addEventListener,k="https://"+e,A=u.documentElement||{},q="language",C="Height",D="scroll",$=b.userAgentData,j=D+C,H="offset"+C,R="client"+C,L="pagehide",N="platform",P="platformVersion",T="https://docs.simpleanalytics.com",U=0,I=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),V=h.screen,B=u.currentScript||u.querySelector('script[src*="'+e+'"]');m=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){m("Error in your "+t+" function:",e)},z=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},W=function(t){return"string"==typeof t},G=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},J=function(t,e){return t&&t.getAttribute("data-"+e)},X=function(t){return Array.isArray(t)?t:W(t)&&t.length?t.split(/, ?/):[]},Y=function(t){return t&&t.constructor===Object},Z=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},it=function(t){return"function"==typeof t},ot="namespace",ct=t[ot]||J(B,ot)||"sa",st=function(t,e){var n=h[ct+"_metadata"];Y(n)&&(t=Z(t,n));var r=h[kt];if(!it(r))return kt&&m(kt+" not found, set window."+kt),t;try{return Z(t,r.call(h,Z(t,e)))}catch(a){F("metadata",a)}},ut=t.strictUtm||J(B,"strict-utm")==r,lt=function(i,t){tt=!i&&nt("q")?"":y;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");tt!==y&&0"); +!function(m,t,e,n,v){try{var g=undefined,y=!0,_=!1,r="true",a="https:",w="pageview",u="event",i="error",o=m.console,c="doNotTrack",b=m.navigator,s=m.location,O=s.host,l=m.document,p=b.userAgent,f="Not sending request ",h=f+"when ",x=_,d=encodeURIComponent,E=decodeURIComponent,S=JSON.stringify,k=m.addEventListener,M="https://"+e,q=l.documentElement||{},A="language",$="Height",j="scroll",D=b.userAgentData,C=j+$,H="offset"+$,R="client"+$,P="pagehide",T="platform",U="platformVersion",I="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),N=m.screen,z=l.currentScript||l.querySelector('script[src*="'+e+'"]');v=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){v("Error in your "+t+" function:",e)},W=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},G=function(t){return"string"==typeof t},J=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},L=function(t,e){return t&&t.getAttribute("data-"+e)},Y=function(t){return Array.isArray(t)?t:G(t)&&t.length?t.split(/, ?/):[]},Z=function(t){return t&&t.constructor===Object},K=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},it=function(t){return"function"==typeof t},ot="namespace",ct=t[ot]||L(z,ot)||"sa",st=function(t,e){var n=m[ct+"_metadata"];Z(n)&&(t=K(t,n));var r=m[Mt];if(!it(r))return Mt&&v(Mt+" not found, set window."+Mt),t;try{return K(t,r.call(m,K(t,e)))}catch(a){F("metadata",a)}},ut=t.strictUtm||L(z,"strict-utm")==r,lt=function(i,t){tt=!i&&nt("q")?"":_;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");tt!==_&&0"); //# sourceMappingURL=app.js.map \ No newline at end of file diff --git a/dist/v12/custom/app.js.map b/dist/v12/custom/app.js.map index de73d003..e25acfb6 100644 --- a/dist/v12/custom/app.js.map +++ b/dist/v12/custom/app.js.map @@ -1 +1 @@ -{"version":3,"file":"app.source.js","sources":["app.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData, keepalive) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n var imageUrl =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n\n // Inline events must survive navigation without taking over links or forms.\n if (keepalive && window.fetch) {\n try {\n window\n .fetch(imageUrl, {\n keepalive: trueVar,\n mode: \"no-cors\",\n credentials: \"omit\",\n })\n .catch(function () {\n image.src = imageUrl;\n });\n return;\n } catch (error) {}\n }\n image.src = imageUrl;\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = trueVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw, keepalive) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback,\n undefinedVar,\n keepalive\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n\n var inlineEvent = function (event) {\n var element = event.target;\n while (\n element &&\n element !== doc &&\n (!element.getAttribute || attr(element, \"simple-event\") === null)\n )\n element = element.parentNode;\n\n if (!element || element === doc) return;\n var isForm = element.tagName === \"FORM\";\n var name = attr(element, \"simple-event\");\n if (!name || isForm !== (event.type === \"submit\")) return;\n\n var metadata = { tag: element.tagName.toLowerCase() };\n var attributes = element.attributes;\n for (var i = 0; i < attributes.length; i++) {\n var attribute = attributes[i];\n if (attribute.name.indexOf(\"data-simple-event-\") === 0)\n metadata[attribute.name.slice(18).replace(/-/g, \"_\")] =\n attribute.value;\n }\n if (isForm) {\n var button = event.submitter;\n metadata.button_text = button\n ? (button.textContent || button.value || \"\")\n .replace(/\\s+/g, \" \")\n .trim()\n .slice(0, 200)\n : \"\";\n }\n sendEvent(name, metadata, undefinedVar, trueVar);\n };\n\n doc.addEventListener(\"click\", inlineEvent, falseVar);\n doc.addEventListener(\"submit\", inlineEvent, falseVar);\n\n // 404 confirmation adds a request, so existing installs must opt in.\n if (\n overwriteOptions.detect404 === trueVar ||\n attr(scriptElement, \"detect-404\") == trueText\n ) {\n var detect404 = function () {\n if (\n !/\\b404\\b/.test(doc.title + \" \" + (doc.body && doc.body.textContent))\n )\n return;\n try {\n var request = new window.XMLHttpRequest();\n request.open(\"HEAD\", loc.href, trueVar);\n request.onload = function () {\n if (request.status === 404)\n sendEvent(\"page_404\", {\n url: loc.protocol + \"//\" + definedHostname + loc.pathname,\n status: 404,\n });\n };\n request.send();\n } catch (error) {}\n };\n if (doc.readyState === \"loading\")\n doc.addEventListener(\"DOMContentLoaded\", detect404, falseVar);\n else detect404();\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_app_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","keepalive","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","imageUrl","key","fetch","mode","credentials","catch","src","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","protocol","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue","detect404","inlineEvent","element","target","parentNode","isForm","tagName","button","tag","toLowerCase","attributes","submitter","button_text","textContent","trim","title","request","XMLHttpRequest","open","href","status","url","send","readyState"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"app.source.js","sources":["app.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = trueVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch = \"\";\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n var pathKey = path + querySearch;\n if (!path || lastSendPath == pathKey) return;\n\n lastSendPath = pathKey;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_app_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","protocol","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","parts","querySearch","shift","pathKey","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue"],"mappings":"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"} \ No newline at end of file diff --git a/dist/v12/custom/light.js b/dist/v12/custom/light.js index 219d3898..0607cbcb 100644 --- a/dist/v12/custom/light.js +++ b/dist/v12/custom/light.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-15; 0001; SRI-version; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-15; 780b; SRI-version; v12) */ -!function(l,e,t,f){try{var u=undefined,n="https:",r=l.console,a="doNotTrack",m=l.navigator,p=l.location,g=p.host,i=l.document,o=m.userAgent,c="Not sending request ",h=!1,s=encodeURIComponent,d=decodeURIComponent,v=JSON.stringify,y=l.addEventListener,_="https://"+t,b=(i.documentElement,"language"),w=m.userAgentData,O="platform",S="platformVersion",j="https://docs.simpleanalytics.com",k=/(bot|spider|crawl)/i.test(o)&&!/(cubot)/i.test(o),x=i.currentScript||i.querySelector('script[src*="'+t+'"]');f=function(){var e=[].slice.call(arguments);return e.unshift("Simple Analytics:"),Function.prototype.apply.call(r.warn,r,e)};var E=function(e){return"string"==typeof e},A=function(e,t){return e&&e.getAttribute("data-"+t)},$=function(){for(var e,t,n,r={},a=arguments,i=0;i>e/4).toString(16)})}catch(r){return e.replace(n,function(e){var t=16*Math.random()|0;return(e<2?t:3&t|8).toString(16)})}},N=function(e){return"function"==typeof e},R="namespace",U=e[R]||A(x,R)||"sa",V=e.strictUtm||"true"==A(x,"strict-utm"),B=U+"_loaded";if(1==l[B])return f(c+"twice");l.sa_event_loaded=!0,l[B]=!0;var C,H=function(t,e,n,r){t=n?t:$(J,M,t),m.brave&&!n&&(t.brave=!0),m._duckduckgoloader_&&!n&&(t.duck=!0);var a=new Image,i=_+"/simple.gif?"+Object.keys(t).filter(function(e){return t[e]!=u}).map(function(e){return s(e)+"="+s(t[e])}).join("&")+"&time="+Date.now();a.src=i},T=e.hostname||A(x,"hostname"),F=T||g,z={version:"custom_light_12",hostname:F};e.mode||A(x,"mode");try{C=Intl.DateTimeFormat().resolvedOptions().timeZone}catch(X){f(X)}k&&(z.bot=!0);var J=$(z,{ua:o,https:p.protocol==n,timezone:C,page_id:I(),session_id:I()});if(J.sri=!0,w&&(J.mobile=w.mobile,J.brands=v(w.brands)),F!==g&&(J.hostname_original=g),a in m&&"1"==m[a])return f("Not sending request when "+a+" is enabled. See "+j+"/dnt");-1!=g.indexOf(".")&&!/^[0-9.:]+$/.test(g)||T||f("Set hostname on "+g+". See "+j+"/overwrite-domain-name");var L,M={},P=(e.referrer||A(x,"referrer")||i.referrer||"").replace(g,F).replace(/^https?:\/\/((m|l|w{2,3}([0-9]+)?)\.)?([^?#]+)(.*)$/,"$4").replace(/^([^/]+)$/,"$1")||u,Z=function(e,t){var n=$(z,{type:"append",original_id:t?e:J.page_id});if(t||!m.sendBeacon)H(n,0,!0);else try{m.sendBeacon.bind(m)(_+"/append",v(n))}catch(r){H(n,0,!0)}};y("pagehide",Z,!1);var G,K,Q=function(e){var t="";try{t=e||d(p.pathname)}catch(X){f(X)}return t},W=function(e,t,n,r,a,i){e&&Z(""+J.page_id,!0),J.page_id=I();var o,c=F+Q(),s=(o=t,(r||p.search).slice(1).split("&").filter(function(e){return!o&&new RegExp("^((utm_)"+(V?"":"?")+"(source|medium|content|term|campaign)"+(V?"":"|ref")+")=","i").test(e)}).join("&")||u);H({id:J.page_id,type:"pageview",referrer:!t||n?P:null,query:s}),P=c,0};!function(e,t,n,r){!r&&N(n)&&(r=n);var a,i;N(r);E(t)&&-1"); +!function(f,e,t,m){try{var u=undefined,n="https:",r=f.console,i="doNotTrack",g=f.navigator,p=f.location,h=p.host,a=f.document,o=g.userAgent,c="Not sending request ",v=!1,s=encodeURIComponent,d=decodeURIComponent,l=JSON.stringify,y=f.addEventListener,_="https://"+t,b=(a.documentElement,"language"),w=g.userAgentData,O="platform",S="platformVersion",j="https://docs.simpleanalytics.com",k=/(bot|spider|crawl)/i.test(o)&&!/(cubot)/i.test(o),x=a.currentScript||a.querySelector('script[src*="'+t+'"]');m=function(){var e=[].slice.call(arguments);return e.unshift("Simple Analytics:"),Function.prototype.apply.call(r.warn,r,e)};var E=function(e){return"string"==typeof e},A=function(e,t){return e&&e.getAttribute("data-"+t)},$=function(){for(var e,t,n,r={},i=arguments,a=0;a>e/4).toString(16)})}catch(r){return e.replace(n,function(e){var t=16*Math.random()|0;return(e<2?t:3&t|8).toString(16)})}},N=function(e){return"function"==typeof e},R="namespace",U=e[R]||A(x,R)||"sa",V=e.strictUtm||"true"==A(x,"strict-utm"),B=U+"_loaded";if(1==f[B])return m(c+"twice");f.sa_event_loaded=!0,f[B]=!0;var C,H=function(t,e,n){t=n?t:$(J,M,t),g.brave&&!n&&(t.brave=!0),g._duckduckgoloader_&&!n&&(t.duck=!0),(new Image).src=_+"/simple.gif?"+Object.keys(t).filter(function(e){return t[e]!=u}).map(function(e){return s(e)+"="+s(t[e])}).join("&")+"&time="+Date.now()},T=e.hostname||A(x,"hostname"),F=T||h,z={version:"custom_light_12",hostname:F};e.mode||A(x,"mode");try{C=Intl.DateTimeFormat().resolvedOptions().timeZone}catch(X){m(X)}k&&(z.bot=!0);var J=$(z,{ua:o,https:p.protocol==n,timezone:C,page_id:I(),session_id:I()});if(J.sri=!0,w&&(J.mobile=w.mobile,J.brands=l(w.brands)),F!==h&&(J.hostname_original=h),i in g&&"1"==g[i])return m("Not sending request when "+i+" is enabled. See "+j+"/dnt");-1!=h.indexOf(".")&&!/^[0-9.:]+$/.test(h)||T||m("Set hostname on "+h+". See "+j+"/overwrite-domain-name");var L,M={},P=(e.referrer||A(x,"referrer")||a.referrer||"").replace(h,F).replace(/^https?:\/\/((m|l|w{2,3}([0-9]+)?)\.)?([^?#]+)(.*)$/,"$4").replace(/^([^/]+)$/,"$1")||u,Z=function(e,t){var n=$(z,{type:"append",original_id:t?e:J.page_id});if(t||!g.sendBeacon)H(n,0,!0);else try{g.sendBeacon.bind(g)(_+"/append",l(n))}catch(r){H(n,0,!0)}};y("pagehide",Z,!1);var G,K,Q=function(e){var t="";try{t=e||d(p.pathname)}catch(X){m(X)}return t},W=function(e,t,n,r,i,a){e&&Z(""+J.page_id,!0),J.page_id=I();var o,c=F+Q(),s=(o=t,(r||p.search).slice(1).split("&").filter(function(e){return!o&&new RegExp("^((utm_)"+(V?"":"?")+"(source|medium|content|term|campaign)"+(V?"":"|ref")+")=","i").test(e)}).join("&")||u);H({id:J.page_id,type:"pageview",referrer:!t||n?P:null,query:s}),P=c,0};!function(e,t,n,r){!r&&N(n)&&(r=n);N(r);var i,a="";E(t)&&-1"); //# sourceMappingURL=light.js.map \ No newline at end of file diff --git a/dist/v12/custom/light.js.map b/dist/v12/custom/light.js.map index 07a0c737..9373b43f 100644 --- a/dist/v12/custom/light.js.map +++ b/dist/v12/custom/light.js.map @@ -1 +1 @@ -{"version":3,"file":"light.source.js","sources":["light.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n\n var collectMetricByString = function (metricAbbreviation) {\n // eslint-disable-next-line no-unreachable\n return true;\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n if (ignore) return falseVar;\n // eslint-disable-next-line no-redeclare\n var regex =\n \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \")=\";\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n return q || undefinedVar;\n };\n\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData, keepalive) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n var imageUrl =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n\n image.src = imageUrl;\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n\n\n\n\n\n\n\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n // eslint-disable-next-line no-redeclare\n var bot = isBotAgent;\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = trueVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n\n\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n sameSite = referrer\n ? referrer.split(slash)[0] == locationHostname\n : falseVar;\n\n\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n\n\n pageview();\n\n } catch (e) {\n warn(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_light_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","warn","undefinedVar","undefined","https","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","language","documentElement","uaData","userAgentData","platformText","platformVersionText","docsUrl","isBotAgent","test","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","isString","string","attr","attribute","getAttribute","assign","obj","prop","object","to","arg","index","length","nextSource","constructor","Object","nextKey","hasOwnProperty","settings","sa_settings","logSettings","keys","Date","now","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","replace","c","getRandomValues","Uint8Array","toString","error","r","Math","random","isFunction","func","namespaceText","namespace","strictUtm","loadedVariable","sa_event_loaded","timezone","sendData","data","callback","onlyThisData","keepalive","payload","page","brave","_duckduckgoloader_","duck","image","Image","imageUrl","filter","key","map","join","src","overwrittenHostname","hostname","definedHostname","basePayload","version","mode","Intl","DateTimeFormat","resolvedOptions","timeZone","bot","ua","protocol","page_id","session_id","sri","mobile","brands","hostname_original","indexOf","lastSendPath","referrer","sendOnLeave","id","push","append","type","original_id","sendBeacon","bind","e","sameSite","userNavigated","getPath","overwrite","path","pathname","sendPageView","isPushState","deleteSourceInfo","search","metadata","ignoreSource","currentPage","query","split","keyValue","RegExp","pages","pathOverwrite","callbackRaw","querySearch","parts","shift","performaceEntryType","perf","performance","navigationText","getEntriesByType","triggerSendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","pageview"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"light.source.js","sources":["light.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n\n var collectMetricByString = function (metricAbbreviation) {\n // eslint-disable-next-line no-unreachable\n return true;\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n if (ignore) return falseVar;\n // eslint-disable-next-line no-redeclare\n var regex =\n \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \")=\";\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n return q || undefinedVar;\n };\n\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n\n\n\n\n\n\n\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n // eslint-disable-next-line no-redeclare\n var bot = isBotAgent;\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = trueVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n\n\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch = \"\";\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n var pathKey = path + querySearch;\n if (!path || lastSendPath == pathKey) return;\n\n lastSendPath = pathKey;\n page.path = path;\n\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n sameSite = referrer\n ? referrer.split(slash)[0] == locationHostname\n : falseVar;\n\n\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n\n\n pageview();\n\n } catch (e) {\n warn(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_light_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","warn","undefinedVar","undefined","https","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","language","documentElement","uaData","userAgentData","platformText","platformVersionText","docsUrl","isBotAgent","test","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","isString","string","attr","attribute","getAttribute","assign","obj","prop","object","to","arg","index","length","nextSource","constructor","Object","nextKey","hasOwnProperty","settings","sa_settings","logSettings","keys","Date","now","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","replace","c","getRandomValues","Uint8Array","toString","error","r","Math","random","isFunction","func","namespaceText","namespace","strictUtm","loadedVariable","sa_event_loaded","timezone","sendData","data","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","Image","src","filter","key","map","join","overwrittenHostname","hostname","definedHostname","basePayload","version","mode","Intl","DateTimeFormat","resolvedOptions","timeZone","bot","ua","protocol","page_id","session_id","sri","mobile","brands","hostname_original","indexOf","lastSendPath","referrer","sendOnLeave","id","push","append","type","original_id","sendBeacon","bind","e","sameSite","userNavigated","getPath","overwrite","path","pathname","sendPageView","isPushState","deleteSourceInfo","search","metadata","ignoreSource","currentPage","query","split","keyValue","RegExp","pages","pathOverwrite","callbackRaw","parts","querySearch","shift","pathKey","performaceEntryType","perf","performance","navigationText","getEntriesByType","triggerSendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","pageview"],"mappings":"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"} \ No newline at end of file diff --git a/dist/v12/custom/proxy.js b/dist/v12/custom/proxy.js index c6cdbd30..1ed4dabb 100644 --- a/dist/v12/custom/proxy.js +++ b/dist/v12/custom/proxy.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-15; 8696; SRI-version; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-15; 94e1; SRI-version; v12) */ -!function(h,t,e,n,m){try{var v=undefined,g=!0,y=!1,r="true",a="https:",_="pageview",l="event",i="error",o=h.console,c="doNotTrack",b=h.navigator,s=h.location,w=s.host,u=h.document,p=b.userAgent,f="Not sending request ",d=f+"when ",x=y,O=encodeURIComponent,E=decodeURIComponent,M=JSON.stringify,S=h.addEventListener,k="https://"+e,A=u.documentElement||{},q="language",C="Height",D="scroll",$=b.userAgentData,j=D+C,H="offset"+C,R="client"+C,L="pagehide",N="platform",P="platformVersion",T="https://docs.simpleanalytics.com",U=0,I=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),V=h.screen,B=u.currentScript||u.querySelector('script[src*="'+e+'"]');m=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){m("Error in your "+t+" function:",e)},z=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},W=function(t){return"string"==typeof t},G=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},J=function(t,e){return t&&t.getAttribute("data-"+e)},X=function(t){return Array.isArray(t)?t:W(t)&&t.length?t.split(/, ?/):[]},Y=function(t){return t&&t.constructor===Object},Z=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},it=function(t){return"function"==typeof t},ot="namespace",ct=t[ot]||J(B,ot)||"sa",st=function(t,e){var n=h[ct+"_metadata"];Y(n)&&(t=Z(t,n));var r=h[kt];if(!it(r))return kt&&m(kt+" not found, set window."+kt),t;try{return Z(t,r.call(h,Z(t,e)))}catch(a){F("metadata",a)}},ut=t.strictUtm||J(B,"strict-utm")==r,lt=function(i,t){tt=!i&&nt("q")?"":y;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");tt!==y&&0"); +!function(m,t,e,n,v){try{var g=undefined,y=!0,_=!1,r="true",a="https:",w="pageview",u="event",i="error",o=m.console,c="doNotTrack",b=m.navigator,s=m.location,x=s.host,l=m.document,p=b.userAgent,f="Not sending request ",h=f+"when ",O=_,d=encodeURIComponent,E=decodeURIComponent,S=JSON.stringify,k=m.addEventListener,M="https://"+e,q=l.documentElement||{},A="language",$="Height",j="scroll",D=b.userAgentData,C=j+$,H="offset"+$,P="client"+$,R="pagehide",T="platform",U="platformVersion",I="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),N=m.screen,z=l.currentScript||l.querySelector('script[src*="'+e+'"]');v=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){v("Error in your "+t+" function:",e)},W=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},G=function(t){return"string"==typeof t},J=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},L=function(t,e){return t&&t.getAttribute("data-"+e)},Y=function(t){return Array.isArray(t)?t:G(t)&&t.length?t.split(/, ?/):[]},Z=function(t){return t&&t.constructor===Object},K=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},it=function(t){return"function"==typeof t},ot="namespace",ct=t[ot]||L(z,ot)||"sa",st=function(t,e){var n=m[ct+"_metadata"];Z(n)&&(t=K(t,n));var r=m[Mt];if(!it(r))return Mt&&v(Mt+" not found, set window."+Mt),t;try{return K(t,r.call(m,K(t,e)))}catch(a){F("metadata",a)}},ut=t.strictUtm||L(z,"strict-utm")==r,lt=function(i,t){tt=!i&&nt("q")?"":_;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");tt!==_&&0"); //# sourceMappingURL=proxy.js.map \ No newline at end of file diff --git a/dist/v12/custom/proxy.js.map b/dist/v12/custom/proxy.js.map index c82de948..195e1b65 100644 --- a/dist/v12/custom/proxy.js.map +++ b/dist/v12/custom/proxy.js.map @@ -1 +1 @@ -{"version":3,"file":"proxy.source.js","sources":["proxy.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData, keepalive) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n var imageUrl =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n\n // Inline events must survive navigation without taking over links or forms.\n if (keepalive && window.fetch) {\n try {\n window\n .fetch(imageUrl, {\n keepalive: trueVar,\n mode: \"no-cors\",\n credentials: \"omit\",\n })\n .catch(function () {\n image.src = imageUrl;\n });\n return;\n } catch (error) {}\n }\n image.src = imageUrl;\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = trueVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw, keepalive) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback,\n undefinedVar,\n keepalive\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n\n var inlineEvent = function (event) {\n var element = event.target;\n while (\n element &&\n element !== doc &&\n (!element.getAttribute || attr(element, \"simple-event\") === null)\n )\n element = element.parentNode;\n\n if (!element || element === doc) return;\n var isForm = element.tagName === \"FORM\";\n var name = attr(element, \"simple-event\");\n if (!name || isForm !== (event.type === \"submit\")) return;\n\n var metadata = { tag: element.tagName.toLowerCase() };\n var attributes = element.attributes;\n for (var i = 0; i < attributes.length; i++) {\n var attribute = attributes[i];\n if (attribute.name.indexOf(\"data-simple-event-\") === 0)\n metadata[attribute.name.slice(18).replace(/-/g, \"_\")] =\n attribute.value;\n }\n if (isForm) {\n var button = event.submitter;\n metadata.button_text = button\n ? (button.textContent || button.value || \"\")\n .replace(/\\s+/g, \" \")\n .trim()\n .slice(0, 200)\n : \"\";\n }\n sendEvent(name, metadata, undefinedVar, trueVar);\n };\n\n doc.addEventListener(\"click\", inlineEvent, falseVar);\n doc.addEventListener(\"submit\", inlineEvent, falseVar);\n\n // 404 confirmation adds a request, so existing installs must opt in.\n if (\n overwriteOptions.detect404 === trueVar ||\n attr(scriptElement, \"detect-404\") == trueText\n ) {\n var detect404 = function () {\n if (\n !/\\b404\\b/.test(doc.title + \" \" + (doc.body && doc.body.textContent))\n )\n return;\n try {\n var request = new window.XMLHttpRequest();\n request.open(\"HEAD\", loc.href, trueVar);\n request.onload = function () {\n if (request.status === 404)\n sendEvent(\"page_404\", {\n url: loc.protocol + \"//\" + definedHostname + loc.pathname,\n status: 404,\n });\n };\n request.send();\n } catch (error) {}\n };\n if (doc.readyState === \"loading\")\n doc.addEventListener(\"DOMContentLoaded\", detect404, falseVar);\n else detect404();\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_proxy_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","keepalive","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","imageUrl","key","fetch","mode","credentials","catch","src","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","protocol","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue","detect404","inlineEvent","element","target","parentNode","isForm","tagName","button","tag","toLowerCase","attributes","submitter","button_text","textContent","trim","title","request","XMLHttpRequest","open","href","status","url","send","readyState"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"proxy.source.js","sources":["proxy.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = trueVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch = \"\";\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n var pathKey = path + querySearch;\n if (!path || lastSendPath == pathKey) return;\n\n lastSendPath = pathKey;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_proxy_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","protocol","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","parts","querySearch","shift","pathKey","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue"],"mappings":"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"} \ No newline at end of file diff --git a/dist/v12/light.js b/dist/v12/light.js index aca47cb2..5e29e92b 100644 --- a/dist/v12/light.js +++ b/dist/v12/light.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-15; 2d4f; SRI-version; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-15; acb0; SRI-version; v12) */ -!function(l,e,t,f){try{var u=undefined,n="https:",r=l.console,a="doNotTrack",m=l.navigator,p=l.location,g=p.host,i=l.document,o=m.userAgent,c="Not sending request ",h=!1,s=encodeURIComponent,d=decodeURIComponent,v=JSON.stringify,y=l.addEventListener,_="https://queue."+t,b=(i.documentElement,"language"),w=m.userAgentData,O="platform",S="platformVersion",j="https://docs.simpleanalytics.com",k=/(bot|spider|crawl)/i.test(o)&&!/(cubot)/i.test(o),E=i.currentScript||i.querySelector('script[src*="'+t+'"]');f=function(){var e=[].slice.call(arguments);return e.unshift("Simple Analytics:"),Function.prototype.apply.call(r.warn,r,e)};var q=function(e){return"string"==typeof e},x=function(e,t){return e&&e.getAttribute("data-"+t)},A=function(){for(var e,t,n,r={},a=arguments,i=0;i>e/4).toString(16)})}catch(r){return e.replace(n,function(e){var t=16*Math.random()|0;return(e<2?t:3&t|8).toString(16)})}},N=function(e){return"function"==typeof e},R="namespace",U=e[R]||x(E,R)||"sa",V=e.strictUtm||"true"==x(E,"strict-utm"),B=U+"_loaded";if(1==l[B])return f(c+"twice");l.sa_event_loaded=!0,l[B]=!0;var C,T=function(t,e,n,r){t=n?t:A(J,M,t),m.brave&&!n&&(t.brave=!0),m._duckduckgoloader_&&!n&&(t.duck=!0);var a=new Image,i=_+"/simple.gif?"+Object.keys(t).filter(function(e){return t[e]!=u}).map(function(e){return s(e)+"="+s(t[e])}).join("&")+"&time="+Date.now();a.src=i},F=e.hostname||x(E,"hostname"),H=F||g,z={version:"cdn_light_12",hostname:H};e.mode||x(E,"mode");try{C=Intl.DateTimeFormat().resolvedOptions().timeZone}catch(X){f(X)}k&&(z.bot=!0);var J=A(z,{ua:o,https:p.protocol==n,timezone:C,page_id:I(),session_id:I()});if(J.sri=!0,w&&(J.mobile=w.mobile,J.brands=v(w.brands)),H!==g&&(J.hostname_original=g),a in m&&"1"==m[a])return f("Not sending request when "+a+" is enabled. See "+j+"/dnt");-1!=g.indexOf(".")&&!/^[0-9.:]+$/.test(g)||F||f("Set hostname on "+g+". See "+j+"/overwrite-domain-name");var L,M={},P=(e.referrer||x(E,"referrer")||i.referrer||"").replace(g,H).replace(/^https?:\/\/((m|l|w{2,3}([0-9]+)?)\.)?([^?#]+)(.*)$/,"$4").replace(/^([^/]+)$/,"$1")||u,Z=function(e,t){var n=A(z,{type:"append",original_id:t?e:J.page_id});if(t||!m.sendBeacon)T(n,0,!0);else try{m.sendBeacon.bind(m)(_+"/append",v(n))}catch(r){T(n,0,!0)}};y("pagehide",Z,!1);var G,K,Q=function(e){var t="";try{t=e||d(p.pathname)}catch(X){f(X)}return t},W=function(e,t,n,r,a,i){e&&Z(""+J.page_id,!0),J.page_id=I();var o,c=H+Q(),s=(o=t,(r||p.search).slice(1).split("&").filter(function(e){return!o&&new RegExp("^((utm_)"+(V?"":"?")+"(source|medium|content|term|campaign)"+(V?"":"|ref")+")=","i").test(e)}).join("&")||u);T({id:J.page_id,type:"pageview",referrer:!t||n?P:null,query:s}),P=c,0};!function(e,t,n,r){!r&&N(n)&&(r=n);var a,i;N(r);q(t)&&-1>e/4).toString(16)})}catch(r){return e.replace(n,function(e){var t=16*Math.random()|0;return(e<2?t:3&t|8).toString(16)})}},N=function(e){return"function"==typeof e},R="namespace",U=e[R]||x(E,R)||"sa",V=e.strictUtm||"true"==x(E,"strict-utm"),B=U+"_loaded";if(1==f[B])return m(c+"twice");f.sa_event_loaded=!0,f[B]=!0;var C,T=function(t,e,n){t=n?t:A(J,M,t),g.brave&&!n&&(t.brave=!0),g._duckduckgoloader_&&!n&&(t.duck=!0),(new Image).src=_+"/simple.gif?"+Object.keys(t).filter(function(e){return t[e]!=u}).map(function(e){return s(e)+"="+s(t[e])}).join("&")+"&time="+Date.now()},F=e.hostname||x(E,"hostname"),H=F||h,z={version:"cdn_light_12",hostname:H};e.mode||x(E,"mode");try{C=Intl.DateTimeFormat().resolvedOptions().timeZone}catch(X){m(X)}k&&(z.bot=!0);var J=A(z,{ua:o,https:p.protocol==n,timezone:C,page_id:I(),session_id:I()});if(J.sri=!0,w&&(J.mobile=w.mobile,J.brands=l(w.brands)),H!==h&&(J.hostname_original=h),a in g&&"1"==g[a])return m("Not sending request when "+a+" is enabled. See "+j+"/dnt");-1!=h.indexOf(".")&&!/^[0-9.:]+$/.test(h)||F||m("Set hostname on "+h+". See "+j+"/overwrite-domain-name");var L,M={},P=(e.referrer||x(E,"referrer")||i.referrer||"").replace(h,H).replace(/^https?:\/\/((m|l|w{2,3}([0-9]+)?)\.)?([^?#]+)(.*)$/,"$4").replace(/^([^/]+)$/,"$1")||u,Z=function(e,t){var n=A(z,{type:"append",original_id:t?e:J.page_id});if(t||!g.sendBeacon)T(n,0,!0);else try{g.sendBeacon.bind(g)(_+"/append",l(n))}catch(r){T(n,0,!0)}};y("pagehide",Z,!1);var G,K,Q=function(e){var t="";try{t=e||d(p.pathname)}catch(X){m(X)}return t},W=function(e,t,n,r,a,i){e&&Z(""+J.page_id,!0),J.page_id=I();var o,c=H+Q(),s=(o=t,(r||p.search).slice(1).split("&").filter(function(e){return!o&&new RegExp("^((utm_)"+(V?"":"?")+"(source|medium|content|term|campaign)"+(V?"":"|ref")+")=","i").test(e)}).join("&")||u);T({id:J.page_id,type:"pageview",referrer:!t||n?P:null,query:s}),P=c,0};!function(e,t,n,r){!r&&N(n)&&(r=n);N(r);var a,i="";q(t)&&-1> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n if (ignore) return falseVar;\n // eslint-disable-next-line no-redeclare\n var regex =\n \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \")=\";\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n return q || undefinedVar;\n };\n\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData, keepalive) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n var imageUrl =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n\n image.src = imageUrl;\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n\n\n\n\n\n\n\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n // eslint-disable-next-line no-redeclare\n var bot = isBotAgent;\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = trueVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n\n\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n sameSite = referrer\n ? referrer.split(slash)[0] == locationHostname\n : falseVar;\n\n\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n\n\n pageview();\n\n } catch (e) {\n warn(e);\n }\n})(\n window,\n {},\n \"simpleanalyticscdn.com\",\n \"queue.\",\n \"cdn_light_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","warn","undefinedVar","undefined","https","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","protocol","language","documentElement","uaData","userAgentData","platformText","platformVersionText","docsUrl","isBotAgent","test","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","isString","string","attr","attribute","getAttribute","assign","obj","prop","object","to","arg","index","length","nextSource","constructor","Object","nextKey","hasOwnProperty","settings","sa_settings","logSettings","keys","Date","now","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","replace","c","getRandomValues","Uint8Array","toString","error","r","Math","random","isFunction","func","namespaceText","namespace","strictUtm","loadedVariable","sa_event_loaded","timezone","sendData","data","callback","onlyThisData","keepalive","payload","page","brave","_duckduckgoloader_","duck","image","Image","imageUrl","filter","key","map","join","src","overwrittenHostname","hostname","definedHostname","basePayload","version","mode","Intl","DateTimeFormat","resolvedOptions","timeZone","bot","ua","page_id","session_id","sri","mobile","brands","hostname_original","indexOf","lastSendPath","referrer","sendOnLeave","id","push","append","type","original_id","sendBeacon","bind","e","sameSite","userNavigated","getPath","overwrite","path","pathname","sendPageView","isPushState","deleteSourceInfo","search","metadata","ignoreSource","currentPage","query","split","keyValue","RegExp","pages","pathOverwrite","callbackRaw","querySearch","parts","shift","performaceEntryType","perf","performance","navigationText","getEntriesByType","triggerSendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","pageview"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"light.source.js","sources":["light.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n\n var collectMetricByString = function (metricAbbreviation) {\n // eslint-disable-next-line no-unreachable\n return true;\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n if (ignore) return falseVar;\n // eslint-disable-next-line no-redeclare\n var regex =\n \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \")=\";\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n return q || undefinedVar;\n };\n\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n\n\n\n\n\n\n\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n // eslint-disable-next-line no-redeclare\n var bot = isBotAgent;\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = trueVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n\n\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch = \"\";\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n var pathKey = path + querySearch;\n if (!path || lastSendPath == pathKey) return;\n\n lastSendPath = pathKey;\n page.path = path;\n\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n sameSite = referrer\n ? referrer.split(slash)[0] == locationHostname\n : falseVar;\n\n\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n\n\n pageview();\n\n } catch (e) {\n warn(e);\n }\n})(\n window,\n {},\n \"simpleanalyticscdn.com\",\n \"queue.\",\n \"cdn_light_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","warn","undefinedVar","undefined","https","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","protocol","language","documentElement","uaData","userAgentData","platformText","platformVersionText","docsUrl","isBotAgent","test","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","isString","string","attr","attribute","getAttribute","assign","obj","prop","object","to","arg","index","length","nextSource","constructor","Object","nextKey","hasOwnProperty","settings","sa_settings","logSettings","keys","Date","now","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","replace","c","getRandomValues","Uint8Array","toString","error","r","Math","random","isFunction","func","namespaceText","namespace","strictUtm","loadedVariable","sa_event_loaded","timezone","sendData","data","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","Image","src","filter","key","map","join","overwrittenHostname","hostname","definedHostname","basePayload","version","mode","Intl","DateTimeFormat","resolvedOptions","timeZone","bot","ua","page_id","session_id","sri","mobile","brands","hostname_original","indexOf","lastSendPath","referrer","sendOnLeave","id","push","append","type","original_id","sendBeacon","bind","e","sameSite","userNavigated","getPath","overwrite","path","pathname","sendPageView","isPushState","deleteSourceInfo","search","metadata","ignoreSource","currentPage","query","split","keyValue","RegExp","pages","pathOverwrite","callbackRaw","parts","querySearch","shift","pathKey","performaceEntryType","perf","performance","navigationText","getEntriesByType","triggerSendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","pageview"],"mappings":"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"} \ No newline at end of file diff --git a/src/default.js b/src/default.js index a22de199..8e375708 100644 --- a/src/default.js +++ b/src/default.js @@ -834,7 +834,7 @@ ) { if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata; var callback = isFunction(callbackRaw) ? callbackRaw : function () {}; - var querySearch; + var querySearch = ""; if (isString(pathOverwrite) && pathOverwrite.indexOf("?") > -1) { // keep query from manual path var parts = pathOverwrite.split("?"); @@ -845,9 +845,10 @@ var path = getPath(pathOverwrite); // Don't send the last path again (this could happen when pushState is used to change the path hash or search) - if (!path || lastSendPath == path) return; + var pathKey = path + querySearch; + if (!path || lastSendPath == pathKey) return; - lastSendPath = path; + lastSendPath = pathKey; page.path = path; /** if screen **/ diff --git a/test/unit/pageview-query.test.js b/test/unit/pageview-query.test.js index bccac339..b4378b98 100644 --- a/test/unit/pageview-query.test.js +++ b/test/unit/pageview-query.test.js @@ -2,6 +2,75 @@ const { expect } = require("chai"); const { createDOM } = require("./helpers/dom"); describe("pageview query", function () { + it("keeps accepting numeric manual paths and path-overwriter results", function () { + const dom = createDOM({ settings: { autoCollect: false } }); + dom.window.sa_pageview(123); + expect(new URL(dom.sent[0].url).searchParams.get("path")).to.equal("123"); + dom.window.close(); + + const rewritten = createDOM({ + settings: { autoCollect: false, pathOverwriter: "rewrite" }, + beforeRun(context) { + context.rewrite = () => 456; + }, + }); + rewritten.window.sa_pageview("/product?product-id=1"); + expect(new URL(rewritten.sent[0].url).searchParams.get("path")).to.equal( + "456" + ); + rewritten.window.close(); + }); + + it("keeps ignore-pages active for manual query paths", function () { + const dom = createDOM({ + settings: { autoCollect: false, ignorePages: "/product" }, + }); + dom.window.sa_pageview("/product?product-id=1"); + expect(dom.sent).to.deep.equal([]); + dom.window.close(); + }); + + it("keeps the hash route when stripping a manual query", function () { + const dom = createDOM({ + url: "https://example.com/#/deep", + settings: { autoCollect: false, mode: "hash" }, + }); + dom.window.sa_pageview("/product?product-id=1"); + const url = new URL(dom.sent[0].url); + expect(url.searchParams.get("path")).to.equal("/product#/deep"); + dom.window.close(); + }); + + it("keeps manual pageviews that differ only in their query", function () { + const dom = createDOM({ settings: { autoCollect: false } }); + dom.window.sa_pageview("/product?product-id=1"); + dom.window.sa_pageview("/product?product-id=2"); + dom.window.sa_pageview("/product?product-id=2"); + const paths = dom.sent + .filter((request) => request.type === "image") + .map((request) => new URL(request.url).searchParams.get("path")); + expect(paths).to.deep.equal(["/product", "/product"]); + dom.window.close(); + }); + + it("passes manual paths without the query to the path overwriter", function () { + const paths = []; + const dom = createDOM({ + settings: { autoCollect: false, pathOverwriter: "rewrite" }, + beforeRun(context) { + context.rewrite = ({ path }) => { + paths.push(path); + return path === "/product" ? "/rewritten" : path; + }; + }, + }); + dom.window.sa_pageview("/product?product-id=1"); + expect(paths[0]).to.equal("/product"); + const url = new URL(dom.sent[0].url); + expect(url.searchParams.get("path")).to.equal("/rewritten"); + dom.window.close(); + }); + it("sends query params from manual path", function (done) { const dom = createDOM({ settings: { autoCollect: false, allowParams: "foo" }, From b568ca3445e1f302d55ab5b5be60881468a0750a Mon Sep 17 00:00:00 2001 From: "simple-analytics-ai[bot]" <313929673+simple-analytics-ai[bot]@users.noreply.github.com> Date: Thu, 15 Oct 2026 16:33:50 +0200 Subject: [PATCH 55/62] Leave phone click navigation to the website and browser (#111) Requested in item 5: prevent unwanted telephone navigation from analytics callbacks while retaining default outbound, email, download, and phone collection when data-collect is omitted. Refs #107 Co-authored-by: Simple Analytics Codex --- dist/latest/auto-events.js | 4 +-- dist/latest/auto-events.js.map | 2 +- dist/latest/custom/auto-events.js | 4 +-- dist/latest/custom/auto-events.js.map | 2 +- dist/v12/auto-events.js | 4 +-- dist/v12/auto-events.js.map | 2 +- dist/v12/custom/auto-events.js | 4 +-- dist/v12/custom/auto-events.js.map | 2 +- src/auto-events.js | 1 + test/unit/auto-events.test.js | 50 +++++++++++++++++++++++++++ 10 files changed, 63 insertions(+), 12 deletions(-) diff --git a/dist/latest/auto-events.js b/dist/latest/auto-events.js index d48601dd..390bd44f 100644 --- a/dist/latest/auto-events.js +++ b/dist/latest/auto-events.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-16; e658; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-15; 3352; v12) */ -function r(t,e){var n,o;t.hasAttribute("data-simple-event")||(n=!1,b.downloads&&/^https?:\/\//i.test(t.href)&&new RegExp("\\.("+(b.downloadsExtensions||[]).join("|")+")$","i").test(t.pathname)?n="download":b.outbound&&/^https?:\/\//i.test(t.href)&&t.hostname!==h.location.hostname?n="outbound":b.emails&&/^mailto:/i.test(t.href)?n="email":b.phones&&/^tel:/i.test(t.href)&&(n="phone"),n&&(e?(o="saAutomatedLink(this, '"+n+"');",t.hasAttribute("target")&&"_self"!==t.getAttribute("target")||(o+=" return false;"),t.setAttribute("onclick",o)):t.addEventListener("click",function(){g(this,n)})))}function e(){try{for(var t=document.getElementsByTagName("a"),e=0;e -1,\n emails: collectTypes.indexOf(\"emails\") > -1,\n downloads: collectTypes.indexOf(\"downloads\") > -1,\n phones: collectTypes.indexOf(\"phones\") > -1,\n // Downloads: enter file extensions you want to collect\n downloadsExtensions: setting(\"extensions\", \"array\", [\n \"pdf\",\n \"csv\",\n \"docx\",\n \"xlsx\",\n \"zip\",\n \"doc\",\n \"xls\",\n ]),\n\n // All: use title attribute if set for event name (for all events)\n // THIS TAKES PRECEDENCE OVER OTHER SETTINGS BELOW\n title: setting(\"useTitle\", \"bool\", true),\n // Outbound: use full URL of the links? false for just the hostname\n outboundFullUrl: fullUrls,\n // Downloads: if taking event name from URL, use full URL or just filename (default)\n downloadsFullUrl: fullUrls,\n };\n\n var saGlobal = setting(\"saGlobal\", \"string\", \"sa_event\");\n\n // For compiling the script\n var optionsLink = options;\n\n if (typeof optionsLink === \"undefined\")\n log(\"options object not found, please specify\", \"warn\");\n\n var saAutomatedLink = function saAutomatedLink(element, type) {\n try {\n if (!element) return log(\"no element found\");\n var sent = false;\n\n var callback = function () {\n if (\n !sent &&\n (!element.hasAttribute(\"target\") ||\n element.getAttribute(\"target\") === \"_self\")\n )\n document.location = element.getAttribute(\"href\");\n sent = true;\n };\n\n if (window[saGlobal] && window[saGlobal + \"_loaded\"]) {\n var hostname = element.hostname;\n var pathname = element.pathname;\n\n var event;\n var metadata = {\n title: element.getAttribute(\"title\") || undefined,\n };\n var url = element.href || undefined;\n\n var useTitle = false;\n if (optionsLink.title && element.hasAttribute(\"title\")) {\n var theTitle = element.getAttribute(\"title\").trim();\n if (theTitle != \"\") useTitle = true;\n }\n\n if (useTitle) {\n event = theTitle;\n } else {\n switch (type) {\n case \"outbound\": {\n event = hostname + (optionsLink.outboundFullUrl ? pathname : \"\");\n metadata.url = url;\n break;\n }\n case \"download\": {\n event = optionsLink.downloadsFullUrl\n ? hostname + pathname\n : pathname.split(\"/\").pop();\n metadata.url = url;\n break;\n }\n case \"email\": {\n var href = element.getAttribute(\"href\");\n event = (href.split(\":\")[1] || \"\").split(\"?\")[0];\n metadata.email = event;\n break;\n }\n case \"phone\": {\n var hrefPhone = element.getAttribute(\"href\");\n event = (hrefPhone.split(\":\")[1] || \"\").split(\"?\")[0];\n metadata.phone = event;\n break;\n }\n }\n }\n\n var clean =\n type +\n \"_\" +\n event.replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_+|_+$)/g, \"\");\n\n window[saGlobal](clean, metadata, callback);\n\n log(\"collected \" + clean);\n\n return type === \"email\" || type === \"phone\"\n ? callback()\n : window.setTimeout(callback, 5000);\n } else {\n log(saGlobal + \" is not defined\", \"warn\");\n return callback();\n }\n } catch (error) {\n log(error.message, \"warn\");\n }\n };\n\n window.saAutomatedLink = saAutomatedLink;\n\n function collectLink(link, onclick) {\n if (link.hasAttribute(\"data-simple-event\")) return;\n var collect = false;\n\n // Collect download clicks\n if (\n optionsLink.downloads &&\n /^https?:\\/\\//i.test(link.href) &&\n new RegExp(\n \"\\\\.(\" + (optionsLink.downloadsExtensions || []).join(\"|\") + \")$\",\n \"i\"\n ).test(link.pathname)\n ) {\n collect = \"download\";\n\n // Collect outbound links clicks\n } else if (\n optionsLink.outbound &&\n /^https?:\\/\\//i.test(link.href) &&\n link.hostname !== window.location.hostname\n ) {\n collect = \"outbound\";\n\n // Collect email clicks\n } else if (optionsLink.emails && /^mailto:/i.test(link.href)) {\n collect = \"email\";\n\n // Collect telephone clicks\n } else if (optionsLink.phones && /^tel:/i.test(link.href)) {\n collect = \"phone\";\n }\n\n if (!collect) return;\n\n if (onclick) {\n var onClickAttribute = \"saAutomatedLink(this, '\" + collect + \"');\";\n\n if (\n !link.hasAttribute(\"target\") ||\n link.getAttribute(\"target\") === \"_self\"\n )\n onClickAttribute += \" return false;\";\n\n link.setAttribute(\"onclick\", onClickAttribute);\n } else {\n link.addEventListener(\"click\", function () {\n saAutomatedLink(this, collect);\n });\n }\n }\n\n function onDOMContentLoaded() {\n try {\n var a = document.getElementsByTagName(\"a\");\n\n // Loop over all links on the page\n for (var i = 0; i < a.length; i++) {\n var link = a[i];\n var href = link.getAttribute(\"href\");\n\n // Skip links that don't have an href\n if (!href) continue;\n\n // We don't want to overwrite website behaviour so we check for the onclick attribute\n if (\n !link.getAttribute(\"onclick\") &&\n !/^mailto:/.test(href) &&\n !/^tel:/.test(href)\n ) {\n collectLink(link, true);\n } else {\n collectLink(link, false);\n }\n }\n } catch (error) {\n log(error.message, \"warn\");\n }\n }\n\n if (doc.readyState === \"ready\" || doc.readyState === \"complete\") {\n onDOMContentLoaded();\n } else {\n document.addEventListener(\"readystatechange\", function (event) {\n if (event.target.readyState === \"complete\") onDOMContentLoaded();\n });\n }\n})(window);\n"],"names":["collectLink","link","onclick","collect","onClickAttribute","hasAttribute","optionsLink","downloads","test","href","RegExp","downloadsExtensions","join","pathname","outbound","hostname","window","location","emails","phones","getAttribute","setAttribute","addEventListener","saAutomatedLink","this","onDOMContentLoaded","a","document","getElementsByTagName","i","length","error","log","message","doc","scriptElement","setting","collectTypes","fullUrls","options","saGlobal","type","logger","console","warn","info","currentScript","querySelector","attribute","defaultValue","value","dataset","split","map","item","trim","filter","Boolean","indexOf","title","outboundFullUrl","downloadsFullUrl","element","sent","callback","theTitle","metadata","undefined","url","useTitle","event","pop","email","phone","clean","replace","setTimeout","readyState","target"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"auto-events.source.js","sources":["auto-events.source.js"],"sourcesContent":["(function saAutomatedEvents(window) {\n // Skip server side rendered pages\n if (typeof window === \"undefined\") return;\n\n var log = function (message, type) {\n var logger = type === \"warn\" ? console.warn : console.info;\n return logger && logger(\"Simple Analytics auto events:\", message);\n };\n\n var doc = window.document;\n\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"auto-events.js\"]');\n\n var setting = function (attribute, type, defaultValue) {\n var value = scriptElement && scriptElement.dataset[attribute];\n\n // Booleans\n if (type === \"bool\" && (value === \"true\" || value === \"false\"))\n return value === \"true\";\n else if (type === \"bool\") return defaultValue;\n\n // Arrays\n if (type === \"array\" && value)\n return value\n .split(\",\")\n .map(function (item) {\n return item.trim();\n })\n .filter(Boolean);\n else if (type === \"array\") return defaultValue;\n\n return value || defaultValue;\n };\n\n var collectTypes = setting(\"collect\", \"array\", [\n \"outbound\",\n \"emails\",\n \"downloads\",\n \"phones\",\n ]);\n var fullUrls = setting(\"fullUrls\", \"bool\", false);\n\n var options = {\n // What to collect\n outbound: collectTypes.indexOf(\"outbound\") > -1,\n emails: collectTypes.indexOf(\"emails\") > -1,\n downloads: collectTypes.indexOf(\"downloads\") > -1,\n phones: collectTypes.indexOf(\"phones\") > -1,\n // Downloads: enter file extensions you want to collect\n downloadsExtensions: setting(\"extensions\", \"array\", [\n \"pdf\",\n \"csv\",\n \"docx\",\n \"xlsx\",\n \"zip\",\n \"doc\",\n \"xls\",\n ]),\n\n // All: use title attribute if set for event name (for all events)\n // THIS TAKES PRECEDENCE OVER OTHER SETTINGS BELOW\n title: setting(\"useTitle\", \"bool\", true),\n // Outbound: use full URL of the links? false for just the hostname\n outboundFullUrl: fullUrls,\n // Downloads: if taking event name from URL, use full URL or just filename (default)\n downloadsFullUrl: fullUrls,\n };\n\n var saGlobal = setting(\"saGlobal\", \"string\", \"sa_event\");\n\n // For compiling the script\n var optionsLink = options;\n\n if (typeof optionsLink === \"undefined\")\n log(\"options object not found, please specify\", \"warn\");\n\n var saAutomatedLink = function saAutomatedLink(element, type) {\n try {\n if (!element) return log(\"no element found\");\n var sent = false;\n\n var callback = function () {\n if (\n type !== \"phone\" &&\n !sent &&\n (!element.hasAttribute(\"target\") ||\n element.getAttribute(\"target\") === \"_self\")\n )\n document.location = element.getAttribute(\"href\");\n sent = true;\n };\n\n if (window[saGlobal] && window[saGlobal + \"_loaded\"]) {\n var hostname = element.hostname;\n var pathname = element.pathname;\n\n var event;\n var metadata = {\n title: element.getAttribute(\"title\") || undefined,\n };\n var url = element.href || undefined;\n\n var useTitle = false;\n if (optionsLink.title && element.hasAttribute(\"title\")) {\n var theTitle = element.getAttribute(\"title\").trim();\n if (theTitle != \"\") useTitle = true;\n }\n\n if (useTitle) {\n event = theTitle;\n } else {\n switch (type) {\n case \"outbound\": {\n event = hostname + (optionsLink.outboundFullUrl ? pathname : \"\");\n metadata.url = url;\n break;\n }\n case \"download\": {\n event = optionsLink.downloadsFullUrl\n ? hostname + pathname\n : pathname.split(\"/\").pop();\n metadata.url = url;\n break;\n }\n case \"email\": {\n var href = element.getAttribute(\"href\");\n event = (href.split(\":\")[1] || \"\").split(\"?\")[0];\n metadata.email = event;\n break;\n }\n case \"phone\": {\n var hrefPhone = element.getAttribute(\"href\");\n event = (hrefPhone.split(\":\")[1] || \"\").split(\"?\")[0];\n metadata.phone = event;\n break;\n }\n }\n }\n\n var clean =\n type +\n \"_\" +\n event.replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_+|_+$)/g, \"\");\n\n window[saGlobal](clean, metadata, callback);\n\n log(\"collected \" + clean);\n\n return type === \"email\" || type === \"phone\"\n ? callback()\n : window.setTimeout(callback, 5000);\n } else {\n log(saGlobal + \" is not defined\", \"warn\");\n return callback();\n }\n } catch (error) {\n log(error.message, \"warn\");\n }\n };\n\n window.saAutomatedLink = saAutomatedLink;\n\n function collectLink(link, onclick) {\n if (link.hasAttribute(\"data-simple-event\")) return;\n var collect = false;\n\n // Collect download clicks\n if (\n optionsLink.downloads &&\n /^https?:\\/\\//i.test(link.href) &&\n new RegExp(\n \"\\\\.(\" + (optionsLink.downloadsExtensions || []).join(\"|\") + \")$\",\n \"i\"\n ).test(link.pathname)\n ) {\n collect = \"download\";\n\n // Collect outbound links clicks\n } else if (\n optionsLink.outbound &&\n /^https?:\\/\\//i.test(link.href) &&\n link.hostname !== window.location.hostname\n ) {\n collect = \"outbound\";\n\n // Collect email clicks\n } else if (optionsLink.emails && /^mailto:/i.test(link.href)) {\n collect = \"email\";\n\n // Collect telephone clicks\n } else if (optionsLink.phones && /^tel:/i.test(link.href)) {\n collect = \"phone\";\n }\n\n if (!collect) return;\n\n if (onclick) {\n var onClickAttribute = \"saAutomatedLink(this, '\" + collect + \"');\";\n\n if (\n !link.hasAttribute(\"target\") ||\n link.getAttribute(\"target\") === \"_self\"\n )\n onClickAttribute += \" return false;\";\n\n link.setAttribute(\"onclick\", onClickAttribute);\n } else {\n link.addEventListener(\"click\", function () {\n saAutomatedLink(this, collect);\n });\n }\n }\n\n function onDOMContentLoaded() {\n try {\n var a = document.getElementsByTagName(\"a\");\n\n // Loop over all links on the page\n for (var i = 0; i < a.length; i++) {\n var link = a[i];\n var href = link.getAttribute(\"href\");\n\n // Skip links that don't have an href\n if (!href) continue;\n\n // We don't want to overwrite website behaviour so we check for the onclick attribute\n if (\n !link.getAttribute(\"onclick\") &&\n !/^mailto:/.test(href) &&\n !/^tel:/.test(href)\n ) {\n collectLink(link, true);\n } else {\n collectLink(link, false);\n }\n }\n } catch (error) {\n log(error.message, \"warn\");\n }\n }\n\n if (doc.readyState === \"ready\" || doc.readyState === \"complete\") {\n onDOMContentLoaded();\n } else {\n document.addEventListener(\"readystatechange\", function (event) {\n if (event.target.readyState === \"complete\") onDOMContentLoaded();\n });\n }\n})(window);\n"],"names":["collectLink","link","onclick","collect","onClickAttribute","hasAttribute","optionsLink","downloads","test","href","RegExp","downloadsExtensions","join","pathname","outbound","hostname","window","location","emails","phones","getAttribute","setAttribute","addEventListener","saAutomatedLink","this","onDOMContentLoaded","a","document","getElementsByTagName","i","length","error","log","message","doc","scriptElement","setting","collectTypes","fullUrls","options","saGlobal","type","logger","console","warn","info","currentScript","querySelector","attribute","defaultValue","value","dataset","split","map","item","trim","filter","Boolean","indexOf","title","outboundFullUrl","downloadsFullUrl","element","sent","callback","theTitle","metadata","undefined","url","useTitle","event","pop","email","phone","clean","replace","setTimeout","readyState","target"],"mappings":"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"} \ No newline at end of file diff --git a/dist/latest/custom/auto-events.js b/dist/latest/custom/auto-events.js index d48601dd..390bd44f 100644 --- a/dist/latest/custom/auto-events.js +++ b/dist/latest/custom/auto-events.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-16; e658; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-15; 3352; v12) */ -function r(t,e){var n,o;t.hasAttribute("data-simple-event")||(n=!1,b.downloads&&/^https?:\/\//i.test(t.href)&&new RegExp("\\.("+(b.downloadsExtensions||[]).join("|")+")$","i").test(t.pathname)?n="download":b.outbound&&/^https?:\/\//i.test(t.href)&&t.hostname!==h.location.hostname?n="outbound":b.emails&&/^mailto:/i.test(t.href)?n="email":b.phones&&/^tel:/i.test(t.href)&&(n="phone"),n&&(e?(o="saAutomatedLink(this, '"+n+"');",t.hasAttribute("target")&&"_self"!==t.getAttribute("target")||(o+=" return false;"),t.setAttribute("onclick",o)):t.addEventListener("click",function(){g(this,n)})))}function e(){try{for(var t=document.getElementsByTagName("a"),e=0;e -1,\n emails: collectTypes.indexOf(\"emails\") > -1,\n downloads: collectTypes.indexOf(\"downloads\") > -1,\n phones: collectTypes.indexOf(\"phones\") > -1,\n // Downloads: enter file extensions you want to collect\n downloadsExtensions: setting(\"extensions\", \"array\", [\n \"pdf\",\n \"csv\",\n \"docx\",\n \"xlsx\",\n \"zip\",\n \"doc\",\n \"xls\",\n ]),\n\n // All: use title attribute if set for event name (for all events)\n // THIS TAKES PRECEDENCE OVER OTHER SETTINGS BELOW\n title: setting(\"useTitle\", \"bool\", true),\n // Outbound: use full URL of the links? false for just the hostname\n outboundFullUrl: fullUrls,\n // Downloads: if taking event name from URL, use full URL or just filename (default)\n downloadsFullUrl: fullUrls,\n };\n\n var saGlobal = setting(\"saGlobal\", \"string\", \"sa_event\");\n\n // For compiling the script\n var optionsLink = options;\n\n if (typeof optionsLink === \"undefined\")\n log(\"options object not found, please specify\", \"warn\");\n\n var saAutomatedLink = function saAutomatedLink(element, type) {\n try {\n if (!element) return log(\"no element found\");\n var sent = false;\n\n var callback = function () {\n if (\n !sent &&\n (!element.hasAttribute(\"target\") ||\n element.getAttribute(\"target\") === \"_self\")\n )\n document.location = element.getAttribute(\"href\");\n sent = true;\n };\n\n if (window[saGlobal] && window[saGlobal + \"_loaded\"]) {\n var hostname = element.hostname;\n var pathname = element.pathname;\n\n var event;\n var metadata = {\n title: element.getAttribute(\"title\") || undefined,\n };\n var url = element.href || undefined;\n\n var useTitle = false;\n if (optionsLink.title && element.hasAttribute(\"title\")) {\n var theTitle = element.getAttribute(\"title\").trim();\n if (theTitle != \"\") useTitle = true;\n }\n\n if (useTitle) {\n event = theTitle;\n } else {\n switch (type) {\n case \"outbound\": {\n event = hostname + (optionsLink.outboundFullUrl ? pathname : \"\");\n metadata.url = url;\n break;\n }\n case \"download\": {\n event = optionsLink.downloadsFullUrl\n ? hostname + pathname\n : pathname.split(\"/\").pop();\n metadata.url = url;\n break;\n }\n case \"email\": {\n var href = element.getAttribute(\"href\");\n event = (href.split(\":\")[1] || \"\").split(\"?\")[0];\n metadata.email = event;\n break;\n }\n case \"phone\": {\n var hrefPhone = element.getAttribute(\"href\");\n event = (hrefPhone.split(\":\")[1] || \"\").split(\"?\")[0];\n metadata.phone = event;\n break;\n }\n }\n }\n\n var clean =\n type +\n \"_\" +\n event.replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_+|_+$)/g, \"\");\n\n window[saGlobal](clean, metadata, callback);\n\n log(\"collected \" + clean);\n\n return type === \"email\" || type === \"phone\"\n ? callback()\n : window.setTimeout(callback, 5000);\n } else {\n log(saGlobal + \" is not defined\", \"warn\");\n return callback();\n }\n } catch (error) {\n log(error.message, \"warn\");\n }\n };\n\n window.saAutomatedLink = saAutomatedLink;\n\n function collectLink(link, onclick) {\n if (link.hasAttribute(\"data-simple-event\")) return;\n var collect = false;\n\n // Collect download clicks\n if (\n optionsLink.downloads &&\n /^https?:\\/\\//i.test(link.href) &&\n new RegExp(\n \"\\\\.(\" + (optionsLink.downloadsExtensions || []).join(\"|\") + \")$\",\n \"i\"\n ).test(link.pathname)\n ) {\n collect = \"download\";\n\n // Collect outbound links clicks\n } else if (\n optionsLink.outbound &&\n /^https?:\\/\\//i.test(link.href) &&\n link.hostname !== window.location.hostname\n ) {\n collect = \"outbound\";\n\n // Collect email clicks\n } else if (optionsLink.emails && /^mailto:/i.test(link.href)) {\n collect = \"email\";\n\n // Collect telephone clicks\n } else if (optionsLink.phones && /^tel:/i.test(link.href)) {\n collect = \"phone\";\n }\n\n if (!collect) return;\n\n if (onclick) {\n var onClickAttribute = \"saAutomatedLink(this, '\" + collect + \"');\";\n\n if (\n !link.hasAttribute(\"target\") ||\n link.getAttribute(\"target\") === \"_self\"\n )\n onClickAttribute += \" return false;\";\n\n link.setAttribute(\"onclick\", onClickAttribute);\n } else {\n link.addEventListener(\"click\", function () {\n saAutomatedLink(this, collect);\n });\n }\n }\n\n function onDOMContentLoaded() {\n try {\n var a = document.getElementsByTagName(\"a\");\n\n // Loop over all links on the page\n for (var i = 0; i < a.length; i++) {\n var link = a[i];\n var href = link.getAttribute(\"href\");\n\n // Skip links that don't have an href\n if (!href) continue;\n\n // We don't want to overwrite website behaviour so we check for the onclick attribute\n if (\n !link.getAttribute(\"onclick\") &&\n !/^mailto:/.test(href) &&\n !/^tel:/.test(href)\n ) {\n collectLink(link, true);\n } else {\n collectLink(link, false);\n }\n }\n } catch (error) {\n log(error.message, \"warn\");\n }\n }\n\n if (doc.readyState === \"ready\" || doc.readyState === \"complete\") {\n onDOMContentLoaded();\n } else {\n document.addEventListener(\"readystatechange\", function (event) {\n if (event.target.readyState === \"complete\") onDOMContentLoaded();\n });\n }\n})(window);\n"],"names":["collectLink","link","onclick","collect","onClickAttribute","hasAttribute","optionsLink","downloads","test","href","RegExp","downloadsExtensions","join","pathname","outbound","hostname","window","location","emails","phones","getAttribute","setAttribute","addEventListener","saAutomatedLink","this","onDOMContentLoaded","a","document","getElementsByTagName","i","length","error","log","message","doc","scriptElement","setting","collectTypes","fullUrls","options","saGlobal","type","logger","console","warn","info","currentScript","querySelector","attribute","defaultValue","value","dataset","split","map","item","trim","filter","Boolean","indexOf","title","outboundFullUrl","downloadsFullUrl","element","sent","callback","theTitle","metadata","undefined","url","useTitle","event","pop","email","phone","clean","replace","setTimeout","readyState","target"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"auto-events.source.js","sources":["auto-events.source.js"],"sourcesContent":["(function saAutomatedEvents(window) {\n // Skip server side rendered pages\n if (typeof window === \"undefined\") return;\n\n var log = function (message, type) {\n var logger = type === \"warn\" ? console.warn : console.info;\n return logger && logger(\"Simple Analytics auto events:\", message);\n };\n\n var doc = window.document;\n\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"auto-events.js\"]');\n\n var setting = function (attribute, type, defaultValue) {\n var value = scriptElement && scriptElement.dataset[attribute];\n\n // Booleans\n if (type === \"bool\" && (value === \"true\" || value === \"false\"))\n return value === \"true\";\n else if (type === \"bool\") return defaultValue;\n\n // Arrays\n if (type === \"array\" && value)\n return value\n .split(\",\")\n .map(function (item) {\n return item.trim();\n })\n .filter(Boolean);\n else if (type === \"array\") return defaultValue;\n\n return value || defaultValue;\n };\n\n var collectTypes = setting(\"collect\", \"array\", [\n \"outbound\",\n \"emails\",\n \"downloads\",\n \"phones\",\n ]);\n var fullUrls = setting(\"fullUrls\", \"bool\", false);\n\n var options = {\n // What to collect\n outbound: collectTypes.indexOf(\"outbound\") > -1,\n emails: collectTypes.indexOf(\"emails\") > -1,\n downloads: collectTypes.indexOf(\"downloads\") > -1,\n phones: collectTypes.indexOf(\"phones\") > -1,\n // Downloads: enter file extensions you want to collect\n downloadsExtensions: setting(\"extensions\", \"array\", [\n \"pdf\",\n \"csv\",\n \"docx\",\n \"xlsx\",\n \"zip\",\n \"doc\",\n \"xls\",\n ]),\n\n // All: use title attribute if set for event name (for all events)\n // THIS TAKES PRECEDENCE OVER OTHER SETTINGS BELOW\n title: setting(\"useTitle\", \"bool\", true),\n // Outbound: use full URL of the links? false for just the hostname\n outboundFullUrl: fullUrls,\n // Downloads: if taking event name from URL, use full URL or just filename (default)\n downloadsFullUrl: fullUrls,\n };\n\n var saGlobal = setting(\"saGlobal\", \"string\", \"sa_event\");\n\n // For compiling the script\n var optionsLink = options;\n\n if (typeof optionsLink === \"undefined\")\n log(\"options object not found, please specify\", \"warn\");\n\n var saAutomatedLink = function saAutomatedLink(element, type) {\n try {\n if (!element) return log(\"no element found\");\n var sent = false;\n\n var callback = function () {\n if (\n type !== \"phone\" &&\n !sent &&\n (!element.hasAttribute(\"target\") ||\n element.getAttribute(\"target\") === \"_self\")\n )\n document.location = element.getAttribute(\"href\");\n sent = true;\n };\n\n if (window[saGlobal] && window[saGlobal + \"_loaded\"]) {\n var hostname = element.hostname;\n var pathname = element.pathname;\n\n var event;\n var metadata = {\n title: element.getAttribute(\"title\") || undefined,\n };\n var url = element.href || undefined;\n\n var useTitle = false;\n if (optionsLink.title && element.hasAttribute(\"title\")) {\n var theTitle = element.getAttribute(\"title\").trim();\n if (theTitle != \"\") useTitle = true;\n }\n\n if (useTitle) {\n event = theTitle;\n } else {\n switch (type) {\n case \"outbound\": {\n event = hostname + (optionsLink.outboundFullUrl ? pathname : \"\");\n metadata.url = url;\n break;\n }\n case \"download\": {\n event = optionsLink.downloadsFullUrl\n ? hostname + pathname\n : pathname.split(\"/\").pop();\n metadata.url = url;\n break;\n }\n case \"email\": {\n var href = element.getAttribute(\"href\");\n event = (href.split(\":\")[1] || \"\").split(\"?\")[0];\n metadata.email = event;\n break;\n }\n case \"phone\": {\n var hrefPhone = element.getAttribute(\"href\");\n event = (hrefPhone.split(\":\")[1] || \"\").split(\"?\")[0];\n metadata.phone = event;\n break;\n }\n }\n }\n\n var clean =\n type +\n \"_\" +\n event.replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_+|_+$)/g, \"\");\n\n window[saGlobal](clean, metadata, callback);\n\n log(\"collected \" + clean);\n\n return type === \"email\" || type === \"phone\"\n ? callback()\n : window.setTimeout(callback, 5000);\n } else {\n log(saGlobal + \" is not defined\", \"warn\");\n return callback();\n }\n } catch (error) {\n log(error.message, \"warn\");\n }\n };\n\n window.saAutomatedLink = saAutomatedLink;\n\n function collectLink(link, onclick) {\n if (link.hasAttribute(\"data-simple-event\")) return;\n var collect = false;\n\n // Collect download clicks\n if (\n optionsLink.downloads &&\n /^https?:\\/\\//i.test(link.href) &&\n new RegExp(\n \"\\\\.(\" + (optionsLink.downloadsExtensions || []).join(\"|\") + \")$\",\n \"i\"\n ).test(link.pathname)\n ) {\n collect = \"download\";\n\n // Collect outbound links clicks\n } else if (\n optionsLink.outbound &&\n /^https?:\\/\\//i.test(link.href) &&\n link.hostname !== window.location.hostname\n ) {\n collect = \"outbound\";\n\n // Collect email clicks\n } else if (optionsLink.emails && /^mailto:/i.test(link.href)) {\n collect = \"email\";\n\n // Collect telephone clicks\n } else if (optionsLink.phones && /^tel:/i.test(link.href)) {\n collect = \"phone\";\n }\n\n if (!collect) return;\n\n if (onclick) {\n var onClickAttribute = \"saAutomatedLink(this, '\" + collect + \"');\";\n\n if (\n !link.hasAttribute(\"target\") ||\n link.getAttribute(\"target\") === \"_self\"\n )\n onClickAttribute += \" return false;\";\n\n link.setAttribute(\"onclick\", onClickAttribute);\n } else {\n link.addEventListener(\"click\", function () {\n saAutomatedLink(this, collect);\n });\n }\n }\n\n function onDOMContentLoaded() {\n try {\n var a = document.getElementsByTagName(\"a\");\n\n // Loop over all links on the page\n for (var i = 0; i < a.length; i++) {\n var link = a[i];\n var href = link.getAttribute(\"href\");\n\n // Skip links that don't have an href\n if (!href) continue;\n\n // We don't want to overwrite website behaviour so we check for the onclick attribute\n if (\n !link.getAttribute(\"onclick\") &&\n !/^mailto:/.test(href) &&\n !/^tel:/.test(href)\n ) {\n collectLink(link, true);\n } else {\n collectLink(link, false);\n }\n }\n } catch (error) {\n log(error.message, \"warn\");\n }\n }\n\n if (doc.readyState === \"ready\" || doc.readyState === \"complete\") {\n onDOMContentLoaded();\n } else {\n document.addEventListener(\"readystatechange\", function (event) {\n if (event.target.readyState === \"complete\") onDOMContentLoaded();\n });\n }\n})(window);\n"],"names":["collectLink","link","onclick","collect","onClickAttribute","hasAttribute","optionsLink","downloads","test","href","RegExp","downloadsExtensions","join","pathname","outbound","hostname","window","location","emails","phones","getAttribute","setAttribute","addEventListener","saAutomatedLink","this","onDOMContentLoaded","a","document","getElementsByTagName","i","length","error","log","message","doc","scriptElement","setting","collectTypes","fullUrls","options","saGlobal","type","logger","console","warn","info","currentScript","querySelector","attribute","defaultValue","value","dataset","split","map","item","trim","filter","Boolean","indexOf","title","outboundFullUrl","downloadsFullUrl","element","sent","callback","theTitle","metadata","undefined","url","useTitle","event","pop","email","phone","clean","replace","setTimeout","readyState","target"],"mappings":"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"} \ No newline at end of file diff --git a/dist/v12/auto-events.js b/dist/v12/auto-events.js index 8fc14a1f..fe2cde2d 100644 --- a/dist/v12/auto-events.js +++ b/dist/v12/auto-events.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-16; e658; SRI-version; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-15; 3352; SRI-version; v12) */ -function r(t,e){var n,o;t.hasAttribute("data-simple-event")||(n=!1,b.downloads&&/^https?:\/\//i.test(t.href)&&new RegExp("\\.("+(b.downloadsExtensions||[]).join("|")+")$","i").test(t.pathname)?n="download":b.outbound&&/^https?:\/\//i.test(t.href)&&t.hostname!==h.location.hostname?n="outbound":b.emails&&/^mailto:/i.test(t.href)?n="email":b.phones&&/^tel:/i.test(t.href)&&(n="phone"),n&&(e?(o="saAutomatedLink(this, '"+n+"');",t.hasAttribute("target")&&"_self"!==t.getAttribute("target")||(o+=" return false;"),t.setAttribute("onclick",o)):t.addEventListener("click",function(){g(this,n)})))}function e(){try{for(var t=document.getElementsByTagName("a"),e=0;e -1,\n emails: collectTypes.indexOf(\"emails\") > -1,\n downloads: collectTypes.indexOf(\"downloads\") > -1,\n phones: collectTypes.indexOf(\"phones\") > -1,\n // Downloads: enter file extensions you want to collect\n downloadsExtensions: setting(\"extensions\", \"array\", [\n \"pdf\",\n \"csv\",\n \"docx\",\n \"xlsx\",\n \"zip\",\n \"doc\",\n \"xls\",\n ]),\n\n // All: use title attribute if set for event name (for all events)\n // THIS TAKES PRECEDENCE OVER OTHER SETTINGS BELOW\n title: setting(\"useTitle\", \"bool\", true),\n // Outbound: use full URL of the links? false for just the hostname\n outboundFullUrl: fullUrls,\n // Downloads: if taking event name from URL, use full URL or just filename (default)\n downloadsFullUrl: fullUrls,\n };\n\n var saGlobal = setting(\"saGlobal\", \"string\", \"sa_event\");\n\n // For compiling the script\n var optionsLink = options;\n\n if (typeof optionsLink === \"undefined\")\n log(\"options object not found, please specify\", \"warn\");\n\n var saAutomatedLink = function saAutomatedLink(element, type) {\n try {\n if (!element) return log(\"no element found\");\n var sent = false;\n\n var callback = function () {\n if (\n !sent &&\n (!element.hasAttribute(\"target\") ||\n element.getAttribute(\"target\") === \"_self\")\n )\n document.location = element.getAttribute(\"href\");\n sent = true;\n };\n\n if (window[saGlobal] && window[saGlobal + \"_loaded\"]) {\n var hostname = element.hostname;\n var pathname = element.pathname;\n\n var event;\n var metadata = {\n title: element.getAttribute(\"title\") || undefined,\n };\n var url = element.href || undefined;\n\n var useTitle = false;\n if (optionsLink.title && element.hasAttribute(\"title\")) {\n var theTitle = element.getAttribute(\"title\").trim();\n if (theTitle != \"\") useTitle = true;\n }\n\n if (useTitle) {\n event = theTitle;\n } else {\n switch (type) {\n case \"outbound\": {\n event = hostname + (optionsLink.outboundFullUrl ? pathname : \"\");\n metadata.url = url;\n break;\n }\n case \"download\": {\n event = optionsLink.downloadsFullUrl\n ? hostname + pathname\n : pathname.split(\"/\").pop();\n metadata.url = url;\n break;\n }\n case \"email\": {\n var href = element.getAttribute(\"href\");\n event = (href.split(\":\")[1] || \"\").split(\"?\")[0];\n metadata.email = event;\n break;\n }\n case \"phone\": {\n var hrefPhone = element.getAttribute(\"href\");\n event = (hrefPhone.split(\":\")[1] || \"\").split(\"?\")[0];\n metadata.phone = event;\n break;\n }\n }\n }\n\n var clean =\n type +\n \"_\" +\n event.replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_+|_+$)/g, \"\");\n\n window[saGlobal](clean, metadata, callback);\n\n log(\"collected \" + clean);\n\n return type === \"email\" || type === \"phone\"\n ? callback()\n : window.setTimeout(callback, 5000);\n } else {\n log(saGlobal + \" is not defined\", \"warn\");\n return callback();\n }\n } catch (error) {\n log(error.message, \"warn\");\n }\n };\n\n window.saAutomatedLink = saAutomatedLink;\n\n function collectLink(link, onclick) {\n if (link.hasAttribute(\"data-simple-event\")) return;\n var collect = false;\n\n // Collect download clicks\n if (\n optionsLink.downloads &&\n /^https?:\\/\\//i.test(link.href) &&\n new RegExp(\n \"\\\\.(\" + (optionsLink.downloadsExtensions || []).join(\"|\") + \")$\",\n \"i\"\n ).test(link.pathname)\n ) {\n collect = \"download\";\n\n // Collect outbound links clicks\n } else if (\n optionsLink.outbound &&\n /^https?:\\/\\//i.test(link.href) &&\n link.hostname !== window.location.hostname\n ) {\n collect = \"outbound\";\n\n // Collect email clicks\n } else if (optionsLink.emails && /^mailto:/i.test(link.href)) {\n collect = \"email\";\n\n // Collect telephone clicks\n } else if (optionsLink.phones && /^tel:/i.test(link.href)) {\n collect = \"phone\";\n }\n\n if (!collect) return;\n\n if (onclick) {\n var onClickAttribute = \"saAutomatedLink(this, '\" + collect + \"');\";\n\n if (\n !link.hasAttribute(\"target\") ||\n link.getAttribute(\"target\") === \"_self\"\n )\n onClickAttribute += \" return false;\";\n\n link.setAttribute(\"onclick\", onClickAttribute);\n } else {\n link.addEventListener(\"click\", function () {\n saAutomatedLink(this, collect);\n });\n }\n }\n\n function onDOMContentLoaded() {\n try {\n var a = document.getElementsByTagName(\"a\");\n\n // Loop over all links on the page\n for (var i = 0; i < a.length; i++) {\n var link = a[i];\n var href = link.getAttribute(\"href\");\n\n // Skip links that don't have an href\n if (!href) continue;\n\n // We don't want to overwrite website behaviour so we check for the onclick attribute\n if (\n !link.getAttribute(\"onclick\") &&\n !/^mailto:/.test(href) &&\n !/^tel:/.test(href)\n ) {\n collectLink(link, true);\n } else {\n collectLink(link, false);\n }\n }\n } catch (error) {\n log(error.message, \"warn\");\n }\n }\n\n if (doc.readyState === \"ready\" || doc.readyState === \"complete\") {\n onDOMContentLoaded();\n } else {\n document.addEventListener(\"readystatechange\", function (event) {\n if (event.target.readyState === \"complete\") onDOMContentLoaded();\n });\n }\n})(window);\n"],"names":["collectLink","link","onclick","collect","onClickAttribute","hasAttribute","optionsLink","downloads","test","href","RegExp","downloadsExtensions","join","pathname","outbound","hostname","window","location","emails","phones","getAttribute","setAttribute","addEventListener","saAutomatedLink","this","onDOMContentLoaded","a","document","getElementsByTagName","i","length","error","log","message","doc","scriptElement","setting","collectTypes","fullUrls","options","saGlobal","type","logger","console","warn","info","currentScript","querySelector","attribute","defaultValue","value","dataset","split","map","item","trim","filter","Boolean","indexOf","title","outboundFullUrl","downloadsFullUrl","element","sent","callback","theTitle","metadata","undefined","url","useTitle","event","pop","email","phone","clean","replace","setTimeout","readyState","target"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"auto-events.source.js","sources":["auto-events.source.js"],"sourcesContent":["(function saAutomatedEvents(window) {\n // Skip server side rendered pages\n if (typeof window === \"undefined\") return;\n\n var log = function (message, type) {\n var logger = type === \"warn\" ? console.warn : console.info;\n return logger && logger(\"Simple Analytics auto events:\", message);\n };\n\n var doc = window.document;\n\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"auto-events.js\"]');\n\n var setting = function (attribute, type, defaultValue) {\n var value = scriptElement && scriptElement.dataset[attribute];\n\n // Booleans\n if (type === \"bool\" && (value === \"true\" || value === \"false\"))\n return value === \"true\";\n else if (type === \"bool\") return defaultValue;\n\n // Arrays\n if (type === \"array\" && value)\n return value\n .split(\",\")\n .map(function (item) {\n return item.trim();\n })\n .filter(Boolean);\n else if (type === \"array\") return defaultValue;\n\n return value || defaultValue;\n };\n\n var collectTypes = setting(\"collect\", \"array\", [\n \"outbound\",\n \"emails\",\n \"downloads\",\n \"phones\",\n ]);\n var fullUrls = setting(\"fullUrls\", \"bool\", false);\n\n var options = {\n // What to collect\n outbound: collectTypes.indexOf(\"outbound\") > -1,\n emails: collectTypes.indexOf(\"emails\") > -1,\n downloads: collectTypes.indexOf(\"downloads\") > -1,\n phones: collectTypes.indexOf(\"phones\") > -1,\n // Downloads: enter file extensions you want to collect\n downloadsExtensions: setting(\"extensions\", \"array\", [\n \"pdf\",\n \"csv\",\n \"docx\",\n \"xlsx\",\n \"zip\",\n \"doc\",\n \"xls\",\n ]),\n\n // All: use title attribute if set for event name (for all events)\n // THIS TAKES PRECEDENCE OVER OTHER SETTINGS BELOW\n title: setting(\"useTitle\", \"bool\", true),\n // Outbound: use full URL of the links? false for just the hostname\n outboundFullUrl: fullUrls,\n // Downloads: if taking event name from URL, use full URL or just filename (default)\n downloadsFullUrl: fullUrls,\n };\n\n var saGlobal = setting(\"saGlobal\", \"string\", \"sa_event\");\n\n // For compiling the script\n var optionsLink = options;\n\n if (typeof optionsLink === \"undefined\")\n log(\"options object not found, please specify\", \"warn\");\n\n var saAutomatedLink = function saAutomatedLink(element, type) {\n try {\n if (!element) return log(\"no element found\");\n var sent = false;\n\n var callback = function () {\n if (\n type !== \"phone\" &&\n !sent &&\n (!element.hasAttribute(\"target\") ||\n element.getAttribute(\"target\") === \"_self\")\n )\n document.location = element.getAttribute(\"href\");\n sent = true;\n };\n\n if (window[saGlobal] && window[saGlobal + \"_loaded\"]) {\n var hostname = element.hostname;\n var pathname = element.pathname;\n\n var event;\n var metadata = {\n title: element.getAttribute(\"title\") || undefined,\n };\n var url = element.href || undefined;\n\n var useTitle = false;\n if (optionsLink.title && element.hasAttribute(\"title\")) {\n var theTitle = element.getAttribute(\"title\").trim();\n if (theTitle != \"\") useTitle = true;\n }\n\n if (useTitle) {\n event = theTitle;\n } else {\n switch (type) {\n case \"outbound\": {\n event = hostname + (optionsLink.outboundFullUrl ? pathname : \"\");\n metadata.url = url;\n break;\n }\n case \"download\": {\n event = optionsLink.downloadsFullUrl\n ? hostname + pathname\n : pathname.split(\"/\").pop();\n metadata.url = url;\n break;\n }\n case \"email\": {\n var href = element.getAttribute(\"href\");\n event = (href.split(\":\")[1] || \"\").split(\"?\")[0];\n metadata.email = event;\n break;\n }\n case \"phone\": {\n var hrefPhone = element.getAttribute(\"href\");\n event = (hrefPhone.split(\":\")[1] || \"\").split(\"?\")[0];\n metadata.phone = event;\n break;\n }\n }\n }\n\n var clean =\n type +\n \"_\" +\n event.replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_+|_+$)/g, \"\");\n\n window[saGlobal](clean, metadata, callback);\n\n log(\"collected \" + clean);\n\n return type === \"email\" || type === \"phone\"\n ? callback()\n : window.setTimeout(callback, 5000);\n } else {\n log(saGlobal + \" is not defined\", \"warn\");\n return callback();\n }\n } catch (error) {\n log(error.message, \"warn\");\n }\n };\n\n window.saAutomatedLink = saAutomatedLink;\n\n function collectLink(link, onclick) {\n if (link.hasAttribute(\"data-simple-event\")) return;\n var collect = false;\n\n // Collect download clicks\n if (\n optionsLink.downloads &&\n /^https?:\\/\\//i.test(link.href) &&\n new RegExp(\n \"\\\\.(\" + (optionsLink.downloadsExtensions || []).join(\"|\") + \")$\",\n \"i\"\n ).test(link.pathname)\n ) {\n collect = \"download\";\n\n // Collect outbound links clicks\n } else if (\n optionsLink.outbound &&\n /^https?:\\/\\//i.test(link.href) &&\n link.hostname !== window.location.hostname\n ) {\n collect = \"outbound\";\n\n // Collect email clicks\n } else if (optionsLink.emails && /^mailto:/i.test(link.href)) {\n collect = \"email\";\n\n // Collect telephone clicks\n } else if (optionsLink.phones && /^tel:/i.test(link.href)) {\n collect = \"phone\";\n }\n\n if (!collect) return;\n\n if (onclick) {\n var onClickAttribute = \"saAutomatedLink(this, '\" + collect + \"');\";\n\n if (\n !link.hasAttribute(\"target\") ||\n link.getAttribute(\"target\") === \"_self\"\n )\n onClickAttribute += \" return false;\";\n\n link.setAttribute(\"onclick\", onClickAttribute);\n } else {\n link.addEventListener(\"click\", function () {\n saAutomatedLink(this, collect);\n });\n }\n }\n\n function onDOMContentLoaded() {\n try {\n var a = document.getElementsByTagName(\"a\");\n\n // Loop over all links on the page\n for (var i = 0; i < a.length; i++) {\n var link = a[i];\n var href = link.getAttribute(\"href\");\n\n // Skip links that don't have an href\n if (!href) continue;\n\n // We don't want to overwrite website behaviour so we check for the onclick attribute\n if (\n !link.getAttribute(\"onclick\") &&\n !/^mailto:/.test(href) &&\n !/^tel:/.test(href)\n ) {\n collectLink(link, true);\n } else {\n collectLink(link, false);\n }\n }\n } catch (error) {\n log(error.message, \"warn\");\n }\n }\n\n if (doc.readyState === \"ready\" || doc.readyState === \"complete\") {\n onDOMContentLoaded();\n } else {\n document.addEventListener(\"readystatechange\", function (event) {\n if (event.target.readyState === \"complete\") onDOMContentLoaded();\n });\n }\n})(window);\n"],"names":["collectLink","link","onclick","collect","onClickAttribute","hasAttribute","optionsLink","downloads","test","href","RegExp","downloadsExtensions","join","pathname","outbound","hostname","window","location","emails","phones","getAttribute","setAttribute","addEventListener","saAutomatedLink","this","onDOMContentLoaded","a","document","getElementsByTagName","i","length","error","log","message","doc","scriptElement","setting","collectTypes","fullUrls","options","saGlobal","type","logger","console","warn","info","currentScript","querySelector","attribute","defaultValue","value","dataset","split","map","item","trim","filter","Boolean","indexOf","title","outboundFullUrl","downloadsFullUrl","element","sent","callback","theTitle","metadata","undefined","url","useTitle","event","pop","email","phone","clean","replace","setTimeout","readyState","target"],"mappings":"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"} \ No newline at end of file diff --git a/dist/v12/custom/auto-events.js b/dist/v12/custom/auto-events.js index 8fc14a1f..fe2cde2d 100644 --- a/dist/v12/custom/auto-events.js +++ b/dist/v12/custom/auto-events.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-16; e658; SRI-version; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-15; 3352; SRI-version; v12) */ -function r(t,e){var n,o;t.hasAttribute("data-simple-event")||(n=!1,b.downloads&&/^https?:\/\//i.test(t.href)&&new RegExp("\\.("+(b.downloadsExtensions||[]).join("|")+")$","i").test(t.pathname)?n="download":b.outbound&&/^https?:\/\//i.test(t.href)&&t.hostname!==h.location.hostname?n="outbound":b.emails&&/^mailto:/i.test(t.href)?n="email":b.phones&&/^tel:/i.test(t.href)&&(n="phone"),n&&(e?(o="saAutomatedLink(this, '"+n+"');",t.hasAttribute("target")&&"_self"!==t.getAttribute("target")||(o+=" return false;"),t.setAttribute("onclick",o)):t.addEventListener("click",function(){g(this,n)})))}function e(){try{for(var t=document.getElementsByTagName("a"),e=0;e -1,\n emails: collectTypes.indexOf(\"emails\") > -1,\n downloads: collectTypes.indexOf(\"downloads\") > -1,\n phones: collectTypes.indexOf(\"phones\") > -1,\n // Downloads: enter file extensions you want to collect\n downloadsExtensions: setting(\"extensions\", \"array\", [\n \"pdf\",\n \"csv\",\n \"docx\",\n \"xlsx\",\n \"zip\",\n \"doc\",\n \"xls\",\n ]),\n\n // All: use title attribute if set for event name (for all events)\n // THIS TAKES PRECEDENCE OVER OTHER SETTINGS BELOW\n title: setting(\"useTitle\", \"bool\", true),\n // Outbound: use full URL of the links? false for just the hostname\n outboundFullUrl: fullUrls,\n // Downloads: if taking event name from URL, use full URL or just filename (default)\n downloadsFullUrl: fullUrls,\n };\n\n var saGlobal = setting(\"saGlobal\", \"string\", \"sa_event\");\n\n // For compiling the script\n var optionsLink = options;\n\n if (typeof optionsLink === \"undefined\")\n log(\"options object not found, please specify\", \"warn\");\n\n var saAutomatedLink = function saAutomatedLink(element, type) {\n try {\n if (!element) return log(\"no element found\");\n var sent = false;\n\n var callback = function () {\n if (\n !sent &&\n (!element.hasAttribute(\"target\") ||\n element.getAttribute(\"target\") === \"_self\")\n )\n document.location = element.getAttribute(\"href\");\n sent = true;\n };\n\n if (window[saGlobal] && window[saGlobal + \"_loaded\"]) {\n var hostname = element.hostname;\n var pathname = element.pathname;\n\n var event;\n var metadata = {\n title: element.getAttribute(\"title\") || undefined,\n };\n var url = element.href || undefined;\n\n var useTitle = false;\n if (optionsLink.title && element.hasAttribute(\"title\")) {\n var theTitle = element.getAttribute(\"title\").trim();\n if (theTitle != \"\") useTitle = true;\n }\n\n if (useTitle) {\n event = theTitle;\n } else {\n switch (type) {\n case \"outbound\": {\n event = hostname + (optionsLink.outboundFullUrl ? pathname : \"\");\n metadata.url = url;\n break;\n }\n case \"download\": {\n event = optionsLink.downloadsFullUrl\n ? hostname + pathname\n : pathname.split(\"/\").pop();\n metadata.url = url;\n break;\n }\n case \"email\": {\n var href = element.getAttribute(\"href\");\n event = (href.split(\":\")[1] || \"\").split(\"?\")[0];\n metadata.email = event;\n break;\n }\n case \"phone\": {\n var hrefPhone = element.getAttribute(\"href\");\n event = (hrefPhone.split(\":\")[1] || \"\").split(\"?\")[0];\n metadata.phone = event;\n break;\n }\n }\n }\n\n var clean =\n type +\n \"_\" +\n event.replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_+|_+$)/g, \"\");\n\n window[saGlobal](clean, metadata, callback);\n\n log(\"collected \" + clean);\n\n return type === \"email\" || type === \"phone\"\n ? callback()\n : window.setTimeout(callback, 5000);\n } else {\n log(saGlobal + \" is not defined\", \"warn\");\n return callback();\n }\n } catch (error) {\n log(error.message, \"warn\");\n }\n };\n\n window.saAutomatedLink = saAutomatedLink;\n\n function collectLink(link, onclick) {\n if (link.hasAttribute(\"data-simple-event\")) return;\n var collect = false;\n\n // Collect download clicks\n if (\n optionsLink.downloads &&\n /^https?:\\/\\//i.test(link.href) &&\n new RegExp(\n \"\\\\.(\" + (optionsLink.downloadsExtensions || []).join(\"|\") + \")$\",\n \"i\"\n ).test(link.pathname)\n ) {\n collect = \"download\";\n\n // Collect outbound links clicks\n } else if (\n optionsLink.outbound &&\n /^https?:\\/\\//i.test(link.href) &&\n link.hostname !== window.location.hostname\n ) {\n collect = \"outbound\";\n\n // Collect email clicks\n } else if (optionsLink.emails && /^mailto:/i.test(link.href)) {\n collect = \"email\";\n\n // Collect telephone clicks\n } else if (optionsLink.phones && /^tel:/i.test(link.href)) {\n collect = \"phone\";\n }\n\n if (!collect) return;\n\n if (onclick) {\n var onClickAttribute = \"saAutomatedLink(this, '\" + collect + \"');\";\n\n if (\n !link.hasAttribute(\"target\") ||\n link.getAttribute(\"target\") === \"_self\"\n )\n onClickAttribute += \" return false;\";\n\n link.setAttribute(\"onclick\", onClickAttribute);\n } else {\n link.addEventListener(\"click\", function () {\n saAutomatedLink(this, collect);\n });\n }\n }\n\n function onDOMContentLoaded() {\n try {\n var a = document.getElementsByTagName(\"a\");\n\n // Loop over all links on the page\n for (var i = 0; i < a.length; i++) {\n var link = a[i];\n var href = link.getAttribute(\"href\");\n\n // Skip links that don't have an href\n if (!href) continue;\n\n // We don't want to overwrite website behaviour so we check for the onclick attribute\n if (\n !link.getAttribute(\"onclick\") &&\n !/^mailto:/.test(href) &&\n !/^tel:/.test(href)\n ) {\n collectLink(link, true);\n } else {\n collectLink(link, false);\n }\n }\n } catch (error) {\n log(error.message, \"warn\");\n }\n }\n\n if (doc.readyState === \"ready\" || doc.readyState === \"complete\") {\n onDOMContentLoaded();\n } else {\n document.addEventListener(\"readystatechange\", function (event) {\n if (event.target.readyState === \"complete\") onDOMContentLoaded();\n });\n }\n})(window);\n"],"names":["collectLink","link","onclick","collect","onClickAttribute","hasAttribute","optionsLink","downloads","test","href","RegExp","downloadsExtensions","join","pathname","outbound","hostname","window","location","emails","phones","getAttribute","setAttribute","addEventListener","saAutomatedLink","this","onDOMContentLoaded","a","document","getElementsByTagName","i","length","error","log","message","doc","scriptElement","setting","collectTypes","fullUrls","options","saGlobal","type","logger","console","warn","info","currentScript","querySelector","attribute","defaultValue","value","dataset","split","map","item","trim","filter","Boolean","indexOf","title","outboundFullUrl","downloadsFullUrl","element","sent","callback","theTitle","metadata","undefined","url","useTitle","event","pop","email","phone","clean","replace","setTimeout","readyState","target"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"auto-events.source.js","sources":["auto-events.source.js"],"sourcesContent":["(function saAutomatedEvents(window) {\n // Skip server side rendered pages\n if (typeof window === \"undefined\") return;\n\n var log = function (message, type) {\n var logger = type === \"warn\" ? console.warn : console.info;\n return logger && logger(\"Simple Analytics auto events:\", message);\n };\n\n var doc = window.document;\n\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"auto-events.js\"]');\n\n var setting = function (attribute, type, defaultValue) {\n var value = scriptElement && scriptElement.dataset[attribute];\n\n // Booleans\n if (type === \"bool\" && (value === \"true\" || value === \"false\"))\n return value === \"true\";\n else if (type === \"bool\") return defaultValue;\n\n // Arrays\n if (type === \"array\" && value)\n return value\n .split(\",\")\n .map(function (item) {\n return item.trim();\n })\n .filter(Boolean);\n else if (type === \"array\") return defaultValue;\n\n return value || defaultValue;\n };\n\n var collectTypes = setting(\"collect\", \"array\", [\n \"outbound\",\n \"emails\",\n \"downloads\",\n \"phones\",\n ]);\n var fullUrls = setting(\"fullUrls\", \"bool\", false);\n\n var options = {\n // What to collect\n outbound: collectTypes.indexOf(\"outbound\") > -1,\n emails: collectTypes.indexOf(\"emails\") > -1,\n downloads: collectTypes.indexOf(\"downloads\") > -1,\n phones: collectTypes.indexOf(\"phones\") > -1,\n // Downloads: enter file extensions you want to collect\n downloadsExtensions: setting(\"extensions\", \"array\", [\n \"pdf\",\n \"csv\",\n \"docx\",\n \"xlsx\",\n \"zip\",\n \"doc\",\n \"xls\",\n ]),\n\n // All: use title attribute if set for event name (for all events)\n // THIS TAKES PRECEDENCE OVER OTHER SETTINGS BELOW\n title: setting(\"useTitle\", \"bool\", true),\n // Outbound: use full URL of the links? false for just the hostname\n outboundFullUrl: fullUrls,\n // Downloads: if taking event name from URL, use full URL or just filename (default)\n downloadsFullUrl: fullUrls,\n };\n\n var saGlobal = setting(\"saGlobal\", \"string\", \"sa_event\");\n\n // For compiling the script\n var optionsLink = options;\n\n if (typeof optionsLink === \"undefined\")\n log(\"options object not found, please specify\", \"warn\");\n\n var saAutomatedLink = function saAutomatedLink(element, type) {\n try {\n if (!element) return log(\"no element found\");\n var sent = false;\n\n var callback = function () {\n if (\n type !== \"phone\" &&\n !sent &&\n (!element.hasAttribute(\"target\") ||\n element.getAttribute(\"target\") === \"_self\")\n )\n document.location = element.getAttribute(\"href\");\n sent = true;\n };\n\n if (window[saGlobal] && window[saGlobal + \"_loaded\"]) {\n var hostname = element.hostname;\n var pathname = element.pathname;\n\n var event;\n var metadata = {\n title: element.getAttribute(\"title\") || undefined,\n };\n var url = element.href || undefined;\n\n var useTitle = false;\n if (optionsLink.title && element.hasAttribute(\"title\")) {\n var theTitle = element.getAttribute(\"title\").trim();\n if (theTitle != \"\") useTitle = true;\n }\n\n if (useTitle) {\n event = theTitle;\n } else {\n switch (type) {\n case \"outbound\": {\n event = hostname + (optionsLink.outboundFullUrl ? pathname : \"\");\n metadata.url = url;\n break;\n }\n case \"download\": {\n event = optionsLink.downloadsFullUrl\n ? hostname + pathname\n : pathname.split(\"/\").pop();\n metadata.url = url;\n break;\n }\n case \"email\": {\n var href = element.getAttribute(\"href\");\n event = (href.split(\":\")[1] || \"\").split(\"?\")[0];\n metadata.email = event;\n break;\n }\n case \"phone\": {\n var hrefPhone = element.getAttribute(\"href\");\n event = (hrefPhone.split(\":\")[1] || \"\").split(\"?\")[0];\n metadata.phone = event;\n break;\n }\n }\n }\n\n var clean =\n type +\n \"_\" +\n event.replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_+|_+$)/g, \"\");\n\n window[saGlobal](clean, metadata, callback);\n\n log(\"collected \" + clean);\n\n return type === \"email\" || type === \"phone\"\n ? callback()\n : window.setTimeout(callback, 5000);\n } else {\n log(saGlobal + \" is not defined\", \"warn\");\n return callback();\n }\n } catch (error) {\n log(error.message, \"warn\");\n }\n };\n\n window.saAutomatedLink = saAutomatedLink;\n\n function collectLink(link, onclick) {\n if (link.hasAttribute(\"data-simple-event\")) return;\n var collect = false;\n\n // Collect download clicks\n if (\n optionsLink.downloads &&\n /^https?:\\/\\//i.test(link.href) &&\n new RegExp(\n \"\\\\.(\" + (optionsLink.downloadsExtensions || []).join(\"|\") + \")$\",\n \"i\"\n ).test(link.pathname)\n ) {\n collect = \"download\";\n\n // Collect outbound links clicks\n } else if (\n optionsLink.outbound &&\n /^https?:\\/\\//i.test(link.href) &&\n link.hostname !== window.location.hostname\n ) {\n collect = \"outbound\";\n\n // Collect email clicks\n } else if (optionsLink.emails && /^mailto:/i.test(link.href)) {\n collect = \"email\";\n\n // Collect telephone clicks\n } else if (optionsLink.phones && /^tel:/i.test(link.href)) {\n collect = \"phone\";\n }\n\n if (!collect) return;\n\n if (onclick) {\n var onClickAttribute = \"saAutomatedLink(this, '\" + collect + \"');\";\n\n if (\n !link.hasAttribute(\"target\") ||\n link.getAttribute(\"target\") === \"_self\"\n )\n onClickAttribute += \" return false;\";\n\n link.setAttribute(\"onclick\", onClickAttribute);\n } else {\n link.addEventListener(\"click\", function () {\n saAutomatedLink(this, collect);\n });\n }\n }\n\n function onDOMContentLoaded() {\n try {\n var a = document.getElementsByTagName(\"a\");\n\n // Loop over all links on the page\n for (var i = 0; i < a.length; i++) {\n var link = a[i];\n var href = link.getAttribute(\"href\");\n\n // Skip links that don't have an href\n if (!href) continue;\n\n // We don't want to overwrite website behaviour so we check for the onclick attribute\n if (\n !link.getAttribute(\"onclick\") &&\n !/^mailto:/.test(href) &&\n !/^tel:/.test(href)\n ) {\n collectLink(link, true);\n } else {\n collectLink(link, false);\n }\n }\n } catch (error) {\n log(error.message, \"warn\");\n }\n }\n\n if (doc.readyState === \"ready\" || doc.readyState === \"complete\") {\n onDOMContentLoaded();\n } else {\n document.addEventListener(\"readystatechange\", function (event) {\n if (event.target.readyState === \"complete\") onDOMContentLoaded();\n });\n }\n})(window);\n"],"names":["collectLink","link","onclick","collect","onClickAttribute","hasAttribute","optionsLink","downloads","test","href","RegExp","downloadsExtensions","join","pathname","outbound","hostname","window","location","emails","phones","getAttribute","setAttribute","addEventListener","saAutomatedLink","this","onDOMContentLoaded","a","document","getElementsByTagName","i","length","error","log","message","doc","scriptElement","setting","collectTypes","fullUrls","options","saGlobal","type","logger","console","warn","info","currentScript","querySelector","attribute","defaultValue","value","dataset","split","map","item","trim","filter","Boolean","indexOf","title","outboundFullUrl","downloadsFullUrl","element","sent","callback","theTitle","metadata","undefined","url","useTitle","event","pop","email","phone","clean","replace","setTimeout","readyState","target"],"mappings":"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"} \ No newline at end of file diff --git a/src/auto-events.js b/src/auto-events.js index d1060075..499a6710 100644 --- a/src/auto-events.js +++ b/src/auto-events.js @@ -82,6 +82,7 @@ var callback = function () { if ( + type !== "phone" && !sent && (!element.hasAttribute("target") || element.getAttribute("target") === "_self") diff --git a/test/unit/auto-events.test.js b/test/unit/auto-events.test.js index 48beb50e..8193dedc 100644 --- a/test/unit/auto-events.test.js +++ b/test/unit/auto-events.test.js @@ -1,5 +1,7 @@ const { expect } = require("chai"); const { createDOM } = require("./helpers/dom-auto-events"); +const { readFileSync } = require("fs"); +const { runInNewContext } = require("vm"); function setupDOM() { const events = []; @@ -17,6 +19,54 @@ function setupDOM() { } describe("auto-events", function () { + it("collects phone clicks by default without overriding cancelled navigation", function () { + const events = []; + const navigations = []; + let click; + const link = { + href: "tel:+31201234567", + getAttribute(name) { + return name === "href" ? this.href : null; + }, + hasAttribute() { + return false; + }, + addEventListener(type, listener) { + click = listener; + }, + }; + const document = { + readyState: "complete", + currentScript: { dataset: {} }, + getElementsByTagName: () => [link], + set location(value) { + navigations.push(value); + }, + }; + const window = { + document, + location: { hostname: "example.com" }, + sa_event_loaded: true, + sa_event(name, metadata, callback) { + events.push({ name, metadata }); + callback(); + }, + }; + runInNewContext(readFileSync("dist/latest/auto-events.js", "utf8"), { + window, + document, + console, + }); + click.call(link, { defaultPrevented: true }); + expect(events).to.deep.equal([ + { + name: "phone_31201234567", + metadata: { title: undefined, phone: "+31201234567" }, + }, + ]); + expect(navigations).to.deep.equal([]); + }); + it("tracks outbound link clicks", function (done) { const dom = setupDOM(); const link = dom.window.document.createElement("a"); From 33954229e15b33b85507614b44717b4cb938ac4f Mon Sep 17 00:00:00 2001 From: "simple-analytics-ai[bot]" <313929673+simple-analytics-ai[bot]@users.noreply.github.com> Date: Thu, 15 Oct 2026 16:58:57 +0200 Subject: [PATCH 56/62] Respect the configured namespace for manual pageviews (#110) * Respect the configured namespace for manual pageviews Requested in item 3: keep namespaced trackers from replacing another tracker manual pageview function. Reuse existing namespace and pageview text variables to reduce minified bytes. Refs #107 * Retain the free legacy manual pageview alias Address review of item 3: older namespaced installations still call sa_pageview. Keep that alias when free, without overwriting another tracker, and cover both function names in the regression test. Refs #107 --------- Co-authored-by: Simple Analytics Codex --- dist/latest/cloudflare.js | 99 ++++++++++++++++++++++++++++++-- dist/latest/custom/app.js | 4 +- dist/latest/custom/app.js.map | 2 +- dist/latest/custom/e.js | 4 +- dist/latest/custom/e.js.map | 2 +- dist/latest/custom/latest.dev.js | 99 ++++++++++++++++++++++++++++++-- dist/latest/custom/latest.js | 4 +- dist/latest/custom/latest.js.map | 2 +- dist/latest/custom/light.js | 4 +- dist/latest/custom/light.js.map | 2 +- dist/latest/custom/proxy.js | 4 +- dist/latest/custom/proxy.js.map | 2 +- dist/latest/hello.js | 4 +- dist/latest/hello.js.map | 2 +- dist/latest/latest.dev.js | 99 ++++++++++++++++++++++++++++++-- dist/latest/latest.js | 4 +- dist/latest/latest.js.map | 2 +- dist/latest/light.js | 4 +- dist/latest/light.js.map | 2 +- dist/v12/app.js | 4 +- dist/v12/app.js.map | 2 +- dist/v12/custom/app.js | 4 +- dist/v12/custom/app.js.map | 2 +- dist/v12/custom/light.js | 4 +- dist/v12/custom/light.js.map | 2 +- dist/v12/custom/proxy.js | 4 +- dist/v12/custom/proxy.js.map | 2 +- dist/v12/light.js | 4 +- dist/v12/light.js.map | 2 +- src/default.js | 7 ++- test/unit/pageview.test.js | 50 +++++++++++++++- 31 files changed, 372 insertions(+), 60 deletions(-) diff --git a/dist/latest/cloudflare.js b/dist/latest/cloudflare.js index 395a0b0f..bd29609c 100644 --- a/dist/latest/cloudflare.js +++ b/dist/latest/cloudflare.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-15; 6182; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-15; f3cb; v12) */ /* eslint-env browser */ (function ( @@ -298,7 +298,7 @@ // // Send data via image - var sendData = function (data, callback, onlyThisData) { + var sendData = function (data, callback, onlyThisData, keepalive) { data = onlyThisData ? data : assign(payload, page, data); if (nav.brave && !onlyThisData) data.brave = trueVar; @@ -310,7 +310,7 @@ image.onerror = callback; image.onload = callback; } - image.src = + var imageUrl = fullApiUrl + "/simple.gif?" + Object.keys(data) @@ -327,6 +327,23 @@ .join("&") + "&time=" + Date.now(); + + // Inline events must survive navigation without taking over links or forms. + if (keepalive && window.fetch) { + try { + window + .fetch(imageUrl, { + keepalive: trueVar, + mode: "no-cors", + credentials: "omit", + }) + .catch(function () { + image.src = imageUrl; + }); + return; + } catch (error) {} + } + image.src = imageUrl; }; // Customers can overwrite their hostname, here we check for that @@ -895,9 +912,12 @@ if (autoCollect) pageview(); - window.sa_pageview = function (path, metadata, callback) { + var manualPageview = function (path, metadata, callback) { pageview(0, path, metadata, callback); }; + window[namespace + "_" + pageviewText] = manualPageview; + var defaultPageview = defaultNamespace + "_" + pageviewText; + if (!window[defaultPageview]) window[defaultPageview] = manualPageview; ///////////////////// @@ -906,7 +926,7 @@ var validTypes = ["string", "number"]; - var sendEvent = function (event, metadata, callbackRaw) { + var sendEvent = function (event, metadata, callbackRaw, keepalive) { if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata; var eventIsFunction = isFunction(event); @@ -954,7 +974,9 @@ metadata: stringify(metadata), }), - callback + callback, + undefinedVar, + keepalive ); } }; @@ -983,6 +1005,71 @@ : sendEvent(queue[event]); } } + + var inlineEvent = function (event) { + var element = event.target; + while ( + element && + element !== doc && + (!element.getAttribute || attr(element, "simple-event") === null) + ) + element = element.parentNode; + + if (!element || element === doc) return; + var isForm = element.tagName === "FORM"; + var name = attr(element, "simple-event"); + if (!name || isForm !== (event.type === "submit")) return; + + var metadata = { tag: element.tagName.toLowerCase() }; + var attributes = element.attributes; + for (var i = 0; i < attributes.length; i++) { + var attribute = attributes[i]; + if (attribute.name.indexOf("data-simple-event-") === 0) + metadata[attribute.name.slice(18).replace(/-/g, "_")] = + attribute.value; + } + if (isForm) { + var button = event.submitter; + metadata.button_text = button + ? (button.textContent || button.value || "") + .replace(/\s+/g, " ") + .trim() + .slice(0, 200) + : ""; + } + sendEvent(name, metadata, undefinedVar, trueVar); + }; + + doc.addEventListener("click", inlineEvent, falseVar); + doc.addEventListener("submit", inlineEvent, falseVar); + + // 404 confirmation adds a request, so existing installs must opt in. + if ( + overwriteOptions.detect404 === trueVar || + attr(scriptElement, "detect-404") == trueText + ) { + var detect404 = function () { + if ( + !/\b404\b/.test(doc.title + " " + (doc.body && doc.body.textContent)) + ) + return; + try { + var request = new window.XMLHttpRequest(); + request.open("HEAD", loc.href, trueVar); + request.onload = function () { + if (request.status === 404) + sendEvent("page_404", { + url: loc.protocol + "//" + definedHostname + loc.pathname, + status: 404, + }); + }; + request.send(); + } catch (error) {} + }; + if (doc.readyState === "loading") + doc.addEventListener("DOMContentLoaded", detect404, falseVar); + else detect404(); + } } catch (e) { sendError(e); } diff --git a/dist/latest/custom/app.js b/dist/latest/custom/app.js index 608cb48a..5733a065 100644 --- a/dist/latest/custom/app.js +++ b/dist/latest/custom/app.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-15; 612b; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-15; 986e; v12) */ -!function(m,t,e,n,v){try{var g=undefined,y=!0,_=!1,r="true",a="https:",w="pageview",u="event",i="error",o=m.console,c="doNotTrack",b=m.navigator,s=m.location,O=s.host,l=m.document,p=b.userAgent,f="Not sending request ",h=f+"when ",x=_,d=encodeURIComponent,E=decodeURIComponent,S=JSON.stringify,k=m.addEventListener,M="https://"+e,q=l.documentElement||{},A="language",$="Height",j="scroll",D=b.userAgentData,C=j+$,H="offset"+$,R="client"+$,P="pagehide",T="platform",U="platformVersion",I="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),N=m.screen,z=l.currentScript||l.querySelector('script[src*="'+e+'"]');v=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){v("Error in your "+t+" function:",e)},W=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},G=function(t){return"string"==typeof t},J=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},L=function(t,e){return t&&t.getAttribute("data-"+e)},Y=function(t){return Array.isArray(t)?t:G(t)&&t.length?t.split(/, ?/):[]},Z=function(t){return t&&t.constructor===Object},K=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},it=function(t){return"function"==typeof t},ot="namespace",ct=t[ot]||L(z,ot)||"sa",st=function(t,e){var n=m[ct+"_metadata"];Z(n)&&(t=K(t,n));var r=m[Mt];if(!it(r))return Mt&&v(Mt+" not found, set window."+Mt),t;try{return K(t,r.call(m,K(t,e)))}catch(a){F("metadata",a)}},ut=t.strictUtm||L(z,"strict-utm")==r,lt=function(i,t){tt=!i&&nt("q")?"":_;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");tt!==_&&0"); +!function(v,t,e,n,m){try{var g=undefined,y=!0,_=!1,r="true",a="https:",b="pageview",l="event",i="error",o=v.console,c="doNotTrack",w=v.navigator,s=v.location,O=s.host,u=v.document,p=w.userAgent,f="Not sending request ",d=f+"when ",x=_,h=encodeURIComponent,E=decodeURIComponent,M=JSON.stringify,S=v.addEventListener,k="https://"+e,A=u.documentElement||{},q="language",C="Height",D="scroll",$=w.userAgentData,j=D+C,H="offset"+C,R="client"+C,L="pagehide",N="platform",P="platformVersion",T="https://docs.simpleanalytics.com",U=0,I=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),V=v.screen,B=u.currentScript||u.querySelector('script[src*="'+e+'"]');m=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){m("Error in your "+t+" function:",e)},z=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},W=function(t){return"string"==typeof t},G=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},J=function(t,e){return t&&t.getAttribute("data-"+e)},X=function(t){return Array.isArray(t)?t:W(t)&&t.length?t.split(/, ?/):[]},Y=function(t){return t&&t.constructor===Object},Z=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},it=function(t){return"function"==typeof t},ot="namespace",ct=t[ot]||J(B,ot)||"sa",st=function(t,e){var n=v[ct+"_metadata"];Y(n)&&(t=Z(t,n));var r=v[kt];if(!it(r))return kt&&m(kt+" not found, set window."+kt),t;try{return Z(t,r.call(v,Z(t,e)))}catch(a){F("metadata",a)}},ut=t.strictUtm||J(B,"strict-utm")==r,lt=function(i,t){tt=!i&&nt("q")?"":_;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");tt!==_&&0"); //# sourceMappingURL=app.js.map \ No newline at end of file diff --git a/dist/latest/custom/app.js.map b/dist/latest/custom/app.js.map index 72ed4273..70aea5a7 100644 --- a/dist/latest/custom/app.js.map +++ b/dist/latest/custom/app.js.map @@ -1 +1 @@ -{"version":3,"file":"app.source.js","sources":["app.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch = \"\";\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n var pathKey = path + querySearch;\n if (!path || lastSendPath == pathKey) return;\n\n lastSendPath = pathKey;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_app_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","protocol","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","parts","querySearch","shift","pathKey","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"app.source.js","sources":["app.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData, keepalive) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n var imageUrl =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n\n // Inline events must survive navigation without taking over links or forms.\n if (keepalive && window.fetch) {\n try {\n window\n .fetch(imageUrl, {\n keepalive: trueVar,\n mode: \"no-cors\",\n credentials: \"omit\",\n })\n .catch(function () {\n image.src = imageUrl;\n });\n return;\n } catch (error) {}\n }\n image.src = imageUrl;\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch = \"\";\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n var pathKey = path + querySearch;\n if (!path || lastSendPath == pathKey) return;\n\n lastSendPath = pathKey;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n var manualPageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n window[namespace + \"_\" + pageviewText] = manualPageview;\n var defaultPageview = defaultNamespace + \"_\" + pageviewText;\n if (!window[defaultPageview]) window[defaultPageview] = manualPageview;\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw, keepalive) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback,\n undefinedVar,\n keepalive\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n\n var inlineEvent = function (event) {\n var element = event.target;\n while (\n element &&\n element !== doc &&\n (!element.getAttribute || attr(element, \"simple-event\") === null)\n )\n element = element.parentNode;\n\n if (!element || element === doc) return;\n var isForm = element.tagName === \"FORM\";\n var name = attr(element, \"simple-event\");\n if (!name || isForm !== (event.type === \"submit\")) return;\n\n var metadata = { tag: element.tagName.toLowerCase() };\n var attributes = element.attributes;\n for (var i = 0; i < attributes.length; i++) {\n var attribute = attributes[i];\n if (attribute.name.indexOf(\"data-simple-event-\") === 0)\n metadata[attribute.name.slice(18).replace(/-/g, \"_\")] =\n attribute.value;\n }\n if (isForm) {\n var button = event.submitter;\n metadata.button_text = button\n ? (button.textContent || button.value || \"\")\n .replace(/\\s+/g, \" \")\n .trim()\n .slice(0, 200)\n : \"\";\n }\n sendEvent(name, metadata, undefinedVar, trueVar);\n };\n\n doc.addEventListener(\"click\", inlineEvent, falseVar);\n doc.addEventListener(\"submit\", inlineEvent, falseVar);\n\n // 404 confirmation adds a request, so existing installs must opt in.\n if (\n overwriteOptions.detect404 === trueVar ||\n attr(scriptElement, \"detect-404\") == trueText\n ) {\n var detect404 = function () {\n if (\n !/\\b404\\b/.test(doc.title + \" \" + (doc.body && doc.body.textContent))\n )\n return;\n try {\n var request = new window.XMLHttpRequest();\n request.open(\"HEAD\", loc.href, trueVar);\n request.onload = function () {\n if (request.status === 404)\n sendEvent(\"page_404\", {\n url: loc.protocol + \"//\" + definedHostname + loc.pathname,\n status: 404,\n });\n };\n request.send();\n } catch (error) {}\n };\n if (doc.readyState === \"loading\")\n doc.addEventListener(\"DOMContentLoaded\", detect404, falseVar);\n else detect404();\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_app_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","keepalive","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","imageUrl","key","fetch","mode","credentials","catch","src","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","protocol","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","parts","querySearch","shift","pathKey","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","manualPageview","defaultPageview","defaultNamespace","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue","detect404","inlineEvent","element","target","parentNode","isForm","tagName","button","tag","toLowerCase","attributes","submitter","button_text","textContent","trim","title","request","XMLHttpRequest","open","href","status","url","send","readyState"],"mappings":"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"} \ No newline at end of file diff --git a/dist/latest/custom/e.js b/dist/latest/custom/e.js index be761a73..11f827bd 100644 --- a/dist/latest/custom/e.js +++ b/dist/latest/custom/e.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-15; e660; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-15; 8df9; v12) */ -!function(m,t,e,n,v){try{var g=undefined,y=!0,_=!1,r="true",a="https:",w="pageview",u="event",i="error",o=m.console,c="doNotTrack",b=m.navigator,s=m.location,O=s.host,l=m.document,p=b.userAgent,f="Not sending request ",h=f+"when ",x=_,d=encodeURIComponent,E=decodeURIComponent,S=JSON.stringify,k=m.addEventListener,M="https://"+e,q=l.documentElement||{},A="language",$="Height",j="scroll",D=b.userAgentData,C=j+$,H="offset"+$,R="client"+$,P="pagehide",T="platform",U="platformVersion",I="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),N=m.screen,z=l.currentScript||l.querySelector('script[src*="'+e+'"]');v=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){v("Error in your "+t+" function:",e)},W=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},G=function(t){return"string"==typeof t},J=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},L=function(t,e){return t&&t.getAttribute("data-"+e)},Y=function(t){return Array.isArray(t)?t:G(t)&&t.length?t.split(/, ?/):[]},Z=function(t){return t&&t.constructor===Object},K=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},it=function(t){return"function"==typeof t},ot="namespace",ct=t[ot]||L(z,ot)||"sa",st=function(t,e){var n=m[ct+"_metadata"];Z(n)&&(t=K(t,n));var r=m[Mt];if(!it(r))return Mt&&v(Mt+" not found, set window."+Mt),t;try{return K(t,r.call(m,K(t,e)))}catch(a){F("metadata",a)}},ut=t.strictUtm||L(z,"strict-utm")==r,lt=function(i,t){tt=!i&&nt("q")?"":_;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");tt!==_&&0"); +!function(v,t,e,n,m){try{var g=undefined,y=!0,_=!1,r="true",a="https:",b="pageview",l="event",i="error",o=v.console,c="doNotTrack",w=v.navigator,s=v.location,O=s.host,u=v.document,f=w.userAgent,p="Not sending request ",d=p+"when ",x=_,h=encodeURIComponent,E=decodeURIComponent,M=JSON.stringify,S=v.addEventListener,k="https://"+e,A=u.documentElement||{},q="language",C="Height",D="scroll",$=w.userAgentData,j=D+C,H="offset"+C,R="client"+C,L="pagehide",N="platform",P="platformVersion",T="https://docs.simpleanalytics.com",U=0,I=/(bot|spider|crawl)/i.test(f)&&!/(cubot)/i.test(f),V=v.screen,B=u.currentScript||u.querySelector('script[src*="'+e+'"]');m=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){m("Error in your "+t+" function:",e)},z=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},W=function(t){return"string"==typeof t},G=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},J=function(t,e){return t&&t.getAttribute("data-"+e)},X=function(t){return Array.isArray(t)?t:W(t)&&t.length?t.split(/, ?/):[]},Y=function(t){return t&&t.constructor===Object},Z=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},it=function(t){return"function"==typeof t},ot="namespace",ct=t[ot]||J(B,ot)||"sa",st=function(t,e){var n=v[ct+"_metadata"];Y(n)&&(t=Z(t,n));var r=v[kt];if(!it(r))return kt&&m(kt+" not found, set window."+kt),t;try{return Z(t,r.call(v,Z(t,e)))}catch(a){F("metadata",a)}},ut=t.strictUtm||J(B,"strict-utm")==r,lt=function(i,t){tt=!i&&nt("q")?"":_;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");tt!==_&&0"); //# sourceMappingURL=e.js.map \ No newline at end of file diff --git a/dist/latest/custom/e.js.map b/dist/latest/custom/e.js.map index 4dd11219..42ed5137 100644 --- a/dist/latest/custom/e.js.map +++ b/dist/latest/custom/e.js.map @@ -1 +1 @@ -{"version":3,"file":"e.source.js","sources":["e.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch = \"\";\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n var pathKey = path + querySearch;\n if (!path || lastSendPath == pathKey) return;\n\n lastSendPath = pathKey;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_events_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","protocol","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","parts","querySearch","shift","pathKey","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"e.source.js","sources":["e.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData, keepalive) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n var imageUrl =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n\n // Inline events must survive navigation without taking over links or forms.\n if (keepalive && window.fetch) {\n try {\n window\n .fetch(imageUrl, {\n keepalive: trueVar,\n mode: \"no-cors\",\n credentials: \"omit\",\n })\n .catch(function () {\n image.src = imageUrl;\n });\n return;\n } catch (error) {}\n }\n image.src = imageUrl;\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch = \"\";\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n var pathKey = path + querySearch;\n if (!path || lastSendPath == pathKey) return;\n\n lastSendPath = pathKey;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n var manualPageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n window[namespace + \"_\" + pageviewText] = manualPageview;\n var defaultPageview = defaultNamespace + \"_\" + pageviewText;\n if (!window[defaultPageview]) window[defaultPageview] = manualPageview;\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw, keepalive) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback,\n undefinedVar,\n keepalive\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n\n var inlineEvent = function (event) {\n var element = event.target;\n while (\n element &&\n element !== doc &&\n (!element.getAttribute || attr(element, \"simple-event\") === null)\n )\n element = element.parentNode;\n\n if (!element || element === doc) return;\n var isForm = element.tagName === \"FORM\";\n var name = attr(element, \"simple-event\");\n if (!name || isForm !== (event.type === \"submit\")) return;\n\n var metadata = { tag: element.tagName.toLowerCase() };\n var attributes = element.attributes;\n for (var i = 0; i < attributes.length; i++) {\n var attribute = attributes[i];\n if (attribute.name.indexOf(\"data-simple-event-\") === 0)\n metadata[attribute.name.slice(18).replace(/-/g, \"_\")] =\n attribute.value;\n }\n if (isForm) {\n var button = event.submitter;\n metadata.button_text = button\n ? (button.textContent || button.value || \"\")\n .replace(/\\s+/g, \" \")\n .trim()\n .slice(0, 200)\n : \"\";\n }\n sendEvent(name, metadata, undefinedVar, trueVar);\n };\n\n doc.addEventListener(\"click\", inlineEvent, falseVar);\n doc.addEventListener(\"submit\", inlineEvent, falseVar);\n\n // 404 confirmation adds a request, so existing installs must opt in.\n if (\n overwriteOptions.detect404 === trueVar ||\n attr(scriptElement, \"detect-404\") == trueText\n ) {\n var detect404 = function () {\n if (\n !/\\b404\\b/.test(doc.title + \" \" + (doc.body && doc.body.textContent))\n )\n return;\n try {\n var request = new window.XMLHttpRequest();\n request.open(\"HEAD\", loc.href, trueVar);\n request.onload = function () {\n if (request.status === 404)\n sendEvent(\"page_404\", {\n url: loc.protocol + \"//\" + definedHostname + loc.pathname,\n status: 404,\n });\n };\n request.send();\n } catch (error) {}\n };\n if (doc.readyState === \"loading\")\n doc.addEventListener(\"DOMContentLoaded\", detect404, falseVar);\n else detect404();\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_events_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","keepalive","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","imageUrl","key","fetch","mode","credentials","catch","src","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","protocol","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","parts","querySearch","shift","pathKey","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","manualPageview","defaultPageview","defaultNamespace","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue","detect404","inlineEvent","element","target","parentNode","isForm","tagName","button","tag","toLowerCase","attributes","submitter","button_text","textContent","trim","title","request","XMLHttpRequest","open","href","status","url","send","readyState"],"mappings":"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"} \ No newline at end of file diff --git a/dist/latest/custom/latest.dev.js b/dist/latest/custom/latest.dev.js index 6a83aaa5..ba91e7f8 100644 --- a/dist/latest/custom/latest.dev.js +++ b/dist/latest/custom/latest.dev.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-15; cd25; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-15; 079c; v12) */ /* eslint-env browser */ (function ( @@ -296,7 +296,7 @@ // // Send data via image - var sendData = function (data, callback, onlyThisData) { + var sendData = function (data, callback, onlyThisData, keepalive) { data = onlyThisData ? data : assign(payload, page, data); if (nav.brave && !onlyThisData) data.brave = trueVar; @@ -309,7 +309,7 @@ image.onerror = callback; image.onload = callback; } - image.src = + var imageUrl = fullApiUrl + "/simple.gif?" + Object.keys(data) @@ -326,6 +326,23 @@ .join("&") + "&time=" + Date.now(); + + // Inline events must survive navigation without taking over links or forms. + if (keepalive && window.fetch) { + try { + window + .fetch(imageUrl, { + keepalive: trueVar, + mode: "no-cors", + credentials: "omit", + }) + .catch(function () { + image.src = imageUrl; + }); + return; + } catch (error) {} + } + image.src = imageUrl; }; // Customers can overwrite their hostname, here we check for that @@ -895,9 +912,12 @@ if (autoCollect) pageview(); - window.sa_pageview = function (path, metadata, callback) { + var manualPageview = function (path, metadata, callback) { pageview(0, path, metadata, callback); }; + window[namespace + "_" + pageviewText] = manualPageview; + var defaultPageview = defaultNamespace + "_" + pageviewText; + if (!window[defaultPageview]) window[defaultPageview] = manualPageview; ///////////////////// @@ -906,7 +926,7 @@ var validTypes = ["string", "number"]; - var sendEvent = function (event, metadata, callbackRaw) { + var sendEvent = function (event, metadata, callbackRaw, keepalive) { if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata; var eventIsFunction = isFunction(event); @@ -954,7 +974,9 @@ metadata: stringify(metadata), }), - callback + callback, + undefinedVar, + keepalive ); } }; @@ -983,6 +1005,71 @@ : sendEvent(queue[event]); } } + + var inlineEvent = function (event) { + var element = event.target; + while ( + element && + element !== doc && + (!element.getAttribute || attr(element, "simple-event") === null) + ) + element = element.parentNode; + + if (!element || element === doc) return; + var isForm = element.tagName === "FORM"; + var name = attr(element, "simple-event"); + if (!name || isForm !== (event.type === "submit")) return; + + var metadata = { tag: element.tagName.toLowerCase() }; + var attributes = element.attributes; + for (var i = 0; i < attributes.length; i++) { + var attribute = attributes[i]; + if (attribute.name.indexOf("data-simple-event-") === 0) + metadata[attribute.name.slice(18).replace(/-/g, "_")] = + attribute.value; + } + if (isForm) { + var button = event.submitter; + metadata.button_text = button + ? (button.textContent || button.value || "") + .replace(/\s+/g, " ") + .trim() + .slice(0, 200) + : ""; + } + sendEvent(name, metadata, undefinedVar, trueVar); + }; + + doc.addEventListener("click", inlineEvent, falseVar); + doc.addEventListener("submit", inlineEvent, falseVar); + + // 404 confirmation adds a request, so existing installs must opt in. + if ( + overwriteOptions.detect404 === trueVar || + attr(scriptElement, "detect-404") == trueText + ) { + var detect404 = function () { + if ( + !/\b404\b/.test(doc.title + " " + (doc.body && doc.body.textContent)) + ) + return; + try { + var request = new window.XMLHttpRequest(); + request.open("HEAD", loc.href, trueVar); + request.onload = function () { + if (request.status === 404) + sendEvent("page_404", { + url: loc.protocol + "//" + definedHostname + loc.pathname, + status: 404, + }); + }; + request.send(); + } catch (error) {} + }; + if (doc.readyState === "loading") + doc.addEventListener("DOMContentLoaded", detect404, falseVar); + else detect404(); + } } catch (e) { sendError(e); } diff --git a/dist/latest/custom/latest.js b/dist/latest/custom/latest.js index 0ead48e4..af584663 100644 --- a/dist/latest/custom/latest.js +++ b/dist/latest/custom/latest.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-15; efb5; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-15; 126d; v12) */ -!function(m,t,e,n,v){try{var g=undefined,y=!0,_=!1,r="true",a="https:",w="pageview",u="event",i="error",o=m.console,c="doNotTrack",b=m.navigator,s=m.location,O=s.host,l=m.document,p=b.userAgent,f="Not sending request ",h=f+"when ",x=_,d=encodeURIComponent,E=decodeURIComponent,S=JSON.stringify,k=m.addEventListener,M="https://"+e,q=l.documentElement||{},A="language",$="Height",j="scroll",D=b.userAgentData,C=j+$,H="offset"+$,R="client"+$,P="pagehide",T="platform",U="platformVersion",I="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),N=m.screen,z=l.currentScript||l.querySelector('script[src*="'+e+'"]');v=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){v("Error in your "+t+" function:",e)},W=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},G=function(t){return"string"==typeof t},J=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},L=function(t,e){return t&&t.getAttribute("data-"+e)},Y=function(t){return Array.isArray(t)?t:G(t)&&t.length?t.split(/, ?/):[]},Z=function(t){return t&&t.constructor===Object},K=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},it=function(t){return"function"==typeof t},ot="namespace",ct=t[ot]||L(z,ot)||"sa",st=function(t,e){var n=m[ct+"_metadata"];Z(n)&&(t=K(t,n));var r=m[Mt];if(!it(r))return Mt&&v(Mt+" not found, set window."+Mt),t;try{return K(t,r.call(m,K(t,e)))}catch(a){F("metadata",a)}},ut=t.strictUtm||L(z,"strict-utm")==r,lt=function(i,t){tt=!i&&nt("q")?"":_;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");tt!==_&&0"); +!function(v,t,e,n,m){try{var g=undefined,y=!0,_=!1,r="true",a="https:",b="pageview",l="event",i="error",o=v.console,c="doNotTrack",w=v.navigator,s=v.location,O=s.host,u=v.document,f=w.userAgent,p="Not sending request ",d=p+"when ",x=_,h=encodeURIComponent,E=decodeURIComponent,M=JSON.stringify,S=v.addEventListener,k="https://"+e,A=u.documentElement||{},q="language",C="Height",D="scroll",$=w.userAgentData,j=D+C,H="offset"+C,R="client"+C,L="pagehide",N="platform",P="platformVersion",T="https://docs.simpleanalytics.com",U=0,I=/(bot|spider|crawl)/i.test(f)&&!/(cubot)/i.test(f),V=v.screen,B=u.currentScript||u.querySelector('script[src*="'+e+'"]');m=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){m("Error in your "+t+" function:",e)},z=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},W=function(t){return"string"==typeof t},G=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},J=function(t,e){return t&&t.getAttribute("data-"+e)},X=function(t){return Array.isArray(t)?t:W(t)&&t.length?t.split(/, ?/):[]},Y=function(t){return t&&t.constructor===Object},Z=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},it=function(t){return"function"==typeof t},ot="namespace",ct=t[ot]||J(B,ot)||"sa",st=function(t,e){var n=v[ct+"_metadata"];Y(n)&&(t=Z(t,n));var r=v[kt];if(!it(r))return kt&&m(kt+" not found, set window."+kt),t;try{return Z(t,r.call(v,Z(t,e)))}catch(a){F("metadata",a)}},ut=t.strictUtm||J(B,"strict-utm")==r,lt=function(i,t){tt=!i&&nt("q")?"":_;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");tt!==_&&0"); //# sourceMappingURL=latest.js.map \ No newline at end of file diff --git a/dist/latest/custom/latest.js.map b/dist/latest/custom/latest.js.map index 92d15e30..bae65c84 100644 --- a/dist/latest/custom/latest.js.map +++ b/dist/latest/custom/latest.js.map @@ -1 +1 @@ -{"version":3,"file":"latest.source.js","sources":["latest.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch = \"\";\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n var pathKey = path + querySearch;\n if (!path || lastSendPath == pathKey) return;\n\n lastSendPath = pathKey;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_latest_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","protocol","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","parts","querySearch","shift","pathKey","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"latest.source.js","sources":["latest.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData, keepalive) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n var imageUrl =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n\n // Inline events must survive navigation without taking over links or forms.\n if (keepalive && window.fetch) {\n try {\n window\n .fetch(imageUrl, {\n keepalive: trueVar,\n mode: \"no-cors\",\n credentials: \"omit\",\n })\n .catch(function () {\n image.src = imageUrl;\n });\n return;\n } catch (error) {}\n }\n image.src = imageUrl;\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch = \"\";\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n var pathKey = path + querySearch;\n if (!path || lastSendPath == pathKey) return;\n\n lastSendPath = pathKey;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n var manualPageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n window[namespace + \"_\" + pageviewText] = manualPageview;\n var defaultPageview = defaultNamespace + \"_\" + pageviewText;\n if (!window[defaultPageview]) window[defaultPageview] = manualPageview;\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw, keepalive) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback,\n undefinedVar,\n keepalive\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n\n var inlineEvent = function (event) {\n var element = event.target;\n while (\n element &&\n element !== doc &&\n (!element.getAttribute || attr(element, \"simple-event\") === null)\n )\n element = element.parentNode;\n\n if (!element || element === doc) return;\n var isForm = element.tagName === \"FORM\";\n var name = attr(element, \"simple-event\");\n if (!name || isForm !== (event.type === \"submit\")) return;\n\n var metadata = { tag: element.tagName.toLowerCase() };\n var attributes = element.attributes;\n for (var i = 0; i < attributes.length; i++) {\n var attribute = attributes[i];\n if (attribute.name.indexOf(\"data-simple-event-\") === 0)\n metadata[attribute.name.slice(18).replace(/-/g, \"_\")] =\n attribute.value;\n }\n if (isForm) {\n var button = event.submitter;\n metadata.button_text = button\n ? (button.textContent || button.value || \"\")\n .replace(/\\s+/g, \" \")\n .trim()\n .slice(0, 200)\n : \"\";\n }\n sendEvent(name, metadata, undefinedVar, trueVar);\n };\n\n doc.addEventListener(\"click\", inlineEvent, falseVar);\n doc.addEventListener(\"submit\", inlineEvent, falseVar);\n\n // 404 confirmation adds a request, so existing installs must opt in.\n if (\n overwriteOptions.detect404 === trueVar ||\n attr(scriptElement, \"detect-404\") == trueText\n ) {\n var detect404 = function () {\n if (\n !/\\b404\\b/.test(doc.title + \" \" + (doc.body && doc.body.textContent))\n )\n return;\n try {\n var request = new window.XMLHttpRequest();\n request.open(\"HEAD\", loc.href, trueVar);\n request.onload = function () {\n if (request.status === 404)\n sendEvent(\"page_404\", {\n url: loc.protocol + \"//\" + definedHostname + loc.pathname,\n status: 404,\n });\n };\n request.send();\n } catch (error) {}\n };\n if (doc.readyState === \"loading\")\n doc.addEventListener(\"DOMContentLoaded\", detect404, falseVar);\n else detect404();\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_latest_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","keepalive","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","imageUrl","key","fetch","mode","credentials","catch","src","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","protocol","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","parts","querySearch","shift","pathKey","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","manualPageview","defaultPageview","defaultNamespace","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue","detect404","inlineEvent","element","target","parentNode","isForm","tagName","button","tag","toLowerCase","attributes","submitter","button_text","textContent","trim","title","request","XMLHttpRequest","open","href","status","url","send","readyState"],"mappings":"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"} \ No newline at end of file diff --git a/dist/latest/custom/light.js b/dist/latest/custom/light.js index 33d5ca46..cd5a49b2 100644 --- a/dist/latest/custom/light.js +++ b/dist/latest/custom/light.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-15; deb8; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-15; 72af; v12) */ -!function(f,e,t,m){try{var u=undefined,n="https:",r=f.console,i="doNotTrack",g=f.navigator,p=f.location,h=p.host,a=f.document,o=g.userAgent,c="Not sending request ",v=!1,s=encodeURIComponent,d=decodeURIComponent,l=JSON.stringify,y=f.addEventListener,_="https://"+t,b=(a.documentElement,"language"),w=g.userAgentData,O="platform",S="platformVersion",j="https://docs.simpleanalytics.com",k=/(bot|spider|crawl)/i.test(o)&&!/(cubot)/i.test(o),x=a.currentScript||a.querySelector('script[src*="'+t+'"]');m=function(){var e=[].slice.call(arguments);return e.unshift("Simple Analytics:"),Function.prototype.apply.call(r.warn,r,e)};var E=function(e){return"string"==typeof e},A=function(e,t){return e&&e.getAttribute("data-"+t)},$=function(){for(var e,t,n,r={},i=arguments,a=0;a>e/4).toString(16)})}catch(r){return e.replace(n,function(e){var t=16*Math.random()|0;return(e<2?t:3&t|8).toString(16)})}},N=function(e){return"function"==typeof e},R="namespace",U=e[R]||A(x,R)||"sa",V=e.strictUtm||"true"==A(x,"strict-utm"),B=U+"_loaded";if(1==f[B])return m(c+"twice");f.sa_event_loaded=!0,f[B]=!0;var C,H=function(t,e,n){t=n?t:$(J,M,t),g.brave&&!n&&(t.brave=!0),g._duckduckgoloader_&&!n&&(t.duck=!0),(new Image).src=_+"/simple.gif?"+Object.keys(t).filter(function(e){return t[e]!=u}).map(function(e){return s(e)+"="+s(t[e])}).join("&")+"&time="+Date.now()},T=e.hostname||A(x,"hostname"),F=T||h,z={version:"custom_light_12",hostname:F};e.mode||A(x,"mode");try{C=Intl.DateTimeFormat().resolvedOptions().timeZone}catch(X){m(X)}k&&(z.bot=!0);var J=$(z,{ua:o,https:p.protocol==n,timezone:C,page_id:I(),session_id:I()});if(J.sri=!1,w&&(J.mobile=w.mobile,J.brands=l(w.brands)),F!==h&&(J.hostname_original=h),i in g&&"1"==g[i])return m("Not sending request when "+i+" is enabled. See "+j+"/dnt");-1!=h.indexOf(".")&&!/^[0-9.:]+$/.test(h)||T||m("Set hostname on "+h+". See "+j+"/overwrite-domain-name");var L,M={},P=(e.referrer||A(x,"referrer")||a.referrer||"").replace(h,F).replace(/^https?:\/\/((m|l|w{2,3}([0-9]+)?)\.)?([^?#]+)(.*)$/,"$4").replace(/^([^/]+)$/,"$1")||u,Z=function(e,t){var n=$(z,{type:"append",original_id:t?e:J.page_id});if(t||!g.sendBeacon)H(n,0,!0);else try{g.sendBeacon.bind(g)(_+"/append",l(n))}catch(r){H(n,0,!0)}};y("pagehide",Z,!1);var G,K,Q=function(e){var t="";try{t=e||d(p.pathname)}catch(X){m(X)}return t},W=function(e,t,n,r,i,a){e&&Z(""+J.page_id,!0),J.page_id=I();var o,c=F+Q(),s=(o=t,(r||p.search).slice(1).split("&").filter(function(e){return!o&&new RegExp("^((utm_)"+(V?"":"?")+"(source|medium|content|term|campaign)"+(V?"":"|ref")+")=","i").test(e)}).join("&")||u);H({id:J.page_id,type:"pageview",referrer:!t||n?P:null,query:s}),P=c,0};!function(e,t,n,r){!r&&N(n)&&(r=n);N(r);var i,a="";E(t)&&-1"); +!function(f,e,t,m){try{var u=undefined,n="https:",r=f.console,a="doNotTrack",g=f.navigator,p=f.location,h=p.host,i=f.document,o=g.userAgent,c="Not sending request ",v=!1,s=encodeURIComponent,d=decodeURIComponent,l=JSON.stringify,y=f.addEventListener,_="https://"+t,b=(i.documentElement,"language"),w=g.userAgentData,O="platform",S="platformVersion",j="https://docs.simpleanalytics.com",k=/(bot|spider|crawl)/i.test(o)&&!/(cubot)/i.test(o),x=i.currentScript||i.querySelector('script[src*="'+t+'"]');m=function(){var e=[].slice.call(arguments);return e.unshift("Simple Analytics:"),Function.prototype.apply.call(r.warn,r,e)};var E=function(e){return"string"==typeof e},A=function(e,t){return e&&e.getAttribute("data-"+t)},$=function(){for(var e,t,n,r={},a=arguments,i=0;i>e/4).toString(16)})}catch(r){return e.replace(n,function(e){var t=16*Math.random()|0;return(e<2?t:3&t|8).toString(16)})}},N=function(e){return"function"==typeof e},R="namespace",U=e[R]||A(x,R)||"sa",V=e.strictUtm||"true"==A(x,"strict-utm"),B=U+"_loaded";if(1==f[B])return m(c+"twice");f.sa_event_loaded=!0,f[B]=!0;var C,H=function(t,e,n,r){t=n?t:$(J,M,t),g.brave&&!n&&(t.brave=!0),g._duckduckgoloader_&&!n&&(t.duck=!0);var a=new Image,i=_+"/simple.gif?"+Object.keys(t).filter(function(e){return t[e]!=u}).map(function(e){return s(e)+"="+s(t[e])}).join("&")+"&time="+Date.now();a.src=i},T=e.hostname||A(x,"hostname"),F=T||h,z={version:"custom_light_12",hostname:F};e.mode||A(x,"mode");try{C=Intl.DateTimeFormat().resolvedOptions().timeZone}catch(X){m(X)}k&&(z.bot=!0);var J=$(z,{ua:o,https:p.protocol==n,timezone:C,page_id:I(),session_id:I()});if(J.sri=!1,w&&(J.mobile=w.mobile,J.brands=l(w.brands)),F!==h&&(J.hostname_original=h),a in g&&"1"==g[a])return m("Not sending request when "+a+" is enabled. See "+j+"/dnt");-1!=h.indexOf(".")&&!/^[0-9.:]+$/.test(h)||T||m("Set hostname on "+h+". See "+j+"/overwrite-domain-name");var L,M={},P=(e.referrer||A(x,"referrer")||i.referrer||"").replace(h,F).replace(/^https?:\/\/((m|l|w{2,3}([0-9]+)?)\.)?([^?#]+)(.*)$/,"$4").replace(/^([^/]+)$/,"$1")||u,Z=function(e,t){var n=$(z,{type:"append",original_id:t?e:J.page_id});if(t||!g.sendBeacon)H(n,0,!0);else try{g.sendBeacon.bind(g)(_+"/append",l(n))}catch(r){H(n,0,!0)}};y("pagehide",Z,!1);var G,K,Q=function(e){var t="";try{t=e||d(p.pathname)}catch(X){m(X)}return t},W=function(e,t,n,r,a,i){e&&Z(""+J.page_id,!0),J.page_id=I();var o,c=F+Q(),s=(o=t,(r||p.search).slice(1).split("&").filter(function(e){return!o&&new RegExp("^((utm_)"+(V?"":"?")+"(source|medium|content|term|campaign)"+(V?"":"|ref")+")=","i").test(e)}).join("&")||u);H({id:J.page_id,type:"pageview",referrer:!t||n?P:null,query:s}),P=c,0};!function(e,t,n,r){!r&&N(n)&&(r=n);N(r);var a,i="";E(t)&&-1"); //# sourceMappingURL=light.js.map \ No newline at end of file diff --git a/dist/latest/custom/light.js.map b/dist/latest/custom/light.js.map index 1ac2f196..8d2613a2 100644 --- a/dist/latest/custom/light.js.map +++ b/dist/latest/custom/light.js.map @@ -1 +1 @@ -{"version":3,"file":"light.source.js","sources":["light.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n\n var collectMetricByString = function (metricAbbreviation) {\n // eslint-disable-next-line no-unreachable\n return true;\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n if (ignore) return falseVar;\n // eslint-disable-next-line no-redeclare\n var regex =\n \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \")=\";\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n return q || undefinedVar;\n };\n\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n\n\n\n\n\n\n\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n // eslint-disable-next-line no-redeclare\n var bot = isBotAgent;\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n\n\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch = \"\";\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n var pathKey = path + querySearch;\n if (!path || lastSendPath == pathKey) return;\n\n lastSendPath = pathKey;\n page.path = path;\n\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n sameSite = referrer\n ? referrer.split(slash)[0] == locationHostname\n : falseVar;\n\n\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n\n\n pageview();\n\n } catch (e) {\n warn(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_light_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","warn","undefinedVar","undefined","https","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","language","documentElement","uaData","userAgentData","platformText","platformVersionText","docsUrl","isBotAgent","test","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","isString","string","attr","attribute","getAttribute","assign","obj","prop","object","to","arg","index","length","nextSource","constructor","Object","nextKey","hasOwnProperty","settings","sa_settings","logSettings","keys","Date","now","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","replace","c","getRandomValues","Uint8Array","toString","error","r","Math","random","isFunction","func","namespaceText","namespace","strictUtm","loadedVariable","sa_event_loaded","timezone","sendData","data","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","Image","src","filter","key","map","join","overwrittenHostname","hostname","definedHostname","basePayload","version","mode","Intl","DateTimeFormat","resolvedOptions","timeZone","bot","ua","protocol","page_id","session_id","sri","mobile","brands","hostname_original","indexOf","lastSendPath","referrer","sendOnLeave","id","push","append","type","original_id","sendBeacon","bind","e","sameSite","userNavigated","getPath","overwrite","path","pathname","sendPageView","isPushState","deleteSourceInfo","search","metadata","ignoreSource","currentPage","query","split","keyValue","RegExp","pages","pathOverwrite","callbackRaw","parts","querySearch","shift","pathKey","performaceEntryType","perf","performance","navigationText","getEntriesByType","triggerSendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","pageview"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"light.source.js","sources":["light.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n\n var collectMetricByString = function (metricAbbreviation) {\n // eslint-disable-next-line no-unreachable\n return true;\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n if (ignore) return falseVar;\n // eslint-disable-next-line no-redeclare\n var regex =\n \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \")=\";\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n return q || undefinedVar;\n };\n\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData, keepalive) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n var imageUrl =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n\n image.src = imageUrl;\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n\n\n\n\n\n\n\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n // eslint-disable-next-line no-redeclare\n var bot = isBotAgent;\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n\n\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch = \"\";\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n var pathKey = path + querySearch;\n if (!path || lastSendPath == pathKey) return;\n\n lastSendPath = pathKey;\n page.path = path;\n\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n sameSite = referrer\n ? referrer.split(slash)[0] == locationHostname\n : falseVar;\n\n\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n\n\n pageview();\n\n } catch (e) {\n warn(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_light_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","warn","undefinedVar","undefined","https","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","language","documentElement","uaData","userAgentData","platformText","platformVersionText","docsUrl","isBotAgent","test","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","isString","string","attr","attribute","getAttribute","assign","obj","prop","object","to","arg","index","length","nextSource","constructor","Object","nextKey","hasOwnProperty","settings","sa_settings","logSettings","keys","Date","now","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","replace","c","getRandomValues","Uint8Array","toString","error","r","Math","random","isFunction","func","namespaceText","namespace","strictUtm","loadedVariable","sa_event_loaded","timezone","sendData","data","callback","onlyThisData","keepalive","payload","page","brave","_duckduckgoloader_","duck","image","Image","imageUrl","filter","key","map","join","src","overwrittenHostname","hostname","definedHostname","basePayload","version","mode","Intl","DateTimeFormat","resolvedOptions","timeZone","bot","ua","protocol","page_id","session_id","sri","mobile","brands","hostname_original","indexOf","lastSendPath","referrer","sendOnLeave","id","push","append","type","original_id","sendBeacon","bind","e","sameSite","userNavigated","getPath","overwrite","path","pathname","sendPageView","isPushState","deleteSourceInfo","search","metadata","ignoreSource","currentPage","query","split","keyValue","RegExp","pages","pathOverwrite","callbackRaw","parts","querySearch","shift","pathKey","performaceEntryType","perf","performance","navigationText","getEntriesByType","triggerSendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","pageview"],"mappings":"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"} \ No newline at end of file diff --git a/dist/latest/custom/proxy.js b/dist/latest/custom/proxy.js index 5fa25001..b4c99ea5 100644 --- a/dist/latest/custom/proxy.js +++ b/dist/latest/custom/proxy.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-15; 7e4c; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-15; 1a8e; v12) */ -!function(m,t,e,n,v){try{var g=undefined,y=!0,_=!1,r="true",a="https:",w="pageview",u="event",i="error",o=m.console,c="doNotTrack",b=m.navigator,s=m.location,x=s.host,l=m.document,p=b.userAgent,f="Not sending request ",h=f+"when ",O=_,d=encodeURIComponent,E=decodeURIComponent,S=JSON.stringify,k=m.addEventListener,M="https://"+e,q=l.documentElement||{},A="language",$="Height",j="scroll",D=b.userAgentData,C=j+$,H="offset"+$,P="client"+$,R="pagehide",T="platform",U="platformVersion",I="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),N=m.screen,z=l.currentScript||l.querySelector('script[src*="'+e+'"]');v=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){v("Error in your "+t+" function:",e)},W=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},G=function(t){return"string"==typeof t},J=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},L=function(t,e){return t&&t.getAttribute("data-"+e)},Y=function(t){return Array.isArray(t)?t:G(t)&&t.length?t.split(/, ?/):[]},Z=function(t){return t&&t.constructor===Object},K=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},it=function(t){return"function"==typeof t},ot="namespace",ct=t[ot]||L(z,ot)||"sa",st=function(t,e){var n=m[ct+"_metadata"];Z(n)&&(t=K(t,n));var r=m[Mt];if(!it(r))return Mt&&v(Mt+" not found, set window."+Mt),t;try{return K(t,r.call(m,K(t,e)))}catch(a){F("metadata",a)}},ut=t.strictUtm||L(z,"strict-utm")==r,lt=function(i,t){tt=!i&&nt("q")?"":_;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");tt!==_&&0"); +!function(v,t,e,n,m){try{var g=undefined,y=!0,_=!1,r="true",a="https:",b="pageview",l="event",i="error",o=v.console,c="doNotTrack",w=v.navigator,s=v.location,x=s.host,u=v.document,f=w.userAgent,p="Not sending request ",d=p+"when ",O=_,h=encodeURIComponent,E=decodeURIComponent,M=JSON.stringify,S=v.addEventListener,k="https://"+e,A=u.documentElement||{},q="language",C="Height",D="scroll",$=w.userAgentData,j=D+C,H="offset"+C,R="client"+C,L="pagehide",N="platform",P="platformVersion",T="https://docs.simpleanalytics.com",U=0,I=/(bot|spider|crawl)/i.test(f)&&!/(cubot)/i.test(f),V=v.screen,B=u.currentScript||u.querySelector('script[src*="'+e+'"]');m=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){m("Error in your "+t+" function:",e)},z=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},W=function(t){return"string"==typeof t},G=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},J=function(t,e){return t&&t.getAttribute("data-"+e)},X=function(t){return Array.isArray(t)?t:W(t)&&t.length?t.split(/, ?/):[]},Y=function(t){return t&&t.constructor===Object},Z=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},it=function(t){return"function"==typeof t},ot="namespace",ct=t[ot]||J(B,ot)||"sa",st=function(t,e){var n=v[ct+"_metadata"];Y(n)&&(t=Z(t,n));var r=v[kt];if(!it(r))return kt&&m(kt+" not found, set window."+kt),t;try{return Z(t,r.call(v,Z(t,e)))}catch(a){F("metadata",a)}},ut=t.strictUtm||J(B,"strict-utm")==r,lt=function(i,t){tt=!i&&nt("q")?"":_;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");tt!==_&&0"); //# sourceMappingURL=proxy.js.map \ No newline at end of file diff --git a/dist/latest/custom/proxy.js.map b/dist/latest/custom/proxy.js.map index 163c9add..6f89ad5e 100644 --- a/dist/latest/custom/proxy.js.map +++ b/dist/latest/custom/proxy.js.map @@ -1 +1 @@ -{"version":3,"file":"proxy.source.js","sources":["proxy.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch = \"\";\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n var pathKey = path + querySearch;\n if (!path || lastSendPath == pathKey) return;\n\n lastSendPath = pathKey;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_proxy_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","protocol","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","parts","querySearch","shift","pathKey","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"proxy.source.js","sources":["proxy.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData, keepalive) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n var imageUrl =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n\n // Inline events must survive navigation without taking over links or forms.\n if (keepalive && window.fetch) {\n try {\n window\n .fetch(imageUrl, {\n keepalive: trueVar,\n mode: \"no-cors\",\n credentials: \"omit\",\n })\n .catch(function () {\n image.src = imageUrl;\n });\n return;\n } catch (error) {}\n }\n image.src = imageUrl;\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch = \"\";\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n var pathKey = path + querySearch;\n if (!path || lastSendPath == pathKey) return;\n\n lastSendPath = pathKey;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n var manualPageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n window[namespace + \"_\" + pageviewText] = manualPageview;\n var defaultPageview = defaultNamespace + \"_\" + pageviewText;\n if (!window[defaultPageview]) window[defaultPageview] = manualPageview;\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw, keepalive) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback,\n undefinedVar,\n keepalive\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n\n var inlineEvent = function (event) {\n var element = event.target;\n while (\n element &&\n element !== doc &&\n (!element.getAttribute || attr(element, \"simple-event\") === null)\n )\n element = element.parentNode;\n\n if (!element || element === doc) return;\n var isForm = element.tagName === \"FORM\";\n var name = attr(element, \"simple-event\");\n if (!name || isForm !== (event.type === \"submit\")) return;\n\n var metadata = { tag: element.tagName.toLowerCase() };\n var attributes = element.attributes;\n for (var i = 0; i < attributes.length; i++) {\n var attribute = attributes[i];\n if (attribute.name.indexOf(\"data-simple-event-\") === 0)\n metadata[attribute.name.slice(18).replace(/-/g, \"_\")] =\n attribute.value;\n }\n if (isForm) {\n var button = event.submitter;\n metadata.button_text = button\n ? (button.textContent || button.value || \"\")\n .replace(/\\s+/g, \" \")\n .trim()\n .slice(0, 200)\n : \"\";\n }\n sendEvent(name, metadata, undefinedVar, trueVar);\n };\n\n doc.addEventListener(\"click\", inlineEvent, falseVar);\n doc.addEventListener(\"submit\", inlineEvent, falseVar);\n\n // 404 confirmation adds a request, so existing installs must opt in.\n if (\n overwriteOptions.detect404 === trueVar ||\n attr(scriptElement, \"detect-404\") == trueText\n ) {\n var detect404 = function () {\n if (\n !/\\b404\\b/.test(doc.title + \" \" + (doc.body && doc.body.textContent))\n )\n return;\n try {\n var request = new window.XMLHttpRequest();\n request.open(\"HEAD\", loc.href, trueVar);\n request.onload = function () {\n if (request.status === 404)\n sendEvent(\"page_404\", {\n url: loc.protocol + \"//\" + definedHostname + loc.pathname,\n status: 404,\n });\n };\n request.send();\n } catch (error) {}\n };\n if (doc.readyState === \"loading\")\n doc.addEventListener(\"DOMContentLoaded\", detect404, falseVar);\n else detect404();\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_proxy_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","keepalive","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","imageUrl","key","fetch","mode","credentials","catch","src","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","protocol","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","parts","querySearch","shift","pathKey","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","manualPageview","defaultPageview","defaultNamespace","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue","detect404","inlineEvent","element","target","parentNode","isForm","tagName","button","tag","toLowerCase","attributes","submitter","button_text","textContent","trim","title","request","XMLHttpRequest","open","href","status","url","send","readyState"],"mappings":"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"} \ No newline at end of file diff --git a/dist/latest/hello.js b/dist/latest/hello.js index dc6d3071..038ae7d9 100644 --- a/dist/latest/hello.js +++ b/dist/latest/hello.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-15; 4ed2) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-15; 1adb) */ -!function(m,t,e,n,v){try{var g=undefined,y=!0,_=!1,r="true",a="https:",w="pageview",u="event",i="error",o=m.console,c="doNotTrack",b=m.navigator,s=m.location,O=s.host,l=m.document,p=b.userAgent,f="Not sending request ",h=f+"when ",E=_,d=encodeURIComponent,x=decodeURIComponent,S=JSON.stringify,k=m.addEventListener,q="https://queue."+e,M=l.documentElement||{},A="language",$="Height",j="scroll",D=b.userAgentData,C=j+$,R="offset"+$,H="client"+$,P="pagehide",T="platform",U="platformVersion",I="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),N=m.screen,z=l.currentScript||l.querySelector('script[src*="'+e+'"]');v=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){v("Error in your "+t+" function:",e)},W=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},G=function(t){return"string"==typeof t},J=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},L=function(t,e){return t&&t.getAttribute("data-"+e)},Y=function(t){return Array.isArray(t)?t:G(t)&&t.length?t.split(/, ?/):[]},Z=function(t){return t&&t.constructor===Object},K=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},it=function(t){return"function"==typeof t},ot="namespace",ct=t[ot]||L(z,ot)||"sa",st=function(t,e){var n=m[ct+"_metadata"];Z(n)&&(t=K(t,n));var r=m[qt];if(!it(r))return qt&&v(qt+" not found, set window."+qt),t;try{return K(t,r.call(m,K(t,e)))}catch(a){F("metadata",a)}},ut=t.strictUtm||L(z,"strict-utm")==r,lt=function(i,t){tt=!i&&nt("q")?"":_;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");tt!==_&&0>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},it=function(t){return"function"==typeof t},ot="namespace",ct=t[ot]||J(B,ot)||"sa",st=function(t,e){var n=m[ct+"_metadata"];Y(n)&&(t=Z(t,n));var r=m[kt];if(!it(r))return kt&&v(kt+" not found, set window."+kt),t;try{return Z(t,r.call(m,Z(t,e)))}catch(a){F("metadata",a)}},ut=t.strictUtm||J(B,"strict-utm")==r,lt=function(i,t){tt=!i&&nt("q")?"":_;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");tt!==_&&0> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch = \"\";\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n var pathKey = path + querySearch;\n if (!path || lastSendPath == pathKey) return;\n\n lastSendPath = pathKey;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"simpleanalyticscdn.com\",\n \"queue.\",\n \"cdn_hello_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","protocol","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","parts","querySearch","shift","pathKey","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"hello.source.js","sources":["hello.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData, keepalive) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n var imageUrl =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n\n // Inline events must survive navigation without taking over links or forms.\n if (keepalive && window.fetch) {\n try {\n window\n .fetch(imageUrl, {\n keepalive: trueVar,\n mode: \"no-cors\",\n credentials: \"omit\",\n })\n .catch(function () {\n image.src = imageUrl;\n });\n return;\n } catch (error) {}\n }\n image.src = imageUrl;\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch = \"\";\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n var pathKey = path + querySearch;\n if (!path || lastSendPath == pathKey) return;\n\n lastSendPath = pathKey;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n var manualPageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n window[namespace + \"_\" + pageviewText] = manualPageview;\n var defaultPageview = defaultNamespace + \"_\" + pageviewText;\n if (!window[defaultPageview]) window[defaultPageview] = manualPageview;\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw, keepalive) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback,\n undefinedVar,\n keepalive\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n\n var inlineEvent = function (event) {\n var element = event.target;\n while (\n element &&\n element !== doc &&\n (!element.getAttribute || attr(element, \"simple-event\") === null)\n )\n element = element.parentNode;\n\n if (!element || element === doc) return;\n var isForm = element.tagName === \"FORM\";\n var name = attr(element, \"simple-event\");\n if (!name || isForm !== (event.type === \"submit\")) return;\n\n var metadata = { tag: element.tagName.toLowerCase() };\n var attributes = element.attributes;\n for (var i = 0; i < attributes.length; i++) {\n var attribute = attributes[i];\n if (attribute.name.indexOf(\"data-simple-event-\") === 0)\n metadata[attribute.name.slice(18).replace(/-/g, \"_\")] =\n attribute.value;\n }\n if (isForm) {\n var button = event.submitter;\n metadata.button_text = button\n ? (button.textContent || button.value || \"\")\n .replace(/\\s+/g, \" \")\n .trim()\n .slice(0, 200)\n : \"\";\n }\n sendEvent(name, metadata, undefinedVar, trueVar);\n };\n\n doc.addEventListener(\"click\", inlineEvent, falseVar);\n doc.addEventListener(\"submit\", inlineEvent, falseVar);\n\n // 404 confirmation adds a request, so existing installs must opt in.\n if (\n overwriteOptions.detect404 === trueVar ||\n attr(scriptElement, \"detect-404\") == trueText\n ) {\n var detect404 = function () {\n if (\n !/\\b404\\b/.test(doc.title + \" \" + (doc.body && doc.body.textContent))\n )\n return;\n try {\n var request = new window.XMLHttpRequest();\n request.open(\"HEAD\", loc.href, trueVar);\n request.onload = function () {\n if (request.status === 404)\n sendEvent(\"page_404\", {\n url: loc.protocol + \"//\" + definedHostname + loc.pathname,\n status: 404,\n });\n };\n request.send();\n } catch (error) {}\n };\n if (doc.readyState === \"loading\")\n doc.addEventListener(\"DOMContentLoaded\", detect404, falseVar);\n else detect404();\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"simpleanalyticscdn.com\",\n \"queue.\",\n \"cdn_hello_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","protocol","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","keepalive","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","imageUrl","key","fetch","mode","credentials","catch","src","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","parts","querySearch","shift","pathKey","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","manualPageview","defaultPageview","defaultNamespace","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue","detect404","inlineEvent","element","target","parentNode","isForm","tagName","button","tag","toLowerCase","attributes","submitter","button_text","textContent","trim","title","request","XMLHttpRequest","open","href","status","url","send","readyState"],"mappings":"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"} \ No newline at end of file diff --git a/dist/latest/latest.dev.js b/dist/latest/latest.dev.js index 1ecd5d5d..ac6344b0 100644 --- a/dist/latest/latest.dev.js +++ b/dist/latest/latest.dev.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-15; 4ad7; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-15; 0605; v12) */ /* eslint-env browser */ (function ( @@ -296,7 +296,7 @@ // // Send data via image - var sendData = function (data, callback, onlyThisData) { + var sendData = function (data, callback, onlyThisData, keepalive) { data = onlyThisData ? data : assign(payload, page, data); if (nav.brave && !onlyThisData) data.brave = trueVar; @@ -309,7 +309,7 @@ image.onerror = callback; image.onload = callback; } - image.src = + var imageUrl = fullApiUrl + "/simple.gif?" + Object.keys(data) @@ -326,6 +326,23 @@ .join("&") + "&time=" + Date.now(); + + // Inline events must survive navigation without taking over links or forms. + if (keepalive && window.fetch) { + try { + window + .fetch(imageUrl, { + keepalive: trueVar, + mode: "no-cors", + credentials: "omit", + }) + .catch(function () { + image.src = imageUrl; + }); + return; + } catch (error) {} + } + image.src = imageUrl; }; // Customers can overwrite their hostname, here we check for that @@ -895,9 +912,12 @@ if (autoCollect) pageview(); - window.sa_pageview = function (path, metadata, callback) { + var manualPageview = function (path, metadata, callback) { pageview(0, path, metadata, callback); }; + window[namespace + "_" + pageviewText] = manualPageview; + var defaultPageview = defaultNamespace + "_" + pageviewText; + if (!window[defaultPageview]) window[defaultPageview] = manualPageview; ///////////////////// @@ -906,7 +926,7 @@ var validTypes = ["string", "number"]; - var sendEvent = function (event, metadata, callbackRaw) { + var sendEvent = function (event, metadata, callbackRaw, keepalive) { if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata; var eventIsFunction = isFunction(event); @@ -954,7 +974,9 @@ metadata: stringify(metadata), }), - callback + callback, + undefinedVar, + keepalive ); } }; @@ -983,6 +1005,71 @@ : sendEvent(queue[event]); } } + + var inlineEvent = function (event) { + var element = event.target; + while ( + element && + element !== doc && + (!element.getAttribute || attr(element, "simple-event") === null) + ) + element = element.parentNode; + + if (!element || element === doc) return; + var isForm = element.tagName === "FORM"; + var name = attr(element, "simple-event"); + if (!name || isForm !== (event.type === "submit")) return; + + var metadata = { tag: element.tagName.toLowerCase() }; + var attributes = element.attributes; + for (var i = 0; i < attributes.length; i++) { + var attribute = attributes[i]; + if (attribute.name.indexOf("data-simple-event-") === 0) + metadata[attribute.name.slice(18).replace(/-/g, "_")] = + attribute.value; + } + if (isForm) { + var button = event.submitter; + metadata.button_text = button + ? (button.textContent || button.value || "") + .replace(/\s+/g, " ") + .trim() + .slice(0, 200) + : ""; + } + sendEvent(name, metadata, undefinedVar, trueVar); + }; + + doc.addEventListener("click", inlineEvent, falseVar); + doc.addEventListener("submit", inlineEvent, falseVar); + + // 404 confirmation adds a request, so existing installs must opt in. + if ( + overwriteOptions.detect404 === trueVar || + attr(scriptElement, "detect-404") == trueText + ) { + var detect404 = function () { + if ( + !/\b404\b/.test(doc.title + " " + (doc.body && doc.body.textContent)) + ) + return; + try { + var request = new window.XMLHttpRequest(); + request.open("HEAD", loc.href, trueVar); + request.onload = function () { + if (request.status === 404) + sendEvent("page_404", { + url: loc.protocol + "//" + definedHostname + loc.pathname, + status: 404, + }); + }; + request.send(); + } catch (error) {} + }; + if (doc.readyState === "loading") + doc.addEventListener("DOMContentLoaded", detect404, falseVar); + else detect404(); + } } catch (e) { sendError(e); } diff --git a/dist/latest/latest.js b/dist/latest/latest.js index f57b93ad..b84ff5bd 100644 --- a/dist/latest/latest.js +++ b/dist/latest/latest.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-15; c1d8; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-15; 0ebb; v12) */ -!function(m,t,e,n,v){try{var g=undefined,y=!0,_=!1,r="true",a="https:",w="pageview",u="event",i="error",o=m.console,c="doNotTrack",b=m.navigator,s=m.location,O=s.host,l=m.document,p=b.userAgent,f="Not sending request ",h=f+"when ",E=_,d=encodeURIComponent,x=decodeURIComponent,S=JSON.stringify,k=m.addEventListener,q="https://queue."+e,M=l.documentElement||{},A="language",$="Height",j="scroll",D=b.userAgentData,C=j+$,R="offset"+$,H="client"+$,P="pagehide",T="platform",U="platformVersion",I="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),N=m.screen,z=l.currentScript||l.querySelector('script[src*="'+e+'"]');v=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){v("Error in your "+t+" function:",e)},W=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},G=function(t){return"string"==typeof t},J=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},L=function(t,e){return t&&t.getAttribute("data-"+e)},Y=function(t){return Array.isArray(t)?t:G(t)&&t.length?t.split(/, ?/):[]},Z=function(t){return t&&t.constructor===Object},K=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},it=function(t){return"function"==typeof t},ot="namespace",ct=t[ot]||L(z,ot)||"sa",st=function(t,e){var n=m[ct+"_metadata"];Z(n)&&(t=K(t,n));var r=m[qt];if(!it(r))return qt&&v(qt+" not found, set window."+qt),t;try{return K(t,r.call(m,K(t,e)))}catch(a){F("metadata",a)}},ut=t.strictUtm||L(z,"strict-utm")==r,lt=function(i,t){tt=!i&&nt("q")?"":_;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");tt!==_&&0>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},it=function(t){return"function"==typeof t},ot="namespace",ct=t[ot]||J(B,ot)||"sa",st=function(t,e){var n=m[ct+"_metadata"];Y(n)&&(t=Z(t,n));var r=m[kt];if(!it(r))return kt&&v(kt+" not found, set window."+kt),t;try{return Z(t,r.call(m,Z(t,e)))}catch(a){F("metadata",a)}},ut=t.strictUtm||J(B,"strict-utm")==r,lt=function(i,t){tt=!i&&nt("q")?"":_;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");tt!==_&&0> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch = \"\";\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n var pathKey = path + querySearch;\n if (!path || lastSendPath == pathKey) return;\n\n lastSendPath = pathKey;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"simpleanalyticscdn.com\",\n \"queue.\",\n \"cdn_latest_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","protocol","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","parts","querySearch","shift","pathKey","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"latest.source.js","sources":["latest.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData, keepalive) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n var imageUrl =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n\n // Inline events must survive navigation without taking over links or forms.\n if (keepalive && window.fetch) {\n try {\n window\n .fetch(imageUrl, {\n keepalive: trueVar,\n mode: \"no-cors\",\n credentials: \"omit\",\n })\n .catch(function () {\n image.src = imageUrl;\n });\n return;\n } catch (error) {}\n }\n image.src = imageUrl;\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch = \"\";\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n var pathKey = path + querySearch;\n if (!path || lastSendPath == pathKey) return;\n\n lastSendPath = pathKey;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n var manualPageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n window[namespace + \"_\" + pageviewText] = manualPageview;\n var defaultPageview = defaultNamespace + \"_\" + pageviewText;\n if (!window[defaultPageview]) window[defaultPageview] = manualPageview;\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw, keepalive) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback,\n undefinedVar,\n keepalive\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n\n var inlineEvent = function (event) {\n var element = event.target;\n while (\n element &&\n element !== doc &&\n (!element.getAttribute || attr(element, \"simple-event\") === null)\n )\n element = element.parentNode;\n\n if (!element || element === doc) return;\n var isForm = element.tagName === \"FORM\";\n var name = attr(element, \"simple-event\");\n if (!name || isForm !== (event.type === \"submit\")) return;\n\n var metadata = { tag: element.tagName.toLowerCase() };\n var attributes = element.attributes;\n for (var i = 0; i < attributes.length; i++) {\n var attribute = attributes[i];\n if (attribute.name.indexOf(\"data-simple-event-\") === 0)\n metadata[attribute.name.slice(18).replace(/-/g, \"_\")] =\n attribute.value;\n }\n if (isForm) {\n var button = event.submitter;\n metadata.button_text = button\n ? (button.textContent || button.value || \"\")\n .replace(/\\s+/g, \" \")\n .trim()\n .slice(0, 200)\n : \"\";\n }\n sendEvent(name, metadata, undefinedVar, trueVar);\n };\n\n doc.addEventListener(\"click\", inlineEvent, falseVar);\n doc.addEventListener(\"submit\", inlineEvent, falseVar);\n\n // 404 confirmation adds a request, so existing installs must opt in.\n if (\n overwriteOptions.detect404 === trueVar ||\n attr(scriptElement, \"detect-404\") == trueText\n ) {\n var detect404 = function () {\n if (\n !/\\b404\\b/.test(doc.title + \" \" + (doc.body && doc.body.textContent))\n )\n return;\n try {\n var request = new window.XMLHttpRequest();\n request.open(\"HEAD\", loc.href, trueVar);\n request.onload = function () {\n if (request.status === 404)\n sendEvent(\"page_404\", {\n url: loc.protocol + \"//\" + definedHostname + loc.pathname,\n status: 404,\n });\n };\n request.send();\n } catch (error) {}\n };\n if (doc.readyState === \"loading\")\n doc.addEventListener(\"DOMContentLoaded\", detect404, falseVar);\n else detect404();\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"simpleanalyticscdn.com\",\n \"queue.\",\n \"cdn_latest_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","protocol","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","keepalive","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","imageUrl","key","fetch","mode","credentials","catch","src","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","parts","querySearch","shift","pathKey","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","manualPageview","defaultPageview","defaultNamespace","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue","detect404","inlineEvent","element","target","parentNode","isForm","tagName","button","tag","toLowerCase","attributes","submitter","button_text","textContent","trim","title","request","XMLHttpRequest","open","href","status","url","send","readyState"],"mappings":";;CAEA,SACEA,EACAC,EACAC,EAIAC,EACAC,GAEA,IAQE,IAAIC,EAAeC,UACfC,GAAU,EACVC,GAAW,EACXC,EAAW,OACXC,EAAQ,SACRC,EAAe,WACfC,EAAY,QACZC,EAAY,QAGZC,EAAMd,EAAOe,QACbC,EAAa,aACbC,EAAMjB,EAAOkB,UACbC,EAAMnB,EAAOoB,SACbC,EAAmBF,EAAIG,KACvBC,EAAMvB,EAAOwB,SACbC,EAAYR,EAAIQ,UAChBC,EAAa,uBACbC,EAAiBD,EAAa,QAC9BE,EAA2BpB,EAC3BqB,EAAyBC,mBACzBC,EAAyBC,mBACzBC,EAAYC,KAAKD,UAEjBE,EAAuBnC,EAAOoC,iBAC9BC,EAAaC,iBAA0BpC,EACvCqC,EAAkBhB,EAAIgB,iBAAmB,GACzCC,EAAW,WACXC,EAAS,SAETC,EAAS,SACTC,EAAS1B,EAAI2B,cACbC,EAAeH,EAASD,EACxBK,EAAe,SAAWL,EAC1BM,EAAe,SAAWN,EAE1BO,EAAW,WACXC,EAAe,WACfC,EAAsB,kBACtBC,EAAU,mCACVC,EAAQ,EACRC,EACF,sBAAsBC,KAAK7B,KAAe,WAAW6B,KAAK7B,GACxD8B,EAASvD,EAAOuD,OAIhBC,EACFjC,EAAIkC,eAAiBlC,EAAImC,cAAc,gBAAkBxD,EAAU,MAOrEE,EAAO,WAEL,IAAIuD,EAAO,GAAGC,MAAMC,KAAKC,WAOzB,OAJAH,EAAKI,QAAQ,qBAINC,SAASC,UAAUC,MAAML,KAAK/C,EAAIV,KAAMU,EAAK6C,IAGtD,IAAIQ,EAAiB,SAAUC,EAAMC,GACnCjE,EAAK,iBAAmBgE,EAAO,aAAcC,IAG3CC,EAAU,SAAUC,EAAKC,GAC3B,OAAOC,OAAOR,UAAUS,eAAeb,KAAKU,EAAKC,IAG/CG,EAAW,SAAUC,GACvB,MAAwB,iBAAVA,GAGZC,EAAc,SAAUC,GAC1B,OAAOA,EAAKC,QAAQ,sBAAuB,SAGzCC,EAAO,SAAUxB,EAAeyB,GAClC,OAAOzB,GAAiBA,EAAc0B,aAAa,QAAUD,IAG3DE,EAA+B,SAAUC,GAC3C,OAAOC,MAAMC,QAAQF,GACjBA,EACAT,EAASS,IAAQA,EAAIG,OACnBH,EAAII,MAAM,OACV,IAGJC,EAAW,SAAUC,GACvB,OAAOA,GAAUA,EAAOC,cAAgBlB,QAGtCmB,EAAS,WAGX,IAFA,IAAIC,EAAK,GACLC,EAAMhC,UACDiC,EAAQ,EAAGA,EAAQD,EAAIP,OAAQQ,IAAS,CAC/C,IAAIC,EAAaF,EAAIC,GACrB,GAAIN,EAASO,GACX,IAAK,IAAIC,KAAWD,EACd1B,EAAQ0B,EAAYC,KACtBJ,EAAGI,GAAWD,EAAWC,IAKjC,OAAOJ,GAGLK,EAAWlG,EAAOmG,YAClBC,EAAcF,GAAYzB,OAAO4B,KAAKpG,GAAkBsF,OAG5DtF,EAAmB2F,EAAO3F,EAAkBiG,GAExCE,GAAahG,EAAK,WAAYH,GAGlC,IA+EIqG,GA/EAC,GAAgBpB,EAClBlF,EAAiBsG,eAAiBvB,EAAKxB,EAAe,mBAGpDgD,GAAwB,SAAUC,GAEpC,OAGgB,IAFdF,GAAcG,OAAO,SAAU5B,GAC7B,OAAO,IAAI6B,OAAO,IAAMF,GAAoBnD,KAAKwB,KAChDS,QAIHqB,GAAMC,KAAKD,IAEXE,GAAO,WACT,IAAIC,EAAe/G,EAAOgH,QAAUhH,EAAOiH,SACvCC,EAAY,CAAC,MAAQ,KAAO,KAAO,KAAO,KAC1CC,EAAY,SAEhB,IACE,OAAOD,EAAUnC,QAAQoC,EAAW,SAAUC,GAC5C,OACEA,EACCL,EAAaM,gBAAgB,IAAIC,WAAW,IAAI,GAC9C,IAAOF,EAAI,GACdG,SAAS,MAEb,MAAOlD,GACP,OAAO6C,EAAUnC,QAAQoC,EAAW,SAAUC,GAC5C,IAAII,EAAqB,GAAhBC,KAAKC,SAAiB,EAE/B,OADMN,EAAI,EAAII,EAAS,EAAJA,EAAW,GACrBD,SAAS,QAKpBI,GAAa,SAAUC,GACzB,MAAsB,mBAARA,GAIZC,GAAgB,YAChBC,GACF7H,EAAiB4H,KACjB7C,EAAKxB,EAAeqE,KAy3BxB,KAt3BME,GAAiB,SAAUC,EAAUC,GACvC,IAAIC,EAAiBlI,EAAO8H,GAAY,aACpCrC,EAASyC,KAAiBF,EAAWpC,EAAOoC,EAAUE,IAC1D,IAAIC,EAA4BnI,EAAOoI,IACvC,IAAKT,GAAWQ,GAKd,OAJIC,IACFhI,EACEgI,GAAoB,0BAA4BA,IAE7CJ,EAET,IACE,OAAOpC,EACLoC,EACAG,EAA0BtE,KAAK7D,EAAQ4F,EAAOoC,EAAUC,KAE1D,MAAO5D,GACPF,EAAe,WAAYE,KAU3BgE,GACFpI,EAAiBoI,WACjBrD,EAAKxB,EAAe,eAAiB/C,EAInC6H,GAAiB,SAAUC,EAAcC,GAC3ClC,IAAKiC,GAAgB/B,GAAsB,KAAO,GAAKhG,EACvD,IAAIiI,GAAKD,GAAmBrH,EAAIuH,QAC7B9E,MAAM,GACN4B,MAAM,KACNkB,OAAO,SAAUiC,GAChB,IAAIC,EAAID,EAASE,QAAQ,KACrBvC,KAAM9F,GAAgB,EAAJoI,GAASD,EAAS/E,MAAMgF,EAAI,KAChDtC,KAAMA,GAAI,IAAM,IAAMqC,EAAS/E,MAAM,EAAGgF,IAE1C,IAAIE,EAASP,IAAiB/B,GAAsB,MAEhDuC,EAAkBC,GAAYC,IAAIpE,GAAaqE,KAAK,KACpDC,EAAQL,EACR,KAAOC,EAAkB,KACzB,YACCV,GAAY,GAAK,KAClB,yCACCA,GAAY,GAAK,QAClB,IACAU,EACA,KACJ,OAAID,IAAWE,GAAYzD,OAAe/E,EAInC,IAAImG,OAAOwC,EAAO,KAAK7F,KAAKqF,KAEpCO,KAAK,KAGR,OADA5C,GAAIA,IAAKjG,EACFoI,GAAKpI,GA+BV+I,GAAiBtB,GAAY,UACjC,GAAI9H,EAAOoJ,KAAmB7I,EAAS,OAAOH,EAAKsB,EAAa,SAChE1B,EAAOqJ,gBAAkB9I,EACzBP,EAAOoJ,IAAkB7I,EAOzB,IAAI+I,GAAW,SAAUrB,EAAMsB,EAAUC,EAAcC,GACrDxB,EAAOuB,EAAevB,EAAOrC,EAAO8D,GAASC,GAAM1B,GAE/ChH,EAAI2I,QAAUJ,IAAcvB,EAAK2B,MAAQrJ,GACzCU,EAAI4I,qBAAuBL,IAAcvB,EAAK6B,KAAOvJ,GAGzD,IAAIwJ,EAAQ,IAAIC,MACZT,IACFQ,EAAME,QAAUV,EAChBQ,EAAMG,OAASX,GAEjB,IAAIY,EACF9H,EACA,eACAoC,OAAO4B,KAAK4B,GACTvB,OAAO,SAAU0D,GAChB,OAAOnC,EAAKmC,IAAQ/J,IAErB4I,IAAI,SAAUmB,GACb,OACEvI,EAAuBuI,GACvB,IACAvI,EAAuBoG,EAAKmC,MAG/BlB,KAAK,KACR,SACArC,KAAKD,MAGP,GAAI6C,GAAazJ,EAAOqK,MACtB,IAUE,YATArK,EACGqK,MAAMF,EAAU,CACfV,UAAWlJ,EACX+J,KAAM,UACNC,YAAa,SAEdC,SAAM,WACLT,EAAMU,IAAMN,IAGhB,MAAO9F,IAEX0F,EAAMU,IAAMN,GAIVO,GACFzK,EAAiB0K,UAAY3F,EAAKxB,EAAe,YAC/CoH,GAAkBF,IAAuBrJ,EAEzCwJ,GAAc,CAChBC,QAstBJ,gBArtBIH,SAAUC,IASZzK,EAAY,SAAU4K,GACpBA,EAAiBA,EAAeC,MAC5BD,EAAiB,IAAMA,EAAeC,MACtCD,EACJ3K,EAAK2K,GACLzB,GACE1D,EAAOiF,GAAa,CAClBI,KAAMpK,EACNwD,MAAO0G,EACPG,KAAM/J,EAAIgK,WAEZ9K,EACAE,IAMJ4B,EACEtB,EACA,SAAUuK,GACJA,EAAMC,WAA+C,EAAnCD,EAAMC,SAASxC,QAAQ3I,IAC3CC,EAAUiL,EAAME,UAGpB9K,GAOF,IAwDI+K,GAxDAC,GAAQ5E,KAER6E,GAAW,EAOXnB,GAAOrK,EAAiBqK,MAAQtF,EAAKxB,EAAe,QAGpDkI,MAhMsBC,GAgMC1L,EAAiByL,cA/LvBC,GAgMjB1L,EAAiByL,WACjB1G,EAAKxB,EAAe,eAAiB/C,GACrCuE,EAAKxB,EAAe,aAAe/C,GACnCuE,EAAKxB,EAAe,gBAAkB/C,EAGtCmL,KACqC,SAAvC5G,EAAKxB,EAAe,iBACpBvD,EAAiB2L,cAAgBpL,GAI/BqL,GACF5L,EAAiB6L,UACjB9G,EAAKxB,EAAe,cACpBsE,GAAY,IAAMlH,EAGhBmL,GAAc5G,EAChBlF,EAAiB8L,aAAe/G,EAAKxB,EAAe,iBAIlDwF,GAAc7D,EAChBlF,EAAiB+I,aAAehE,EAAKxB,EAAe,iBAIlDwI,GAAqB7G,EACvBlF,EAAiB+L,oBACfhH,EAAKxB,EAAe,yBAIpByI,GACFhM,EAAiBgM,gBAAkBjH,EAAKxB,EAAe,mBAGrD4E,GACFnI,EAAiBmI,mBACjBpD,EAAKxB,EAAe,sBAItB,IAEE+H,GAAW/E,GAAsB,KAC7B0F,KAAKC,iBAAiBC,kBAAkBC,SACxChM,EACJ,MAAOgE,IACPjE,EAAKiE,IAOP,IAAIiI,GAAUtM,EAAOsM,QACjBC,GACFtL,EAAIuL,WACJxM,EAAOyM,aACPzM,EAAO0M,aACP1M,EAAO2M,UACNL,KAAYA,GAAQM,QACrB5M,EAAO6M,YACP7M,EAAO8M,MACPzJ,GACAoE,KAAKC,UAAYD,KAAKC,SAGpBqF,GACFvG,GAAsB,MAAQA,GAAsB,QAElD+F,KAAK1B,GAAY0B,IAAMhM,GAE3B,IAAImJ,GAAU9D,EAAOiF,GAAa,CAEhCmC,GAAIxG,GAAsB,MAAQ/E,EAAYpB,EAE9CK,MAAOS,EAAImB,UAAY5B,EACvB6K,SAAUA,GACV0B,QAASF,GAAqBjG,KAASzG,EAGvC6M,WAAY1G,GAAsB,MAAQM,KAASzG,IA0BrD,GAvBAqJ,GAAQyD,IAAM3M,EAIVmC,IACF+G,GAAQ0D,OAASzK,EAAOyK,OACxB1D,GAAQ2D,OAASpL,EAAUU,EAAO0K,SAS/B9L,EAAI+L,SAASlN,EAAK,4CAInBwK,KAAoBvJ,IACtBqI,GAAQ6D,kBAAoBlM,IAGzBqK,IAAc1K,KAAcC,GAA0B,KAAnBA,EAAID,GAC1C,OAAOZ,EACLuB,EAAiBX,EAAa,oBAAsBmC,EAAU,SAK7B,GAAlC9B,EAAiBwH,QAAQ,OACxB,aAAavF,KAAKjC,IACnBqJ,IAEDtK,EACE,mBACEiB,EACA,SACA8B,EACA,0BAON,IACIqK,GA0DAC,GA3DA9D,GAAO,GAGP+D,GAAc,WAKhB,OAFEzN,EAAiB0N,UAAY3I,EAAKxB,EAAe,aAGzBjC,EAAIoM,UAAY,IACrC5I,QAAQ1D,EAAkBuJ,IAC1B7F,QAAQ,sDAAuD,MAC/DA,QAAQ,YAAa,OAAS1E,GAKjCsN,GAAWD,KAOXE,GAAW,EAEXC,GAAc,SAAUC,EAAIC,GAC9B,GAAKhB,GAAL,CAEA,IAAIiB,EAASpI,EAAOiF,GAAa,CAC/BI,KAAM,SACNgD,YAAaF,EAAOD,EAAKpE,GAAQuD,UAenC,GAXIzG,GAAsB,OACxBwH,EAAOE,SAAWzG,KAAK0G,OAAOvH,KAAQ4E,GAAQoC,IAphBnC,MAshBbA,GAAW,EACXpC,GAAQ5E,KAGJJ,GAAsB,UACxBwH,EAAOvC,SAAWhE,KAAK2G,IAAI,EAAG3C,GAAU4C,OAGtCN,IAAS9M,EAAIqN,WAEfhF,GAAS0E,EAAQ3N,EAAcE,QAE/B,IACEU,EAAIqN,WAAWC,KAAKtN,EAApBA,CAAyBoB,EAAa,UAAWJ,EAAU+L,IAC3D,MAAOQ,GAEPlF,GAAS0E,EAAQ3N,EAAcE,MAMrC4B,EACE,mBACA,WACMZ,EAAIkN,QACA,KAAOzL,KAAYhD,GAAS6N,KAClCJ,GAAc7G,MACTgH,IAAYhH,KAAQ6G,IAE7BjN,GAGF2B,EAAqBa,EAAU6K,GAAarN,GAE5C,IAAIkO,GAAOnN,EAAImN,MAAQ,GACnBL,GAAW,WACb,IACE,IAAIM,EAAuBpM,EAAgBQ,IAAiB,EACxD6L,EAASnH,KAAK2G,IAChBM,GAAK7L,IAAiB,EACtB6L,GAAK5L,IAAiB,EACtBP,EAAgBQ,IAAiB,EACjCR,EAAgBM,IAAiB,EACjCN,EAAgBO,IAAiB,GAEnC,OAAO2E,KAAKoH,IACV,IAKI,EAJJpH,KAAK0G,MACF,MAAQ5L,EAAgBuM,WAAa,GAAKH,GACzCC,EACA,IAGN,MAAOvK,IAEP,OADAjE,EAAKiE,IACE,IAIXlC,EAAqB,OAAQ,WAC3BsJ,GAAW4C,KACXlM,EACEO,EACA,WACM+I,GAAW4C,OAAY5C,GAAW4C,OAExC7N,KAQJ,IAgCIuO,GAoCAC,GAAUC,GApEVC,GAAU,SAAUC,GACtB,IAAIjE,EAAO,GAIX,IACEA,EAAOiE,GAAapN,EAAuBZ,EAAIgK,UAC/C,MAAO9G,IACPjE,EAAKiE,IAGP,IAAI+K,EAAyBpP,EAAOiM,IACpC,GAAItE,GAAWyH,GACb,IACElE,EAAOkE,EAAuBvL,KAAK7D,EAAQ,CAAEkL,KAAMA,KAAWA,EAC9D,MAAO7G,IACPF,EAAe,OAAQE,IAK3B,IA7ZiB,SAAU6G,GAC3B,IAAK,IAAItC,KAAKmD,GAAa,CACzB,IAAIsD,EAAgBtD,GAAYnD,GAChC,GAAKyG,EAAL,CAGA,IAAIC,EA9OI,KA+OND,EAAc,GAAcA,EA/OtB,IA+O8CA,EAEtD,GACEC,IAAepE,GACf,IAAIvE,OACF,IAAM9B,EAAYyK,GAAYvK,QAAQ,SAAU,QAAU,IAC1D,KACAzB,KAAK4H,GAEP,OAAO3K,GAEX,OAAOC,EA2YH+O,CAAarE,GAQjB,MAFY,QAARZ,IAAkBnJ,EAAIqO,OAAMtE,GAAQ/J,EAAIqO,KAAKhK,MAAM,KAAK,IAErD0F,EAPL9K,EAAKuB,EAAiB,YAAcuJ,IAgDpCuE,GAAW,SACbC,EACAC,EACA3H,EACA4H,IAEKA,GAAejI,GAAWK,KAAW4H,EAAc5H,GACxD,IAIM6H,EAJFtG,EAAW5B,GAAWiI,GAAeA,EAAc,aACnDE,EAAc,GACdnL,EAASgL,KAAgD,EAA9BA,EAAc9G,QAAQ,OAGnD8G,GADIE,EAAQF,EAAcnK,MAAM,MACVuK,QACtBD,EAAc,IAAMD,EAAM3G,KAAK,MAGjC,IAAIgC,EAAOgE,GAAQS,GAGfK,EAAU9E,EAAO4E,EACrB,GAAK5E,GAAQsC,IAAgBwC,EAA7B,CAEAxC,GAAewC,EACfrG,GAAKuB,KAAOA,EAGR1E,GAAsB,OACxBmD,GAAKsG,eACHxI,KAAK2G,IAAI7L,EAA2B,aAAK,EAAGvC,EAAOkQ,YAAc,IACjE,KACFvG,GAAKwG,gBACH1I,KAAK2G,IACH7L,EAAgBQ,IAAiB,EACjC/C,EAAOoQ,aAAe,IACnB,MAIL5J,GAAsB,MACpBvF,EAAIuB,KAAWmH,GAAKnH,GAAYvB,EAAIuB,IAItCe,GAAUiD,GAAsB,QAClCmD,GAAK0G,aAAe9M,EAAO+M,MAC3B3G,GAAK4G,cAAgBhN,EAAOqL,QAI9B,IAII4B,EAJAC,EAAOzQ,EAAO0Q,YACdC,EAAiB,aAIrB,IACEH,EAAsBC,EAAKG,iBAAiBD,GAAgB,GAAG1F,KAC/D,MAAO5G,IACPjE,EAAKiE,IAGP4K,GAAgBuB,GAC+C,EAA3D,CAAC,SAAU,gBAAgB3H,QAAQ2H,GAGnCC,GACAA,EAAKE,KACwC,EAA7C,CAAC,EAAG,GAAG9H,QAAQ4H,EAAKE,GAAgB1F,MAGxC,IAAI4F,EAA0BlD,GAC1BA,GAASnI,MA5vBH,KA4vBgB,GACtBnF,EACJ2O,GAAWrB,IACgD,EAAvD3B,GAAmBnD,QAAQgI,IAC3BA,GAA2BxP,EAC3Bb,EAGJmJ,GAAKmH,OACH,QAAQxN,KAAKoK,OAAkBgC,GAAeT,GAC1CzO,GACCwO,GAEPhH,EAAWD,GAAeC,EAAU,CAClCiD,KAAMtK,EACNuK,KAAMvB,GAAKuB,OAGb,IAAI6F,EAAsB,WACxBnP,EAA2BrB,EAC3B,IAAIyQ,EACFtB,GAAeT,KAAkBzI,GAAsB,MA9H1C,SACjBkJ,EACAuB,EACAjC,EACAtG,EACAV,EACAuB,GAEImG,GAAa7B,GAAY,GAAKnE,GAAQuD,QAAS1M,GAC/CwM,KAAoBrD,GAAQuD,QAAUnG,MAE1C,IAAIoK,EAActG,GAAkBsE,KAChCiC,EAAQ7I,GAAe2I,EAAkBvI,GAE7CY,GACE,CACEwE,GAAIpE,GAAQuD,QACZhC,KAAMtK,EACNgN,UAAWsD,GAAoBjC,EAAWrB,GAAW,KACrDwD,MAAOA,EACP7K,EAAGA,GAEH0B,SAAU/F,EAAU+F,IAEtBuB,GAGFwF,GAAmBpB,GACnBA,GAAWuD,EAEX9N,IAiGEgO,CACE1B,EACAsB,EACAhC,GACAc,EACA9H,EACAuB,IAIJ,GAAK3H,EAmBHmP,SAjBA,IACMpO,GAAUgF,GAAWhF,EAAO0O,sBAC9B1O,EACG0O,qBAAqB,CAACpO,EAAcC,IACpCoO,KAAK,SAAUC,GACd7H,GAAQ8H,QAAUD,EAAkBtO,GACpCyG,GAAQ+H,WAAaF,EAAkBrO,GACvC6N,MAEDvG,SAAMuG,GAETA,IAEF,MAAOvC,GACPuC,OAWFW,GAAM1R,EAAO2R,QACbC,GAAeF,GAAMA,GAAIG,UAAYxR,EACrCyR,GAAM9R,EAAO+R,cACbC,GAAgB,YAIhBpG,IAAegG,IAAgBK,OAASH,KAqB1CJ,GAAIG,WAnBEK,GAAOR,GADiBzG,GAoBA+G,IAlBrB,WACL,IAEI5G,EAFAtF,EAAMhC,UACNqO,EAAKD,GAAKhO,MAAMkO,KAAMtM,GAY1B,OAVI6B,GAAWsK,OACb7G,EAAQ,IAAI6G,MAAMhH,KAIlBG,EAAQ7J,EAAI8Q,YAAY,UAClBC,UAAUrH,GAAM1K,EAASA,GAEjC6K,EAAMtH,UAAYgC,EAClBgM,GAAI1G,GACG+G,IAMXhQ,EACE6P,GACA,WACEvC,GAAS,IAEXjP,GAGF2B,EACE,WACA,WACEsN,GAAS,IAEXjP,IAKAoL,IAAuB,QAARtB,IAAkB,iBAAkBtK,GACrDmC,EACE,aACA,WACEsN,GAAS,IAEXjP,GAIAoL,IAAa6D,KAEjB,IAAI8C,GAAiB,SAAUrH,EAAMlD,EAAUuB,GAC7CkG,GAAS,EAAGvE,EAAMlD,EAAUuB,IAE9BvJ,EAAO8H,GAAY,IAAMnH,GAAgB4R,GACzC,IAAIC,GAAkBC,MAAyB9R,EAC1CX,EAAOwS,MAAkBxS,EAAOwS,IAAmBD,IAOxD,IAAIG,GAAa,CAAC,SAAU,UAExBC,GAAY,SAAUvH,EAAOpD,EAAU4H,EAAanG,IACjDmG,GAAejI,GAAWK,KAAW4H,EAAc5H,GAExD,IAAI4K,EAAkBjL,GAAWyD,GAC7B7B,EAAW5B,GAAWiI,GAAeA,EAAc,aACnDiD,SAAmBzH,EAEvB,GAAIsH,GAAW7J,QAAQgK,GAAa,IAAMD,EAExC,OADAzO,EAAe0H,GAAmBjL,EAAY,aAAeiS,GACtDtJ,IAGT,IACE,GAAIqJ,EAAiB,CACnB,IAAIE,EAAc1H,IAClB,GAAIsH,GAAW7J,eAAeiK,GAAe,EAK3C,OAJA3O,EACE0H,GACAT,EAAQ,uBAAyB0H,GAE5BvJ,IAET6B,EAAQ0H,GAEV,MAAOzO,IAEP,OADAF,EAAe0H,GAAmBxH,IAC3BkF,IAGT6B,GAAS,GAAKA,GAAOrG,QAAQ,eAAgB,KAAKA,QAAQ,WAAY,IAEtE,IAAIgO,EAAc,CAAE9H,KAAMrK,EAAWwK,MAAOA,GACxC4H,GAAa/D,IAAiB7L,EAAQ,EAE1C4E,EAAWD,GAAeC,EAAU+K,GAEhC3H,GACF9B,GACE1D,EAAOmN,EAAa,CAClBjF,GAAIhH,KACJqK,MAAO7I,IAAgB0K,GACvBrF,UACGqF,GAAahE,KAAaxI,GAAsB,KAC7CuI,GACA,KAEN/G,SAAU/F,EAAU+F,KAEtBuB,EACAlJ,EACAoJ,IAKFwJ,GAAmB,SAAU7H,EAAOpD,EAAUuB,GAChDoJ,GAAUvH,EAAOpD,EAAUuB,IAIxBvJ,EAAO6L,MACV7L,EAAO6L,IAAqBoH,IAE9B,IAAIC,GAAYlT,EAAO6L,IAGnBsH,GAAQD,IAAaA,GAAUzK,EAAIyK,GAAUzK,EAAI,GAMrD,IAAK,IAAI2C,MAHTpL,EAAO6L,IAAqBoH,GAGVE,GACZ7O,EAAQ6O,GAAO/H,MACjB/F,MAAMC,QAAQ6N,GAAM/H,KAChBuH,GAAUzO,MAAM,KAAMiP,GAAM/H,KAC5BuH,GAAUQ,GAAM/H,MAIxB,IA0CMgI,GA1CFC,GAAc,SAAUjI,GAE1B,IADA,IAAIkI,EAAUlI,EAAMmI,OAElBD,GACAA,IAAY/R,KACV+R,EAAQpO,cAAkD,OAAlCF,EAAKsO,EAAS,kBAExCA,EAAUA,EAAQE,WAEpB,GAAKF,GAAWA,IAAY/R,EAA5B,CACA,IAAIkS,EAA6B,SAApBH,EAAQI,QACjBtP,EAAOY,EAAKsO,EAAS,gBACzB,GAAKlP,GAAQqP,IAA2B,WAAfrI,EAAMH,MAA/B,CAIA,IAFA,IASM0I,EATF3L,EAAW,CAAE4L,IAAKN,EAAQI,QAAQG,eAClCC,EAAaR,EAAQQ,WAChBlL,EAAI,EAAGA,EAAIkL,EAAWvO,OAAQqD,IAAK,CAC1C,IAAI3D,EAAY6O,EAAWlL,GAC0B,IAAjD3D,EAAUb,KAAKyE,QAAQ,wBACzBb,EAAS/C,EAAUb,KAAKR,MAAM,IAAImB,QAAQ,KAAM,MAC9CE,EAAU0G,OAEZ8H,IACEE,EAASvI,EAAM2I,UACnB/L,EAASgM,YAAcL,GAClBA,EAAOM,aAAeN,EAAOhI,OAAS,IACpC5G,QAAQ,OAAQ,KAChBmP,OACAtQ,MAAM,EAAG,KACZ,IAEN+O,GAAUvO,EAAM4D,EAAU3H,EAAcE,MAG1CgB,EAAIa,iBAAiB,QAASiR,GAAa7S,GAC3Ce,EAAIa,iBAAiB,SAAUiR,GAAa7S,GAI1CP,EAAiBmT,YAAc7S,GAC/ByE,EAAKxB,EAAe,eAAiB/C,IAEjC2S,GAAY,WACd,GACG,UAAU9P,KAAK/B,EAAI4S,MAAQ,KAAO5S,EAAImN,MAAQnN,EAAImN,KAAKuF,cAG1D,IACE,IAAIG,EAAU,IAAIpU,EAAOqU,eACzBD,EAAQE,KAAK,OAAQnT,EAAIoT,KAAMhU,GAC/B6T,EAAQlK,OAAS,WACQ,MAAnBkK,EAAQI,QACV7B,GAAU,WAAY,CACpB8B,IAAKtT,EAAImB,SAAW,KAAOsI,GAAkBzJ,EAAIgK,SACjDqJ,OAAQ,OAGdJ,EAAQM,OACR,MAAOrQ,OAEY,YAAnB9C,EAAIoT,WACNpT,EAAIa,iBAAiB,mBAAoBgR,GAAW5S,GACjD4S,MAEP,MAAO5E,IACPrO,EAAUqO,IAnNY,IAAUvD,GACxBiH,GAvoBkBvG,GAnN9B,CA+iCE3L,OACA,uBACA"} \ No newline at end of file diff --git a/dist/latest/light.js b/dist/latest/light.js index b9c0174b..7855aaf2 100644 --- a/dist/latest/light.js +++ b/dist/latest/light.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-15; 4572; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-15; 57e5; v12) */ -!function(f,e,t,m){try{var u=undefined,n="https:",r=f.console,a="doNotTrack",g=f.navigator,p=f.location,h=p.host,i=f.document,o=g.userAgent,c="Not sending request ",v=!1,s=encodeURIComponent,d=decodeURIComponent,l=JSON.stringify,y=f.addEventListener,_="https://queue."+t,b=(i.documentElement,"language"),w=g.userAgentData,O="platform",S="platformVersion",j="https://docs.simpleanalytics.com",k=/(bot|spider|crawl)/i.test(o)&&!/(cubot)/i.test(o),E=i.currentScript||i.querySelector('script[src*="'+t+'"]');m=function(){var e=[].slice.call(arguments);return e.unshift("Simple Analytics:"),Function.prototype.apply.call(r.warn,r,e)};var q=function(e){return"string"==typeof e},x=function(e,t){return e&&e.getAttribute("data-"+t)},A=function(){for(var e,t,n,r={},a=arguments,i=0;i>e/4).toString(16)})}catch(r){return e.replace(n,function(e){var t=16*Math.random()|0;return(e<2?t:3&t|8).toString(16)})}},N=function(e){return"function"==typeof e},R="namespace",U=e[R]||x(E,R)||"sa",V=e.strictUtm||"true"==x(E,"strict-utm"),B=U+"_loaded";if(1==f[B])return m(c+"twice");f.sa_event_loaded=!0,f[B]=!0;var C,T=function(t,e,n){t=n?t:A(J,M,t),g.brave&&!n&&(t.brave=!0),g._duckduckgoloader_&&!n&&(t.duck=!0),(new Image).src=_+"/simple.gif?"+Object.keys(t).filter(function(e){return t[e]!=u}).map(function(e){return s(e)+"="+s(t[e])}).join("&")+"&time="+Date.now()},F=e.hostname||x(E,"hostname"),H=F||h,z={version:"cdn_light_12",hostname:H};e.mode||x(E,"mode");try{C=Intl.DateTimeFormat().resolvedOptions().timeZone}catch(X){m(X)}k&&(z.bot=!0);var J=A(z,{ua:o,https:p.protocol==n,timezone:C,page_id:I(),session_id:I()});if(J.sri=!1,w&&(J.mobile=w.mobile,J.brands=l(w.brands)),H!==h&&(J.hostname_original=h),a in g&&"1"==g[a])return m("Not sending request when "+a+" is enabled. See "+j+"/dnt");-1!=h.indexOf(".")&&!/^[0-9.:]+$/.test(h)||F||m("Set hostname on "+h+". See "+j+"/overwrite-domain-name");var L,M={},P=(e.referrer||x(E,"referrer")||i.referrer||"").replace(h,H).replace(/^https?:\/\/((m|l|w{2,3}([0-9]+)?)\.)?([^?#]+)(.*)$/,"$4").replace(/^([^/]+)$/,"$1")||u,Z=function(e,t){var n=A(z,{type:"append",original_id:t?e:J.page_id});if(t||!g.sendBeacon)T(n,0,!0);else try{g.sendBeacon.bind(g)(_+"/append",l(n))}catch(r){T(n,0,!0)}};y("pagehide",Z,!1);var G,K,Q=function(e){var t="";try{t=e||d(p.pathname)}catch(X){m(X)}return t},W=function(e,t,n,r,a,i){e&&Z(""+J.page_id,!0),J.page_id=I();var o,c=H+Q(),s=(o=t,(r||p.search).slice(1).split("&").filter(function(e){return!o&&new RegExp("^((utm_)"+(V?"":"?")+"(source|medium|content|term|campaign)"+(V?"":"|ref")+")=","i").test(e)}).join("&")||u);T({id:J.page_id,type:"pageview",referrer:!t||n?P:null,query:s}),P=c,0};!function(e,t,n,r){!r&&N(n)&&(r=n);N(r);var a,i="";q(t)&&-1>e/4).toString(16)})}catch(r){return e.replace(n,function(e){var t=16*Math.random()|0;return(e<2?t:3&t|8).toString(16)})}},N=function(e){return"function"==typeof e},R="namespace",U=e[R]||x(E,R)||"sa",V=e.strictUtm||"true"==x(E,"strict-utm"),B=U+"_loaded";if(1==f[B])return m(c+"twice");f.sa_event_loaded=!0,f[B]=!0;var C,T=function(t,e,n,r){t=n?t:A(J,M,t),g.brave&&!n&&(t.brave=!0),g._duckduckgoloader_&&!n&&(t.duck=!0);var a=new Image,i=_+"/simple.gif?"+Object.keys(t).filter(function(e){return t[e]!=u}).map(function(e){return s(e)+"="+s(t[e])}).join("&")+"&time="+Date.now();a.src=i},F=e.hostname||x(E,"hostname"),H=F||h,z={version:"cdn_light_12",hostname:H};e.mode||x(E,"mode");try{C=Intl.DateTimeFormat().resolvedOptions().timeZone}catch(X){m(X)}k&&(z.bot=!0);var J=A(z,{ua:o,https:p.protocol==n,timezone:C,page_id:I(),session_id:I()});if(J.sri=!1,w&&(J.mobile=w.mobile,J.brands=l(w.brands)),H!==h&&(J.hostname_original=h),a in g&&"1"==g[a])return m("Not sending request when "+a+" is enabled. See "+j+"/dnt");-1!=h.indexOf(".")&&!/^[0-9.:]+$/.test(h)||F||m("Set hostname on "+h+". See "+j+"/overwrite-domain-name");var L,M={},P=(e.referrer||x(E,"referrer")||i.referrer||"").replace(h,H).replace(/^https?:\/\/((m|l|w{2,3}([0-9]+)?)\.)?([^?#]+)(.*)$/,"$4").replace(/^([^/]+)$/,"$1")||u,Z=function(e,t){var n=A(z,{type:"append",original_id:t?e:J.page_id});if(t||!g.sendBeacon)T(n,0,!0);else try{g.sendBeacon.bind(g)(_+"/append",l(n))}catch(r){T(n,0,!0)}};y("pagehide",Z,!1);var G,K,Q=function(e){var t="";try{t=e||d(p.pathname)}catch(X){m(X)}return t},W=function(e,t,n,r,a,i){e&&Z(""+J.page_id,!0),J.page_id=I();var o,c=H+Q(),s=(o=t,(r||p.search).slice(1).split("&").filter(function(e){return!o&&new RegExp("^((utm_)"+(V?"":"?")+"(source|medium|content|term|campaign)"+(V?"":"|ref")+")=","i").test(e)}).join("&")||u);T({id:J.page_id,type:"pageview",referrer:!t||n?P:null,query:s}),P=c,0};!function(e,t,n,r){!r&&N(n)&&(r=n);N(r);var a,i="";q(t)&&-1> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n if (ignore) return falseVar;\n // eslint-disable-next-line no-redeclare\n var regex =\n \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \")=\";\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n return q || undefinedVar;\n };\n\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n\n\n\n\n\n\n\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n // eslint-disable-next-line no-redeclare\n var bot = isBotAgent;\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n\n\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch = \"\";\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n var pathKey = path + querySearch;\n if (!path || lastSendPath == pathKey) return;\n\n lastSendPath = pathKey;\n page.path = path;\n\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n sameSite = referrer\n ? referrer.split(slash)[0] == locationHostname\n : falseVar;\n\n\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n\n\n pageview();\n\n } catch (e) {\n warn(e);\n }\n})(\n window,\n {},\n \"simpleanalyticscdn.com\",\n \"queue.\",\n \"cdn_light_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","warn","undefinedVar","undefined","https","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","protocol","language","documentElement","uaData","userAgentData","platformText","platformVersionText","docsUrl","isBotAgent","test","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","isString","string","attr","attribute","getAttribute","assign","obj","prop","object","to","arg","index","length","nextSource","constructor","Object","nextKey","hasOwnProperty","settings","sa_settings","logSettings","keys","Date","now","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","replace","c","getRandomValues","Uint8Array","toString","error","r","Math","random","isFunction","func","namespaceText","namespace","strictUtm","loadedVariable","sa_event_loaded","timezone","sendData","data","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","Image","src","filter","key","map","join","overwrittenHostname","hostname","definedHostname","basePayload","version","mode","Intl","DateTimeFormat","resolvedOptions","timeZone","bot","ua","page_id","session_id","sri","mobile","brands","hostname_original","indexOf","lastSendPath","referrer","sendOnLeave","id","push","append","type","original_id","sendBeacon","bind","e","sameSite","userNavigated","getPath","overwrite","path","pathname","sendPageView","isPushState","deleteSourceInfo","search","metadata","ignoreSource","currentPage","query","split","keyValue","RegExp","pages","pathOverwrite","callbackRaw","parts","querySearch","shift","pathKey","performaceEntryType","perf","performance","navigationText","getEntriesByType","triggerSendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","pageview"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"light.source.js","sources":["light.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n\n var collectMetricByString = function (metricAbbreviation) {\n // eslint-disable-next-line no-unreachable\n return true;\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n if (ignore) return falseVar;\n // eslint-disable-next-line no-redeclare\n var regex =\n \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \")=\";\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n return q || undefinedVar;\n };\n\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData, keepalive) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n var imageUrl =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n\n image.src = imageUrl;\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n\n\n\n\n\n\n\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n // eslint-disable-next-line no-redeclare\n var bot = isBotAgent;\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n\n\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch = \"\";\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n var pathKey = path + querySearch;\n if (!path || lastSendPath == pathKey) return;\n\n lastSendPath = pathKey;\n page.path = path;\n\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n sameSite = referrer\n ? referrer.split(slash)[0] == locationHostname\n : falseVar;\n\n\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n\n\n pageview();\n\n } catch (e) {\n warn(e);\n }\n})(\n window,\n {},\n \"simpleanalyticscdn.com\",\n \"queue.\",\n \"cdn_light_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","warn","undefinedVar","undefined","https","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","protocol","language","documentElement","uaData","userAgentData","platformText","platformVersionText","docsUrl","isBotAgent","test","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","isString","string","attr","attribute","getAttribute","assign","obj","prop","object","to","arg","index","length","nextSource","constructor","Object","nextKey","hasOwnProperty","settings","sa_settings","logSettings","keys","Date","now","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","replace","c","getRandomValues","Uint8Array","toString","error","r","Math","random","isFunction","func","namespaceText","namespace","strictUtm","loadedVariable","sa_event_loaded","timezone","sendData","data","callback","onlyThisData","keepalive","payload","page","brave","_duckduckgoloader_","duck","image","Image","imageUrl","filter","key","map","join","src","overwrittenHostname","hostname","definedHostname","basePayload","version","mode","Intl","DateTimeFormat","resolvedOptions","timeZone","bot","ua","page_id","session_id","sri","mobile","brands","hostname_original","indexOf","lastSendPath","referrer","sendOnLeave","id","push","append","type","original_id","sendBeacon","bind","e","sameSite","userNavigated","getPath","overwrite","path","pathname","sendPageView","isPushState","deleteSourceInfo","search","metadata","ignoreSource","currentPage","query","split","keyValue","RegExp","pages","pathOverwrite","callbackRaw","parts","querySearch","shift","pathKey","performaceEntryType","perf","performance","navigationText","getEntriesByType","triggerSendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","pageview"],"mappings":"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"} \ No newline at end of file diff --git a/dist/v12/app.js b/dist/v12/app.js index a234d2f1..b79ebe3b 100644 --- a/dist/v12/app.js +++ b/dist/v12/app.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-15; 0459; SRI-version; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-15; cd24; SRI-version; v12) */ -!function(m,t,e,n,v){try{var g=undefined,y=!0,_=!1,r="true",a="https:",w="pageview",u="event",i="error",o=m.console,c="doNotTrack",b=m.navigator,s=m.location,O=s.host,l=m.document,p=b.userAgent,f="Not sending request ",h=f+"when ",E=_,d=encodeURIComponent,x=decodeURIComponent,S=JSON.stringify,k=m.addEventListener,q="https://queue."+e,M=l.documentElement||{},A="language",$="Height",j="scroll",D=b.userAgentData,C=j+$,R="offset"+$,H="client"+$,P="pagehide",T="platform",U="platformVersion",I="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),N=m.screen,z=l.currentScript||l.querySelector('script[src*="'+e+'"]');v=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){v("Error in your "+t+" function:",e)},W=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},G=function(t){return"string"==typeof t},J=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},L=function(t,e){return t&&t.getAttribute("data-"+e)},Y=function(t){return Array.isArray(t)?t:G(t)&&t.length?t.split(/, ?/):[]},Z=function(t){return t&&t.constructor===Object},K=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},it=function(t){return"function"==typeof t},ot="namespace",ct=t[ot]||L(z,ot)||"sa",st=function(t,e){var n=m[ct+"_metadata"];Z(n)&&(t=K(t,n));var r=m[qt];if(!it(r))return qt&&v(qt+" not found, set window."+qt),t;try{return K(t,r.call(m,K(t,e)))}catch(a){F("metadata",a)}},ut=t.strictUtm||L(z,"strict-utm")==r,lt=function(i,t){tt=!i&&nt("q")?"":_;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");tt!==_&&0>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},it=function(t){return"function"==typeof t},ot="namespace",ct=t[ot]||J(B,ot)||"sa",st=function(t,e){var n=m[ct+"_metadata"];Y(n)&&(t=Z(t,n));var r=m[kt];if(!it(r))return kt&&v(kt+" not found, set window."+kt),t;try{return Z(t,r.call(m,Z(t,e)))}catch(a){F("metadata",a)}},ut=t.strictUtm||J(B,"strict-utm")==r,lt=function(i,t){tt=!i&&nt("q")?"":_;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");tt!==_&&0> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = trueVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch = \"\";\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n var pathKey = path + querySearch;\n if (!path || lastSendPath == pathKey) return;\n\n lastSendPath = pathKey;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"simpleanalyticscdn.com\",\n \"queue.\",\n \"cdn_latest_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","protocol","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","parts","querySearch","shift","pathKey","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"app.js","sources":["app.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData, keepalive) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n var imageUrl =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n\n // Inline events must survive navigation without taking over links or forms.\n if (keepalive && window.fetch) {\n try {\n window\n .fetch(imageUrl, {\n keepalive: trueVar,\n mode: \"no-cors\",\n credentials: \"omit\",\n })\n .catch(function () {\n image.src = imageUrl;\n });\n return;\n } catch (error) {}\n }\n image.src = imageUrl;\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = trueVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch = \"\";\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n var pathKey = path + querySearch;\n if (!path || lastSendPath == pathKey) return;\n\n lastSendPath = pathKey;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n var manualPageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n window[namespace + \"_\" + pageviewText] = manualPageview;\n var defaultPageview = defaultNamespace + \"_\" + pageviewText;\n if (!window[defaultPageview]) window[defaultPageview] = manualPageview;\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw, keepalive) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback,\n undefinedVar,\n keepalive\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n\n var inlineEvent = function (event) {\n var element = event.target;\n while (\n element &&\n element !== doc &&\n (!element.getAttribute || attr(element, \"simple-event\") === null)\n )\n element = element.parentNode;\n\n if (!element || element === doc) return;\n var isForm = element.tagName === \"FORM\";\n var name = attr(element, \"simple-event\");\n if (!name || isForm !== (event.type === \"submit\")) return;\n\n var metadata = { tag: element.tagName.toLowerCase() };\n var attributes = element.attributes;\n for (var i = 0; i < attributes.length; i++) {\n var attribute = attributes[i];\n if (attribute.name.indexOf(\"data-simple-event-\") === 0)\n metadata[attribute.name.slice(18).replace(/-/g, \"_\")] =\n attribute.value;\n }\n if (isForm) {\n var button = event.submitter;\n metadata.button_text = button\n ? (button.textContent || button.value || \"\")\n .replace(/\\s+/g, \" \")\n .trim()\n .slice(0, 200)\n : \"\";\n }\n sendEvent(name, metadata, undefinedVar, trueVar);\n };\n\n doc.addEventListener(\"click\", inlineEvent, falseVar);\n doc.addEventListener(\"submit\", inlineEvent, falseVar);\n\n // 404 confirmation adds a request, so existing installs must opt in.\n if (\n overwriteOptions.detect404 === trueVar ||\n attr(scriptElement, \"detect-404\") == trueText\n ) {\n var detect404 = function () {\n if (\n !/\\b404\\b/.test(doc.title + \" \" + (doc.body && doc.body.textContent))\n )\n return;\n try {\n var request = new window.XMLHttpRequest();\n request.open(\"HEAD\", loc.href, trueVar);\n request.onload = function () {\n if (request.status === 404)\n sendEvent(\"page_404\", {\n url: loc.protocol + \"//\" + definedHostname + loc.pathname,\n status: 404,\n });\n };\n request.send();\n } catch (error) {}\n };\n if (doc.readyState === \"loading\")\n doc.addEventListener(\"DOMContentLoaded\", detect404, falseVar);\n else detect404();\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"simpleanalyticscdn.com\",\n \"queue.\",\n \"cdn_latest_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","protocol","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","keepalive","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","imageUrl","key","fetch","mode","credentials","catch","src","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","parts","querySearch","shift","pathKey","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","manualPageview","defaultPageview","defaultNamespace","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue","detect404","inlineEvent","element","target","parentNode","isForm","tagName","button","tag","toLowerCase","attributes","submitter","button_text","textContent","trim","title","request","XMLHttpRequest","open","href","status","url","send","readyState"],"mappings":"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"} \ No newline at end of file diff --git a/dist/v12/custom/app.js b/dist/v12/custom/app.js index 69d40ee5..e6eec07b 100644 --- a/dist/v12/custom/app.js +++ b/dist/v12/custom/app.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-15; 91bc; SRI-version; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-15; 07e4; SRI-version; v12) */ -!function(m,t,e,n,v){try{var g=undefined,y=!0,_=!1,r="true",a="https:",w="pageview",u="event",i="error",o=m.console,c="doNotTrack",b=m.navigator,s=m.location,O=s.host,l=m.document,p=b.userAgent,f="Not sending request ",h=f+"when ",x=_,d=encodeURIComponent,E=decodeURIComponent,S=JSON.stringify,k=m.addEventListener,M="https://"+e,q=l.documentElement||{},A="language",$="Height",j="scroll",D=b.userAgentData,C=j+$,H="offset"+$,R="client"+$,P="pagehide",T="platform",U="platformVersion",I="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),N=m.screen,z=l.currentScript||l.querySelector('script[src*="'+e+'"]');v=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){v("Error in your "+t+" function:",e)},W=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},G=function(t){return"string"==typeof t},J=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},L=function(t,e){return t&&t.getAttribute("data-"+e)},Y=function(t){return Array.isArray(t)?t:G(t)&&t.length?t.split(/, ?/):[]},Z=function(t){return t&&t.constructor===Object},K=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},it=function(t){return"function"==typeof t},ot="namespace",ct=t[ot]||L(z,ot)||"sa",st=function(t,e){var n=m[ct+"_metadata"];Z(n)&&(t=K(t,n));var r=m[Mt];if(!it(r))return Mt&&v(Mt+" not found, set window."+Mt),t;try{return K(t,r.call(m,K(t,e)))}catch(a){F("metadata",a)}},ut=t.strictUtm||L(z,"strict-utm")==r,lt=function(i,t){tt=!i&&nt("q")?"":_;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");tt!==_&&0"); +!function(v,t,e,n,m){try{var g=undefined,y=!0,_=!1,r="true",a="https:",b="pageview",l="event",i="error",o=v.console,c="doNotTrack",w=v.navigator,s=v.location,O=s.host,u=v.document,p=w.userAgent,f="Not sending request ",d=f+"when ",x=_,h=encodeURIComponent,E=decodeURIComponent,M=JSON.stringify,S=v.addEventListener,k="https://"+e,A=u.documentElement||{},q="language",C="Height",D="scroll",$=w.userAgentData,j=D+C,H="offset"+C,R="client"+C,L="pagehide",N="platform",P="platformVersion",T="https://docs.simpleanalytics.com",U=0,I=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),V=v.screen,B=u.currentScript||u.querySelector('script[src*="'+e+'"]');m=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){m("Error in your "+t+" function:",e)},z=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},W=function(t){return"string"==typeof t},G=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},J=function(t,e){return t&&t.getAttribute("data-"+e)},X=function(t){return Array.isArray(t)?t:W(t)&&t.length?t.split(/, ?/):[]},Y=function(t){return t&&t.constructor===Object},Z=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},it=function(t){return"function"==typeof t},ot="namespace",ct=t[ot]||J(B,ot)||"sa",st=function(t,e){var n=v[ct+"_metadata"];Y(n)&&(t=Z(t,n));var r=v[kt];if(!it(r))return kt&&m(kt+" not found, set window."+kt),t;try{return Z(t,r.call(v,Z(t,e)))}catch(a){F("metadata",a)}},ut=t.strictUtm||J(B,"strict-utm")==r,lt=function(i,t){tt=!i&&nt("q")?"":_;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");tt!==_&&0"); //# sourceMappingURL=app.js.map \ No newline at end of file diff --git a/dist/v12/custom/app.js.map b/dist/v12/custom/app.js.map index e25acfb6..b300b9ef 100644 --- a/dist/v12/custom/app.js.map +++ b/dist/v12/custom/app.js.map @@ -1 +1 @@ -{"version":3,"file":"app.source.js","sources":["app.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = trueVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch = \"\";\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n var pathKey = path + querySearch;\n if (!path || lastSendPath == pathKey) return;\n\n lastSendPath = pathKey;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_app_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","protocol","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","parts","querySearch","shift","pathKey","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue"],"mappings":";;CAEA,SACEA,EACAC,EACAC,EAIAC,EACAC,GAEA,IAQE,IAAIC,EAAeC,UACfC,GAAU,EACVC,GAAW,EACXC,EAAW,OACXC,EAAQ,SACRC,EAAe,WACfC,EAAY,QACZC,EAAY,QAGZC,EAAMd,EAAOe,QACbC,EAAa,aACbC,EAAMjB,EAAOkB,UACbC,EAAMnB,EAAOoB,SACbC,EAAmBF,EAAIG,KACvBC,EAAMvB,EAAOwB,SACbC,EAAYR,EAAIQ,UAChBC,EAAa,uBACbC,EAAiBD,EAAa,QAC9BE,EAA2BpB,EAC3BqB,EAAyBC,mBACzBC,EAAyBC,mBACzBC,EAAYC,KAAKD,UAEjBE,EAAuBnC,EAAOoC,iBAC9BC,EAhBW3B,WAgB4BR,EACvCoC,EAAkBf,EAAIe,iBAAmB,GACzCC,EAAW,WACXC,EAAS,SAETC,EAAS,SACTC,EAASzB,EAAI0B,cACbC,EAAeH,EAASD,EACxBK,EAAe,SAAWL,EAC1BM,EAAe,SAAWN,EAE1BO,EAAW,WACXC,EAAe,WACfC,EAAsB,kBACtBC,EAAU,mCACVC,EAAQ,EACRC,EACF,sBAAsBC,KAAK5B,KAAe,WAAW4B,KAAK5B,GACxD6B,EAAStD,EAAOsD,OAIhBC,EACFhC,EAAIiC,eAAiBjC,EAAIkC,cAAc,gBAAkBvD,EAAU,MAOrEE,EAAO,WAEL,IAAIsD,EAAO,GAAGC,MAAMC,KAAKC,WAOzB,OAJAH,EAAKI,QAAQ,qBAINC,SAASC,UAAUC,MAAML,KAAK9C,EAAIV,KAAMU,EAAK4C,IAGtD,IAAIQ,EAAiB,SAAUC,EAAMC,GACnChE,EAAK,iBAAmB+D,EAAO,aAAcC,IAG3CC,EAAU,SAAUC,EAAKC,GAC3B,OAAOC,OAAOR,UAAUS,eAAeb,KAAKU,EAAKC,IAG/CG,EAAW,SAAUC,GACvB,MAAwB,iBAAVA,GAGZC,EAAc,SAAUC,GAC1B,OAAOA,EAAKC,QAAQ,sBAAuB,SAGzCC,EAAO,SAAUxB,EAAeyB,GAClC,OAAOzB,GAAiBA,EAAc0B,aAAa,QAAUD,IAG3DE,EAA+B,SAAUC,GAC3C,OAAOC,MAAMC,QAAQF,GACjBA,EACAT,EAASS,IAAQA,EAAIG,OACnBH,EAAII,MAAM,OACV,IAGJC,EAAW,SAAUC,GACvB,OAAOA,GAAUA,EAAOC,cAAgBlB,QAGtCmB,EAAS,WAGX,IAFA,IAAIC,EAAK,GACLC,EAAMhC,UACDiC,EAAQ,EAAGA,EAAQD,EAAIP,OAAQQ,IAAS,CAC/C,IAAIC,EAAaF,EAAIC,GACrB,GAAIN,EAASO,GACX,IAAK,IAAIC,KAAWD,EACd1B,EAAQ0B,EAAYC,KACtBJ,EAAGI,GAAWD,EAAWC,IAKjC,OAAOJ,GAGLK,EAAWjG,EAAOkG,YAClBC,EAAcF,GAAYzB,OAAO4B,KAAKnG,GAAkBqF,OAG5DrF,EAAmB0F,EAAO1F,EAAkBgG,GAExCE,GAAa/F,EAAK,WAAYH,GAGlC,IA+EIoG,GA/EAC,GAAgBpB,EAClBjF,EAAiBqG,eAAiBvB,EAAKxB,EAAe,mBAGpDgD,GAAwB,SAAUC,GAEpC,OAGgB,IAFdF,GAAcG,OAAO,SAAU5B,GAC7B,OAAO,IAAI6B,OAAO,IAAMF,GAAoBnD,KAAKwB,KAChDS,QAIHqB,GAAMC,KAAKD,IAEXE,GAAO,WACT,IAAIC,EAAe9G,EAAO+G,QAAU/G,EAAOgH,SACvCC,EAAY,CAAC,MAAQ,KAAO,KAAO,KAAO,KAC1CC,EAAY,SAEhB,IACE,OAAOD,EAAUnC,QAAQoC,EAAW,SAAUC,GAC5C,OACEA,EACCL,EAAaM,gBAAgB,IAAIC,WAAW,IAAI,GAC9C,IAAOF,EAAI,GACdG,SAAS,MAEb,MAAOlD,GACP,OAAO6C,EAAUnC,QAAQoC,EAAW,SAAUC,GAC5C,IAAII,EAAqB,GAAhBC,KAAKC,SAAiB,EAE/B,OADMN,EAAI,EAAII,EAAS,EAAJA,EAAW,GACrBD,SAAS,QAKpBI,GAAa,SAAUC,GACzB,MAAsB,mBAARA,GAIZC,GAAgB,YAChBC,GACF5H,EAAiB2H,KACjB7C,EAAKxB,EAAeqE,KAkyBxB,KA/xBME,GAAiB,SAAUC,EAAUC,GACvC,IAAIC,EAAiBjI,EAAO6H,GAAY,aACpCrC,EAASyC,KAAiBF,EAAWpC,EAAOoC,EAAUE,IAC1D,IAAIC,EAA4BlI,EAAOmI,IACvC,IAAKT,GAAWQ,GAKd,OAJIC,IACF/H,EACE+H,GAAoB,0BAA4BA,IAE7CJ,EAET,IACE,OAAOpC,EACLoC,EACAG,EAA0BtE,KAAK5D,EAAQ2F,EAAOoC,EAAUC,KAE1D,MAAO5D,GACPF,EAAe,WAAYE,KAU3BgE,GACFnI,EAAiBmI,WACjBrD,EAAKxB,EAAe,eAAiB9C,EAInC4H,GAAiB,SAAUC,EAAcC,GAC3ClC,IAAKiC,GAAgB/B,GAAsB,KAAO,GAAK/F,EACvD,IAAIgI,GAAKD,GAAmBpH,EAAIsH,QAC7B9E,MAAM,GACN4B,MAAM,KACNkB,OAAO,SAAUiC,GAChB,IAAIC,EAAID,EAASE,QAAQ,KACrBvC,KAAM7F,GAAgB,EAAJmI,GAASD,EAAS/E,MAAMgF,EAAI,KAChDtC,KAAMA,GAAI,IAAM,IAAMqC,EAAS/E,MAAM,EAAGgF,IAE1C,IAAIE,EAASP,IAAiB/B,GAAsB,MAEhDuC,EAAkBC,GAAYC,IAAIpE,GAAaqE,KAAK,KACpDC,EAAQL,EACR,KAAOC,EAAkB,KACzB,YACCV,GAAY,GAAK,KAClB,yCACCA,GAAY,GAAK,QAClB,IACAU,EACA,KACJ,OAAID,IAAWE,GAAYzD,OAAe9E,EAInC,IAAIkG,OAAOwC,EAAO,KAAK7F,KAAKqF,KAEpCO,KAAK,KAGR,OADA5C,GAAIA,IAAKhG,EACFmI,GAAKnI,GA+BV8I,GAAiBtB,GAAY,UACjC,GAAI7H,EAAOmJ,KAAmB5I,EAAS,OAAOH,EAAKsB,EAAa,SAChE1B,EAAOoJ,gBAAkB7I,EACzBP,EAAOmJ,IAAkB5I,EAOzB,IAAI8I,GAAW,SAAUrB,EAAMsB,EAAUC,GACvCvB,EAAOuB,EAAevB,EAAOrC,EAAO6D,GAASC,GAAMzB,GAE/C/G,EAAIyI,QAAUH,IAAcvB,EAAK0B,MAAQnJ,GACzCU,EAAI0I,qBAAuBJ,IAAcvB,EAAK4B,KAAOrJ,GAGzD,IAAIsJ,EAAQ,IAAIC,MACZR,IACFO,EAAME,QAAUT,EAChBO,EAAMG,OAASV,GAEjBO,EAAMI,IACJ5H,EACA,eACAmC,OAAO4B,KAAK4B,GACTvB,OAAO,SAAUyD,GAChB,OAAOlC,EAAKkC,IAAQ7J,IAErB2I,IAAI,SAAUkB,GACb,OACErI,EAAuBqI,GACvB,IACArI,EAAuBmG,EAAKkC,MAG/BjB,KAAK,KACR,SACArC,KAAKD,OAILwD,GACFlK,EAAiBmK,UAAYrF,EAAKxB,EAAe,YAC/C8G,GAAkBF,IAAuB9I,EAEzCiJ,GAAc,CAChBC,QAgpBJ,gBA/oBIH,SAAUC,IASZlK,EAAY,SAAUqK,GACpBA,EAAiBA,EAAeC,MAC5BD,EAAiB,IAAMA,EAAeC,MACtCD,EACJpK,EAAKoK,GACLnB,GACE1D,EAAO2E,GAAa,CAClBI,KAAM7J,EACNuD,MAAOoG,EACPG,KAAMxJ,EAAIyJ,WAEZvK,EACAE,IAMJ4B,EACEtB,EACA,SAAUgK,GACJA,EAAMC,WAA+C,EAAnCD,EAAMC,SAASlC,QAAQ1I,IAC3CC,EAAU0K,EAAME,UAGpBvK,GAOF,IAwDIwK,GAxDAC,GAAQtE,KAERuE,GAAW,EAOXC,GAAOlL,EAAiBkL,MAAQpG,EAAKxB,EAAe,QAGpD6H,MA/KsBC,GA+KCpL,EAAiBmL,cA9KvBC,GA+KjBpL,EAAiBmL,WACjBrG,EAAKxB,EAAe,eAAiB9C,GACrCsE,EAAKxB,EAAe,aAAe9C,GACnCsE,EAAKxB,EAAe,gBAAkB9C,EAGtC6K,KACqC,SAAvCvG,EAAKxB,EAAe,iBACpBtD,EAAiBqL,cAAgB9K,GAI/B+K,GACFtL,EAAiBuL,UACjBzG,EAAKxB,EAAe,cACpBsE,GAAY,IAAMjH,EAGhB6K,GAAcvG,EAChBjF,EAAiBwL,aAAe1G,EAAKxB,EAAe,iBAIlDwF,GAAc7D,EAChBjF,EAAiB8I,aAAehE,EAAKxB,EAAe,iBAIlDmI,GAAqBxG,EACvBjF,EAAiByL,oBACf3G,EAAKxB,EAAe,yBAIpBoI,GACF1L,EAAiB0L,gBAAkB5G,EAAKxB,EAAe,mBAGrD4E,GACFlI,EAAiBkI,mBACjBpD,EAAKxB,EAAe,sBAItB,IAEEyH,GAAWzE,GAAsB,KAC7BqF,KAAKC,iBAAiBC,kBAAkBC,SACxC1L,EACJ,MAAO+D,IACPhE,EAAKgE,IAOP,IAAI4H,GAAUhM,EAAOgM,QACjBC,GACFhL,EAAIiL,WACJlM,EAAOmM,aACPnM,EAAOoM,aACPpM,EAAOqM,UACNL,KAAYA,GAAQM,QACrBtM,EAAOuM,YACPvM,EAAOwM,MACPpJ,GACAoE,KAAKC,UAAYD,KAAKC,SAGpBgF,GACFlG,GAAsB,MAAQA,GAAsB,QAElD0F,KAAK3B,GAAY2B,IAAM1L,GAE3B,IAAIiJ,GAAU7D,EAAO2E,GAAa,CAEhCoC,GAAInG,GAAsB,MAAQ9E,EAAYpB,EAE9CK,MAAOS,EAAIwL,UAAYjM,EACvBsK,SAAUA,GACV4B,QAASH,GAAqB5F,KAASxG,EAGvCwM,WAAYtG,GAAsB,MAAQM,KAASxG,IA0BrD,GAvBAmJ,GAAQsD,IAAMvM,EAIVmC,IACF8G,GAAQuD,OAASrK,EAAOqK,OACxBvD,GAAQwD,OAAS/K,EAAUS,EAAOsK,SAS/BzL,EAAI0L,SAAS7M,EAAK,4CAInBiK,KAAoBhJ,IACtBmI,GAAQ0D,kBAAoB7L,IAGzB+J,IAAcpK,KAAcC,GAA0B,KAAnBA,EAAID,GAC1C,OAAOZ,EACLuB,EAAiBX,EAAa,oBAAsBkC,EAAU,SAK7B,GAAlC7B,EAAiBuH,QAAQ,OACxB,aAAavF,KAAKhC,IACnB8I,IAED/J,EACE,mBACEiB,EACA,SACA6B,EACA,0BAON,IACIiK,GA0DAC,GA3DA3D,GAAO,GAGP4D,GAAc,WAKhB,OAFEpN,EAAiBqN,UAAYvI,EAAKxB,EAAe,aAGzBhC,EAAI+L,UAAY,IACrCxI,QAAQzD,EAAkBgJ,IAC1BvF,QAAQ,sDAAuD,MAC/DA,QAAQ,YAAa,OAASzE,GAKjCiN,GAAWD,KAOXE,GAAW,EAEXC,GAAc,SAAUC,EAAIC,GAC9B,GAAKjB,GAAL,CAEA,IAAIkB,EAAShI,EAAO2E,GAAa,CAC/BI,KAAM,SACNkD,YAAaF,EAAOD,EAAKjE,GAAQoD,UAenC,GAXIrG,GAAsB,OACxBoH,EAAOE,SAAWrG,KAAKsG,OAAOnH,KAAQsE,GAAQsC,IAngBnC,MAqgBbA,GAAW,EACXtC,GAAQtE,KAGJJ,GAAsB,UACxBoH,EAAOzC,SAAW1D,KAAKuG,IAAI,EAAG7C,GAAU8C,OAGtCN,IAASzM,EAAIgN,WAEf5E,GAASsE,EAAQtN,EAAcE,QAE/B,IACEU,EAAIgN,WAAWC,KAAKjN,EAApBA,CAAyBoB,EAAa,UAAWJ,EAAU0L,IAC3D,MAAOQ,GAEP9E,GAASsE,EAAQtN,EAAcE,MAMrC4B,EACE,mBACA,WACMZ,EAAI6M,QACA,KAAOrL,KAAY/C,GAASwN,KAClCJ,GAAczG,MACT4G,IAAY5G,KAAQyG,IAE7B5M,GAGF2B,EAAqBY,EAAUyK,GAAahN,GAE5C,IAAI6N,GAAO9M,EAAI8M,MAAQ,GACnBL,GAAW,WACb,IACE,IAAIM,EAAuBhM,EAAgBQ,IAAiB,EACxDyL,EAAS/G,KAAKuG,IAChBM,GAAKzL,IAAiB,EACtByL,GAAKxL,IAAiB,EACtBP,EAAgBQ,IAAiB,EACjCR,EAAgBM,IAAiB,EACjCN,EAAgBO,IAAiB,GAEnC,OAAO2E,KAAKgH,IACV,IAKI,EAJJhH,KAAKsG,MACF,MAAQxL,EAAgBmM,WAAa,GAAKH,GACzCC,EACA,IAGN,MAAOnK,IAEP,OADAhE,EAAKgE,IACE,IAIXjC,EAAqB,OAAQ,WAC3B+I,GAAW8C,KACX7L,EACEM,EACA,WACMyI,GAAW8C,OAAY9C,GAAW8C,OAExCxN,KAQJ,IAgCIkO,GAoCAC,GAAUC,GApEVC,GAAU,SAAUC,GACtB,IAAInE,EAAO,GAIX,IACEA,EAAOmE,GAAa/M,EAAuBZ,EAAIyJ,UAC/C,MAAOxG,IACPhE,EAAKgE,IAGP,IAAI2K,EAAyB/O,EAAO2L,IACpC,GAAIjE,GAAWqH,GACb,IACEpE,EAAOoE,EAAuBnL,KAAK5D,EAAQ,CAAE2K,KAAMA,KAAWA,EAC9D,MAAOvG,IACPF,EAAe,OAAQE,IAK3B,IA5YiB,SAAUuG,GAC3B,IAAK,IAAIhC,KAAK8C,GAAa,CACzB,IAAIuD,EAAgBvD,GAAY9C,GAChC,GAAKqG,EAAL,CAGA,IAAIC,EA9OI,KA+OND,EAAc,GAAcA,EA/OtB,IA+O8CA,EAEtD,GACEC,IAAetE,GACf,IAAIjE,OACF,IAAM9B,EAAYqK,GAAYnK,QAAQ,SAAU,QAAU,IAC1D,KACAzB,KAAKsH,GAEP,OAAOpK,GAEX,OAAOC,EA0XH0O,CAAavE,GAQjB,MAFY,QAARQ,IAAkBhK,EAAIgO,OAAMxE,GAAQxJ,EAAIgO,KAAK5J,MAAM,KAAK,IAErDoF,EAPLvK,EAAKuB,EAAiB,YAAcgJ,IAgDpCyE,GAAW,SACbC,EACAC,EACAvH,EACAwH,IAEKA,GAAe7H,GAAWK,KAAWwH,EAAcxH,GACxD,IAIMyH,EAJFlG,EAAW5B,GAAW6H,GAAeA,EAAc,aACnDE,EAAc,GACd/K,EAAS4K,KAAgD,EAA9BA,EAAc1G,QAAQ,OAGnD0G,GADIE,EAAQF,EAAc/J,MAAM,MACVmK,QACtBD,EAAc,IAAMD,EAAMvG,KAAK,MAGjC,IAAI0B,EAAOkE,GAAQS,GAGfK,EAAUhF,EAAO8E,EACrB,GAAK9E,GAAQwC,IAAgBwC,EAA7B,CAEAxC,GAAewC,EACflG,GAAKkB,KAAOA,EAGRpE,GAAsB,OACxBkD,GAAKmG,eACHpI,KAAKuG,IAAIzL,EAA2B,aAAK,EAAGtC,EAAO6P,YAAc,IACjE,KACFpG,GAAKqG,gBACHtI,KAAKuG,IACHzL,EAAgBQ,IAAiB,EACjC9C,EAAO+P,aAAe,IACnB,MAILxJ,GAAsB,MACpBtF,EAAIsB,KAAWkH,GAAKlH,GAAYtB,EAAIsB,IAItCe,GAAUiD,GAAsB,QAClCkD,GAAKuG,aAAe1M,EAAO2M,MAC3BxG,GAAKyG,cAAgB5M,EAAOiL,QAI9B,IAII4B,EAJAC,EAAOpQ,EAAOqQ,YACdC,EAAiB,aAIrB,IACEH,EAAsBC,EAAKG,iBAAiBD,GAAgB,GAAG5F,KAC/D,MAAOtG,IACPhE,EAAKgE,IAGPwK,GAAgBuB,GAC+C,EAA3D,CAAC,SAAU,gBAAgBvH,QAAQuH,GAGnCC,GACAA,EAAKE,KACwC,EAA7C,CAAC,EAAG,GAAG1H,QAAQwH,EAAKE,GAAgB5F,MAGxC,IAAI8F,EAA0BlD,GAC1BA,GAAS/H,MA3uBH,KA2uBgB,GACtBlF,EACJsO,GAAWrB,IACgD,EAAvD5B,GAAmB9C,QAAQ4H,IAC3BA,GAA2BnP,EAC3Bb,EAGJiJ,GAAKgH,OACH,QAAQpN,KAAKgK,OAAkBgC,GAAeT,GAC1CpO,GACCmO,GAEP5G,EAAWD,GAAeC,EAAU,CAClC2C,KAAM/J,EACNgK,KAAMlB,GAAKkB,OAGb,IAAI+F,EAAsB,WACxB9O,EAA2BrB,EAC3B,IAAIoQ,EACFtB,GAAeT,KAAkBrI,GAAsB,MA9H1C,SACjB8I,EACAuB,EACAjC,EACAlG,EACAV,EACAuB,GAEI+F,GAAa7B,GAAY,GAAKhE,GAAQoD,QAASrM,GAC/CkM,KAAoBjD,GAAQoD,QAAU/F,MAE1C,IAAIgK,EAAcxG,GAAkBwE,KAChCiC,EAAQzI,GAAeuI,EAAkBnI,GAE7CY,GACE,CACEoE,GAAIjE,GAAQoD,QACZlC,KAAM/J,EACN2M,UAAWsD,GAAoBjC,EAAWrB,GAAW,KACrDwD,MAAOA,EACPzK,EAAGA,GAEH0B,SAAU9F,EAAU8F,IAEtBuB,GAGFoF,GAAmBpB,GACnBA,GAAWuD,EAEX1N,IAiGE4N,CACE1B,EACAsB,EACAhC,GACAc,EACA1H,EACAuB,IAIJ,GAAK1H,EAmBH8O,SAjBA,IACMhO,GAAUgF,GAAWhF,EAAOsO,sBAC9BtO,EACGsO,qBAAqB,CAAChO,EAAcC,IACpCgO,KAAK,SAAUC,GACd1H,GAAQ2H,QAAUD,EAAkBlO,GACpCwG,GAAQ4H,WAAaF,EAAkBjO,GACvCyN,MAEDW,SAAMX,GAETA,IAEF,MAAOvC,GACPuC,OAWFY,GAAMtR,EAAOuR,QACbC,GAAeF,GAAMA,GAAIG,UAAYpR,EACrCqR,GAAM1R,EAAO2R,cACbC,GAAgB,YAIhBtG,IAAekG,IAAgBK,OAASH,KAqB1CJ,GAAIG,WAnBEK,GAAOR,GADiB5G,GAoBAkH,IAlBrB,WACL,IAEI/G,EAFAhF,EAAMhC,UACNkO,EAAKD,GAAK7N,MAAM+N,KAAMnM,GAY1B,OAVI6B,GAAWmK,OACbhH,EAAQ,IAAIgH,MAAMnH,KAIlBG,EAAQtJ,EAAI0Q,YAAY,UAClBC,UAAUxH,GAAMnK,EAASA,GAEjCsK,EAAMhH,UAAYgC,EAClB6L,GAAI7G,GACGkH,IAMX5P,EACEyP,GACA,WACExC,GAAS,IAEX5O,GAGF2B,EACE,WACA,WACEiN,GAAS,IAEX5O,IAKA8K,IAAuB,QAARH,IAAkB,iBAAkBnL,GACrDmC,EACE,aACA,WACEiN,GAAS,IAEX5O,GAIA8K,IAAa8D,KAEjBpP,EAAOmS,YAAc,SAAUxH,EAAM5C,EAAUuB,GAC7C8F,GAAS,EAAGzE,EAAM5C,EAAUuB,IAQ9B,IAAI8I,GAAa,CAAC,SAAU,UAExBC,GAAY,SAAUxH,EAAO9C,EAAUwH,IACpCA,GAAe7H,GAAWK,KAAWwH,EAAcxH,GAExD,IAAIuK,EAAkB5K,GAAWmD,GAC7BvB,EAAW5B,GAAW6H,GAAeA,EAAc,aACnDgD,SAAmB1H,EAEvB,GAAIuH,GAAWxJ,QAAQ2J,GAAa,IAAMD,EAExC,OADApO,EAAeqH,GAAmB3K,EAAY,aAAe2R,GACtDjJ,IAGT,IACE,GAAIgJ,EAAiB,CACnB,IAAIE,EAAc3H,IAClB,GAAIuH,GAAWxJ,eAAe4J,GAAe,EAK3C,OAJAtO,EACEqH,GACAV,EAAQ,uBAAyB2H,GAE5BlJ,IAETuB,EAAQ2H,GAEV,MAAOpO,IAEP,OADAF,EAAeqH,GAAmBnH,IAC3BkF,IAGTuB,GAAS,GAAKA,GAAO/F,QAAQ,eAAgB,KAAKA,QAAQ,WAAY,IAEtE,IAAI2N,EAAc,CAAE/H,KAAM9J,EAAWiK,MAAOA,GACxC6H,GAAa9D,IAAiBzL,EAAQ,EAE1C4E,EAAWD,GAAeC,EAAU0K,GAEhC5H,GACFxB,GACE1D,EAAO8M,EAAa,CAClBhF,GAAI5G,KACJiK,MAAOzI,IAAgBqK,GACvBpF,UACGoF,GAAa/D,KAAapI,GAAsB,KAC7CmI,GACA,KAEN3G,SAAU9F,EAAU8F,KAEtBuB,IAKFqJ,GAAmB,SAAU9H,EAAO9C,EAAUuB,GAChD+I,GAAUxH,EAAO9C,EAAUuB,IAIxBtJ,EAAOuL,MACVvL,EAAOuL,IAAqBoH,IAE9B,IAAIC,GAAY5S,EAAOuL,IAGnBsH,GAAQD,IAAaA,GAAUpK,EAAIoK,GAAUpK,EAAI,GAMrD,IAAK,IAAIqC,MAHT7K,EAAOuL,IAAqBoH,GAGVE,GACZxO,EAAQwO,GAAOhI,MACjBzF,MAAMC,QAAQwN,GAAMhI,KAChBwH,GAAUpO,MAAM,KAAM4O,GAAMhI,KAC5BwH,GAAUQ,GAAMhI,MAGxB,MAAOsD,IACPhO,EAAUgO,IA7IY,IAAUzD,GACxBoH,GAtnBkBzG,GAnN9B,CAw9BErL,OACA,uBACA"} \ No newline at end of file +{"version":3,"file":"app.source.js","sources":["app.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData, keepalive) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n var imageUrl =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n\n // Inline events must survive navigation without taking over links or forms.\n if (keepalive && window.fetch) {\n try {\n window\n .fetch(imageUrl, {\n keepalive: trueVar,\n mode: \"no-cors\",\n credentials: \"omit\",\n })\n .catch(function () {\n image.src = imageUrl;\n });\n return;\n } catch (error) {}\n }\n image.src = imageUrl;\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = trueVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch = \"\";\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n var pathKey = path + querySearch;\n if (!path || lastSendPath == pathKey) return;\n\n lastSendPath = pathKey;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n var manualPageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n window[namespace + \"_\" + pageviewText] = manualPageview;\n var defaultPageview = defaultNamespace + \"_\" + pageviewText;\n if (!window[defaultPageview]) window[defaultPageview] = manualPageview;\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw, keepalive) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback,\n undefinedVar,\n keepalive\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n\n var inlineEvent = function (event) {\n var element = event.target;\n while (\n element &&\n element !== doc &&\n (!element.getAttribute || attr(element, \"simple-event\") === null)\n )\n element = element.parentNode;\n\n if (!element || element === doc) return;\n var isForm = element.tagName === \"FORM\";\n var name = attr(element, \"simple-event\");\n if (!name || isForm !== (event.type === \"submit\")) return;\n\n var metadata = { tag: element.tagName.toLowerCase() };\n var attributes = element.attributes;\n for (var i = 0; i < attributes.length; i++) {\n var attribute = attributes[i];\n if (attribute.name.indexOf(\"data-simple-event-\") === 0)\n metadata[attribute.name.slice(18).replace(/-/g, \"_\")] =\n attribute.value;\n }\n if (isForm) {\n var button = event.submitter;\n metadata.button_text = button\n ? (button.textContent || button.value || \"\")\n .replace(/\\s+/g, \" \")\n .trim()\n .slice(0, 200)\n : \"\";\n }\n sendEvent(name, metadata, undefinedVar, trueVar);\n };\n\n doc.addEventListener(\"click\", inlineEvent, falseVar);\n doc.addEventListener(\"submit\", inlineEvent, falseVar);\n\n // 404 confirmation adds a request, so existing installs must opt in.\n if (\n overwriteOptions.detect404 === trueVar ||\n attr(scriptElement, \"detect-404\") == trueText\n ) {\n var detect404 = function () {\n if (\n !/\\b404\\b/.test(doc.title + \" \" + (doc.body && doc.body.textContent))\n )\n return;\n try {\n var request = new window.XMLHttpRequest();\n request.open(\"HEAD\", loc.href, trueVar);\n request.onload = function () {\n if (request.status === 404)\n sendEvent(\"page_404\", {\n url: loc.protocol + \"//\" + definedHostname + loc.pathname,\n status: 404,\n });\n };\n request.send();\n } catch (error) {}\n };\n if (doc.readyState === \"loading\")\n doc.addEventListener(\"DOMContentLoaded\", detect404, falseVar);\n else detect404();\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_app_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","keepalive","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","imageUrl","key","fetch","mode","credentials","catch","src","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","protocol","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","parts","querySearch","shift","pathKey","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","manualPageview","defaultPageview","defaultNamespace","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue","detect404","inlineEvent","element","target","parentNode","isForm","tagName","button","tag","toLowerCase","attributes","submitter","button_text","textContent","trim","title","request","XMLHttpRequest","open","href","status","url","send","readyState"],"mappings":"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"} \ No newline at end of file diff --git a/dist/v12/custom/light.js b/dist/v12/custom/light.js index 0607cbcb..69c46230 100644 --- a/dist/v12/custom/light.js +++ b/dist/v12/custom/light.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-15; 780b; SRI-version; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-15; b6bc; SRI-version; v12) */ -!function(f,e,t,m){try{var u=undefined,n="https:",r=f.console,i="doNotTrack",g=f.navigator,p=f.location,h=p.host,a=f.document,o=g.userAgent,c="Not sending request ",v=!1,s=encodeURIComponent,d=decodeURIComponent,l=JSON.stringify,y=f.addEventListener,_="https://"+t,b=(a.documentElement,"language"),w=g.userAgentData,O="platform",S="platformVersion",j="https://docs.simpleanalytics.com",k=/(bot|spider|crawl)/i.test(o)&&!/(cubot)/i.test(o),x=a.currentScript||a.querySelector('script[src*="'+t+'"]');m=function(){var e=[].slice.call(arguments);return e.unshift("Simple Analytics:"),Function.prototype.apply.call(r.warn,r,e)};var E=function(e){return"string"==typeof e},A=function(e,t){return e&&e.getAttribute("data-"+t)},$=function(){for(var e,t,n,r={},i=arguments,a=0;a>e/4).toString(16)})}catch(r){return e.replace(n,function(e){var t=16*Math.random()|0;return(e<2?t:3&t|8).toString(16)})}},N=function(e){return"function"==typeof e},R="namespace",U=e[R]||A(x,R)||"sa",V=e.strictUtm||"true"==A(x,"strict-utm"),B=U+"_loaded";if(1==f[B])return m(c+"twice");f.sa_event_loaded=!0,f[B]=!0;var C,H=function(t,e,n){t=n?t:$(J,M,t),g.brave&&!n&&(t.brave=!0),g._duckduckgoloader_&&!n&&(t.duck=!0),(new Image).src=_+"/simple.gif?"+Object.keys(t).filter(function(e){return t[e]!=u}).map(function(e){return s(e)+"="+s(t[e])}).join("&")+"&time="+Date.now()},T=e.hostname||A(x,"hostname"),F=T||h,z={version:"custom_light_12",hostname:F};e.mode||A(x,"mode");try{C=Intl.DateTimeFormat().resolvedOptions().timeZone}catch(X){m(X)}k&&(z.bot=!0);var J=$(z,{ua:o,https:p.protocol==n,timezone:C,page_id:I(),session_id:I()});if(J.sri=!0,w&&(J.mobile=w.mobile,J.brands=l(w.brands)),F!==h&&(J.hostname_original=h),i in g&&"1"==g[i])return m("Not sending request when "+i+" is enabled. See "+j+"/dnt");-1!=h.indexOf(".")&&!/^[0-9.:]+$/.test(h)||T||m("Set hostname on "+h+". See "+j+"/overwrite-domain-name");var L,M={},P=(e.referrer||A(x,"referrer")||a.referrer||"").replace(h,F).replace(/^https?:\/\/((m|l|w{2,3}([0-9]+)?)\.)?([^?#]+)(.*)$/,"$4").replace(/^([^/]+)$/,"$1")||u,Z=function(e,t){var n=$(z,{type:"append",original_id:t?e:J.page_id});if(t||!g.sendBeacon)H(n,0,!0);else try{g.sendBeacon.bind(g)(_+"/append",l(n))}catch(r){H(n,0,!0)}};y("pagehide",Z,!1);var G,K,Q=function(e){var t="";try{t=e||d(p.pathname)}catch(X){m(X)}return t},W=function(e,t,n,r,i,a){e&&Z(""+J.page_id,!0),J.page_id=I();var o,c=F+Q(),s=(o=t,(r||p.search).slice(1).split("&").filter(function(e){return!o&&new RegExp("^((utm_)"+(V?"":"?")+"(source|medium|content|term|campaign)"+(V?"":"|ref")+")=","i").test(e)}).join("&")||u);H({id:J.page_id,type:"pageview",referrer:!t||n?P:null,query:s}),P=c,0};!function(e,t,n,r){!r&&N(n)&&(r=n);N(r);var i,a="";E(t)&&-1"); +!function(f,e,t,m){try{var u=undefined,n="https:",r=f.console,a="doNotTrack",g=f.navigator,p=f.location,h=p.host,i=f.document,o=g.userAgent,c="Not sending request ",v=!1,s=encodeURIComponent,d=decodeURIComponent,l=JSON.stringify,y=f.addEventListener,_="https://"+t,b=(i.documentElement,"language"),w=g.userAgentData,O="platform",S="platformVersion",j="https://docs.simpleanalytics.com",k=/(bot|spider|crawl)/i.test(o)&&!/(cubot)/i.test(o),x=i.currentScript||i.querySelector('script[src*="'+t+'"]');m=function(){var e=[].slice.call(arguments);return e.unshift("Simple Analytics:"),Function.prototype.apply.call(r.warn,r,e)};var E=function(e){return"string"==typeof e},A=function(e,t){return e&&e.getAttribute("data-"+t)},$=function(){for(var e,t,n,r={},a=arguments,i=0;i>e/4).toString(16)})}catch(r){return e.replace(n,function(e){var t=16*Math.random()|0;return(e<2?t:3&t|8).toString(16)})}},N=function(e){return"function"==typeof e},R="namespace",U=e[R]||A(x,R)||"sa",V=e.strictUtm||"true"==A(x,"strict-utm"),B=U+"_loaded";if(1==f[B])return m(c+"twice");f.sa_event_loaded=!0,f[B]=!0;var C,H=function(t,e,n,r){t=n?t:$(J,M,t),g.brave&&!n&&(t.brave=!0),g._duckduckgoloader_&&!n&&(t.duck=!0);var a=new Image,i=_+"/simple.gif?"+Object.keys(t).filter(function(e){return t[e]!=u}).map(function(e){return s(e)+"="+s(t[e])}).join("&")+"&time="+Date.now();a.src=i},T=e.hostname||A(x,"hostname"),F=T||h,z={version:"custom_light_12",hostname:F};e.mode||A(x,"mode");try{C=Intl.DateTimeFormat().resolvedOptions().timeZone}catch(X){m(X)}k&&(z.bot=!0);var J=$(z,{ua:o,https:p.protocol==n,timezone:C,page_id:I(),session_id:I()});if(J.sri=!0,w&&(J.mobile=w.mobile,J.brands=l(w.brands)),F!==h&&(J.hostname_original=h),a in g&&"1"==g[a])return m("Not sending request when "+a+" is enabled. See "+j+"/dnt");-1!=h.indexOf(".")&&!/^[0-9.:]+$/.test(h)||T||m("Set hostname on "+h+". See "+j+"/overwrite-domain-name");var L,M={},P=(e.referrer||A(x,"referrer")||i.referrer||"").replace(h,F).replace(/^https?:\/\/((m|l|w{2,3}([0-9]+)?)\.)?([^?#]+)(.*)$/,"$4").replace(/^([^/]+)$/,"$1")||u,Z=function(e,t){var n=$(z,{type:"append",original_id:t?e:J.page_id});if(t||!g.sendBeacon)H(n,0,!0);else try{g.sendBeacon.bind(g)(_+"/append",l(n))}catch(r){H(n,0,!0)}};y("pagehide",Z,!1);var G,K,Q=function(e){var t="";try{t=e||d(p.pathname)}catch(X){m(X)}return t},W=function(e,t,n,r,a,i){e&&Z(""+J.page_id,!0),J.page_id=I();var o,c=F+Q(),s=(o=t,(r||p.search).slice(1).split("&").filter(function(e){return!o&&new RegExp("^((utm_)"+(V?"":"?")+"(source|medium|content|term|campaign)"+(V?"":"|ref")+")=","i").test(e)}).join("&")||u);H({id:J.page_id,type:"pageview",referrer:!t||n?P:null,query:s}),P=c,0};!function(e,t,n,r){!r&&N(n)&&(r=n);N(r);var a,i="";E(t)&&-1"); //# sourceMappingURL=light.js.map \ No newline at end of file diff --git a/dist/v12/custom/light.js.map b/dist/v12/custom/light.js.map index 9373b43f..b728f58c 100644 --- a/dist/v12/custom/light.js.map +++ b/dist/v12/custom/light.js.map @@ -1 +1 @@ -{"version":3,"file":"light.source.js","sources":["light.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n\n var collectMetricByString = function (metricAbbreviation) {\n // eslint-disable-next-line no-unreachable\n return true;\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n if (ignore) return falseVar;\n // eslint-disable-next-line no-redeclare\n var regex =\n \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \")=\";\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n return q || undefinedVar;\n };\n\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n\n\n\n\n\n\n\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n // eslint-disable-next-line no-redeclare\n var bot = isBotAgent;\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = trueVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n\n\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch = \"\";\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n var pathKey = path + querySearch;\n if (!path || lastSendPath == pathKey) return;\n\n lastSendPath = pathKey;\n page.path = path;\n\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n sameSite = referrer\n ? referrer.split(slash)[0] == locationHostname\n : falseVar;\n\n\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n\n\n pageview();\n\n } catch (e) {\n warn(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_light_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","warn","undefinedVar","undefined","https","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","language","documentElement","uaData","userAgentData","platformText","platformVersionText","docsUrl","isBotAgent","test","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","isString","string","attr","attribute","getAttribute","assign","obj","prop","object","to","arg","index","length","nextSource","constructor","Object","nextKey","hasOwnProperty","settings","sa_settings","logSettings","keys","Date","now","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","replace","c","getRandomValues","Uint8Array","toString","error","r","Math","random","isFunction","func","namespaceText","namespace","strictUtm","loadedVariable","sa_event_loaded","timezone","sendData","data","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","Image","src","filter","key","map","join","overwrittenHostname","hostname","definedHostname","basePayload","version","mode","Intl","DateTimeFormat","resolvedOptions","timeZone","bot","ua","protocol","page_id","session_id","sri","mobile","brands","hostname_original","indexOf","lastSendPath","referrer","sendOnLeave","id","push","append","type","original_id","sendBeacon","bind","e","sameSite","userNavigated","getPath","overwrite","path","pathname","sendPageView","isPushState","deleteSourceInfo","search","metadata","ignoreSource","currentPage","query","split","keyValue","RegExp","pages","pathOverwrite","callbackRaw","parts","querySearch","shift","pathKey","performaceEntryType","perf","performance","navigationText","getEntriesByType","triggerSendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","pageview"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"light.source.js","sources":["light.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n\n var collectMetricByString = function (metricAbbreviation) {\n // eslint-disable-next-line no-unreachable\n return true;\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n if (ignore) return falseVar;\n // eslint-disable-next-line no-redeclare\n var regex =\n \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \")=\";\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n return q || undefinedVar;\n };\n\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData, keepalive) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n var imageUrl =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n\n image.src = imageUrl;\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n\n\n\n\n\n\n\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n // eslint-disable-next-line no-redeclare\n var bot = isBotAgent;\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = trueVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n\n\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch = \"\";\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n var pathKey = path + querySearch;\n if (!path || lastSendPath == pathKey) return;\n\n lastSendPath = pathKey;\n page.path = path;\n\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n sameSite = referrer\n ? referrer.split(slash)[0] == locationHostname\n : falseVar;\n\n\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n\n\n pageview();\n\n } catch (e) {\n warn(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_light_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","warn","undefinedVar","undefined","https","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","language","documentElement","uaData","userAgentData","platformText","platformVersionText","docsUrl","isBotAgent","test","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","isString","string","attr","attribute","getAttribute","assign","obj","prop","object","to","arg","index","length","nextSource","constructor","Object","nextKey","hasOwnProperty","settings","sa_settings","logSettings","keys","Date","now","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","replace","c","getRandomValues","Uint8Array","toString","error","r","Math","random","isFunction","func","namespaceText","namespace","strictUtm","loadedVariable","sa_event_loaded","timezone","sendData","data","callback","onlyThisData","keepalive","payload","page","brave","_duckduckgoloader_","duck","image","Image","imageUrl","filter","key","map","join","src","overwrittenHostname","hostname","definedHostname","basePayload","version","mode","Intl","DateTimeFormat","resolvedOptions","timeZone","bot","ua","protocol","page_id","session_id","sri","mobile","brands","hostname_original","indexOf","lastSendPath","referrer","sendOnLeave","id","push","append","type","original_id","sendBeacon","bind","e","sameSite","userNavigated","getPath","overwrite","path","pathname","sendPageView","isPushState","deleteSourceInfo","search","metadata","ignoreSource","currentPage","query","split","keyValue","RegExp","pages","pathOverwrite","callbackRaw","parts","querySearch","shift","pathKey","performaceEntryType","perf","performance","navigationText","getEntriesByType","triggerSendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","pageview"],"mappings":";;CAEA,SACEA,EACAC,EACAC,EAKAC,GAEA,IAQE,IAAIC,EAAeC,UAIfC,EAAQ,SAKRC,EAAMP,EAAOQ,QACbC,EAAa,aACbC,EAAMV,EAAOW,UACbC,EAAMZ,EAAOa,SACbC,EAAmBF,EAAIG,KACvBC,EAAMhB,EAAOiB,SACbC,EAAYR,EAAIQ,UAChBC,EAAa,uBAEbC,GAhBW,EAiBXC,EAAyBC,mBACzBC,EAAyBC,mBACzBC,EAAYC,KAAKD,UAEjBE,EAAuB3B,EAAO4B,iBAC9BC,EAhBWvB,WAgB4BJ,EAEvC4B,GADkBd,EAAIe,gBACX,YAIXC,EAAStB,EAAIuB,cAMbC,EAAe,WACfC,EAAsB,kBACtBC,EAAU,mCAEVC,EACF,sBAAsBC,KAAKpB,KAAe,WAAWoB,KAAKpB,GAIxDqB,EACFvB,EAAIwB,eAAiBxB,EAAIyB,cAAc,gBAAkBvC,EAAU,MAOrEC,EAAO,WAEL,IAAIuC,EAAO,GAAGC,MAAMC,KAAKC,WAOzB,OAJAH,EAAKI,QAAQ,qBAINC,SAASC,UAAUC,MAAML,KAAKrC,EAAIJ,KAAMI,EAAKmC,IAGtD,IAQIQ,EAAW,SAAUC,GACvB,MAAwB,iBAAVA,GAOZC,EAAO,SAAUb,EAAec,GAClC,OAAOd,GAAiBA,EAAce,aAAa,QAAUD,IAe3DE,EAAS,WAGX,IAFA,IA7BsBC,EAAKC,EAwBJC,EAKnBC,EAAK,GACLC,EAAMf,UACDgB,EAAQ,EAAGA,EAAQD,EAAIE,OAAQD,IAAS,CAC/C,IAAIE,EAAaH,EAAIC,GACrB,IATqBH,EASRK,IAREL,EAAOM,cAAgBC,OASpC,IAAK,IAAIC,KAAWH,EAlCFP,EAmCJO,EAnCSN,EAmCGS,EAlCvBD,OAAOjB,UAAUmB,eAAevB,KAAKY,EAAKC,KAmCzCE,EAAGO,GAAWH,EAAWG,IAKjC,OAAOP,GAGLS,EAAWpE,EAAOqE,YAClBC,EAAcF,GAAYH,OAAOM,KAAKtE,GAAkB6D,OAG5D7D,EAAmBsD,EAAOtD,EAAkBmE,GAExCE,GAAanE,EAAK,WAAYF,GAQxBuE,KAAKC,IALf,IAOIC,EAAO,WACT,IAAIC,EAAe3E,EAAO4E,QAAU5E,EAAO6E,SACvCC,EAAY,CAAC,MAAQ,KAAO,KAAO,KAAO,KAC1CC,EAAY,SAEhB,IACE,OAAOD,EAAUE,QAAQD,EAAW,SAAUE,GAC5C,OACEA,EACCN,EAAaO,gBAAgB,IAAIC,WAAW,IAAI,GAC9C,IAAOF,EAAI,GACdG,SAAS,MAEb,MAAOC,GACP,OAAOP,EAAUE,QAAQD,EAAW,SAAUE,GAC5C,IAAIK,EAAqB,GAAhBC,KAAKC,SAAiB,EAE/B,OADMP,EAAI,EAAIK,EAAS,EAAJA,EAAW,GACrBF,SAAS,QAKpBK,EAAa,SAAUC,GACzB,MAAsB,mBAARA,GAIZC,EAAgB,YAChBC,EACF3F,EAAiB0F,IACjBvC,EAAKb,EAAeoD,IAkaxB,KAxZME,EACF5F,EAAiB4F,WAvKJ,QAwKbzC,EAAKb,EAAe,cAoClBuD,EAAiBF,EAAY,UACjC,GA/Mc,GA+MV5F,EAAO8F,GAA4B,OAAO3F,EAAKgB,EAAa,SAChEnB,EAAO+F,iBAhNO,EAiNd/F,EAAO8F,IAjNO,EAwNd,IA8DIE,EA9DAC,EAAW,SAAUC,EAAMC,EAAUC,EAAcC,GACrDH,EAAOE,EAAeF,EAAO3C,EAAO+C,EAASC,EAAML,GAE/CxF,EAAI8F,QAAUJ,IAAcF,EAAKM,OA3NzB,GA4NR9F,EAAI+F,qBAAuBL,IAAcF,EAAKQ,MA5NtC,GA+NZ,IAAIC,EAAQ,IAAIC,MACZC,EACFhF,EACA,eACAoC,OAAOM,KAAK2B,GACTY,OAAO,SAAUC,GAChB,OAAOb,EAAKa,IAAQ3G,IAErB4G,IAAI,SAAUD,GACb,OACE1F,EAAuB0F,GACvB,IACA1F,EAAuB6E,EAAKa,MAG/BE,KAAK,KACR,SACAzC,KAAKC,MAEPkC,EAAMO,IAAML,GAIVM,EACFlH,EAAiBmH,UAAYhE,EAAKb,EAAe,YAC/C8E,EAAkBF,GAAuBrG,EAEzCwG,EAAc,CAChBC,QAoUJ,kBAnUIH,SAAUC,GAeDpH,EAAiBuH,MAAQpE,EAAKb,EAAe,QAYxD,IAEEyD,EACIyB,KAAKC,iBAAiBC,kBAAkBC,SAE5C,MAAOvC,GACPlF,EAAKkF,GAQGhD,IAMDiF,EAAYO,KA3SP,GA6Sd,IAAIvB,EAAU/C,EAAO+D,EAAa,CAEhCQ,GAAkC5G,EAElCZ,MAAOM,EAAImH,UAAYzH,EACvB0F,SAAUA,EACVgC,QAA8BtD,IAG9BuD,WAA0CvD,MAwB5C,GArBA4B,EAAQ4B,KAzTM,EA6TVlG,IACFsE,EAAQ6B,OAASnG,EAAOmG,OACxB7B,EAAQ8B,OAAS3G,EAAUO,EAAOoG,SAWhCf,IAAoBvG,IACtBwF,EAAQ+B,kBAAoBvH,GAG1BL,KAAcC,GAA0B,KAAnBA,EAAID,GAC3B,OAAON,EA/TYgB,4BAgUAV,EAAa,oBAAsB2B,EAAU,SAK7B,GAAlCtB,EAAiBwH,QAAQ,OACxB,aAAahG,KAAKxB,IACnBqG,GAEDhH,EACE,mBACEW,EACA,SACAsB,EACA,0BAON,IACImG,EADAhC,EAAO,GAiBPiC,GAXAvI,EAAiBuI,UAAYpF,EAAKb,EAAe,aAGzBvB,EAAIwH,UAAY,IACrCxD,QAAQlE,EAAkBuG,GAC1BrC,QAAQ,sDAAuD,MAC/DA,QAAQ,YAAa,OAAS5E,EAcjCqI,EAAc,SAAUC,EAAIC,GAG9B,IAAIC,EAASrF,EAAO+D,EAAa,CAC/BuB,KAAM,SACNC,YAAaH,EAAOD,EAAKpC,EAAQ0B,UAKnC,GAAIW,IAASjI,EAAIqI,WAEf9C,EAAS2C,EAAQxI,GA3YP,QA6YV,IACEM,EAAIqI,WAAWC,KAAKtI,EAApBA,CAAyBmB,EAAa,UAAWJ,EAAUmH,IAC3D,MAAOK,GAEPhD,EAAS2C,EAAQxI,GAjZT,KAuZduB,EArXe,WAqXgB8G,GAtZhB,GA6Zf,IAmDIS,EAAUC,EAnDVC,EAAU,SAAUC,GACtB,IAAIC,EAAO,GAIX,IACEA,EAAOD,GAAa9H,EAAuBX,EAAI2I,UAC/C,MAAOlE,GACPlF,EAAKkF,GAMP,OAAOiE,GAMLE,EAAe,SACjBC,EACAC,EACAR,EACAS,EACAC,EACAzD,GAEIsD,GAAahB,EAAY,GAAKnC,EAAQ0B,SA1b9B,GA2bY1B,EAAQ0B,QAAUtD,IAE1C,IAhR6BmF,EAgRzBC,EAAczC,EAAkB+B,IAChCW,GAjRyBF,EAiRFH,GAAkBC,GAhRjB/I,EAAI+I,QAC7BhH,MAAM,GACNqH,MAAM,KACNlD,OAAO,SAAUmD,GAIhB,OAFaJ,GAaN,IAAIK,OART,YACCrE,EAAY,GAAK,KAClB,yCACCA,EAAY,GAAK,QAClB,KAIuB,KAAKvD,KAAK2H,KAEpChD,KAAK,MAEI7G,GA4PZ6F,EACE,CACEyC,GAAIpC,EAAQ0B,QACZa,KA/ba,WAgcbL,UAAWkB,GAAoBR,EAAWV,EAAW,KACrDuB,MAAOA,IAOXvB,EAAWsB,EAEXK,IAKa,SACbV,EACAW,EACAR,EACAS,IAEKA,GAAe5E,EAAWmE,KAAWS,EAAcT,GACzCnE,EAAW4E,GAA1B,IAIMC,EAHFC,EAAc,GACdrH,EAASkH,KAAgD,EAA9BA,EAAc9B,QAAQ,OAGnD8B,GADIE,EAAQF,EAAcJ,MAAM,MACVQ,QACtBD,EAAc,IAAMD,EAAMrD,KAAK,MAGjC,IAAIqC,EAAOF,EAAQgB,GAGfK,EAAUnB,EAAOiB,EACrB,GAAKjB,GAAQf,GAAgBkC,EAA7B,CAEAlC,EAAekC,EACflE,EAAK+C,KAAOA,EAKN5I,EAAIoB,KAAWyE,EAAKzE,GAAYpB,EAAIoB,IAK1C,IAII4I,EAJAC,EAAO3K,EAAO4K,YACdC,EAAiB,aAIrB,IACEH,EAAsBC,EAAKG,iBAAiBD,GAAgB,GAAGhC,KAC/D,MAAOxD,GACPlF,EAAKkF,GAGP8D,EAAgBuB,GAC+C,EAA3D,CAAC,SAAU,gBAAgBpC,QAAQoC,GAGnCC,GACAA,EAAKE,KACwC,EAA7C,CAAC,EAAG,GAAGvC,QAAQqC,EAAKE,GAAgBhC,MAGxCK,IAAWV,GACPA,EAASwB,MAngBH,KAmgBgB,IAAMlJ,EAKhC,IAAIiK,EAAsB,WACxB3J,GA/gBU,EAkhBVoI,EACEC,EAFAA,GAAeN,IAAiB,EAIhCD,EACAqB,IAMJ,GAAKnJ,EAmBH2J,SAjBA,IACM/I,GAAUyD,EAAWzD,EAAOgJ,sBAC9BhJ,EACGgJ,qBAAqB,CAAC9I,EAAcC,IACpC8I,KAAK,SAAUC,GACd5E,EAAQ6E,QAAUD,EAAkBhJ,GACpCoE,EAAQ8E,WAAaF,EAAkB/I,GACvC4I,MAEDM,SAAMN,GAETA,IAEF,MAAO9B,GACP8B,MASNO,GAEA,MAAOrC,GACP9I,EAAK8I,IA3kBT,CA8kBEjJ,OACA,uBACA"} \ No newline at end of file diff --git a/dist/v12/custom/proxy.js b/dist/v12/custom/proxy.js index 1ed4dabb..ddae4b88 100644 --- a/dist/v12/custom/proxy.js +++ b/dist/v12/custom/proxy.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-15; 94e1; SRI-version; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-15; 5f54; SRI-version; v12) */ -!function(m,t,e,n,v){try{var g=undefined,y=!0,_=!1,r="true",a="https:",w="pageview",u="event",i="error",o=m.console,c="doNotTrack",b=m.navigator,s=m.location,x=s.host,l=m.document,p=b.userAgent,f="Not sending request ",h=f+"when ",O=_,d=encodeURIComponent,E=decodeURIComponent,S=JSON.stringify,k=m.addEventListener,M="https://"+e,q=l.documentElement||{},A="language",$="Height",j="scroll",D=b.userAgentData,C=j+$,H="offset"+$,P="client"+$,R="pagehide",T="platform",U="platformVersion",I="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),N=m.screen,z=l.currentScript||l.querySelector('script[src*="'+e+'"]');v=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){v("Error in your "+t+" function:",e)},W=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},G=function(t){return"string"==typeof t},J=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},L=function(t,e){return t&&t.getAttribute("data-"+e)},Y=function(t){return Array.isArray(t)?t:G(t)&&t.length?t.split(/, ?/):[]},Z=function(t){return t&&t.constructor===Object},K=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},it=function(t){return"function"==typeof t},ot="namespace",ct=t[ot]||L(z,ot)||"sa",st=function(t,e){var n=m[ct+"_metadata"];Z(n)&&(t=K(t,n));var r=m[Mt];if(!it(r))return Mt&&v(Mt+" not found, set window."+Mt),t;try{return K(t,r.call(m,K(t,e)))}catch(a){F("metadata",a)}},ut=t.strictUtm||L(z,"strict-utm")==r,lt=function(i,t){tt=!i&&nt("q")?"":_;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");tt!==_&&0"); +!function(v,t,e,n,m){try{var g=undefined,y=!0,_=!1,r="true",a="https:",b="pageview",l="event",i="error",o=v.console,c="doNotTrack",w=v.navigator,s=v.location,x=s.host,u=v.document,f=w.userAgent,p="Not sending request ",d=p+"when ",O=_,h=encodeURIComponent,E=decodeURIComponent,M=JSON.stringify,S=v.addEventListener,k="https://"+e,A=u.documentElement||{},q="language",C="Height",D="scroll",$=w.userAgentData,j=D+C,H="offset"+C,R="client"+C,L="pagehide",N="platform",P="platformVersion",T="https://docs.simpleanalytics.com",U=0,I=/(bot|spider|crawl)/i.test(f)&&!/(cubot)/i.test(f),V=v.screen,B=u.currentScript||u.querySelector('script[src*="'+e+'"]');m=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){m("Error in your "+t+" function:",e)},z=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},W=function(t){return"string"==typeof t},G=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},J=function(t,e){return t&&t.getAttribute("data-"+e)},X=function(t){return Array.isArray(t)?t:W(t)&&t.length?t.split(/, ?/):[]},Y=function(t){return t&&t.constructor===Object},Z=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},it=function(t){return"function"==typeof t},ot="namespace",ct=t[ot]||J(B,ot)||"sa",st=function(t,e){var n=v[ct+"_metadata"];Y(n)&&(t=Z(t,n));var r=v[kt];if(!it(r))return kt&&m(kt+" not found, set window."+kt),t;try{return Z(t,r.call(v,Z(t,e)))}catch(a){F("metadata",a)}},ut=t.strictUtm||J(B,"strict-utm")==r,lt=function(i,t){tt=!i&&nt("q")?"":_;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");tt!==_&&0"); //# sourceMappingURL=proxy.js.map \ No newline at end of file diff --git a/dist/v12/custom/proxy.js.map b/dist/v12/custom/proxy.js.map index 195e1b65..638dbe5a 100644 --- a/dist/v12/custom/proxy.js.map +++ b/dist/v12/custom/proxy.js.map @@ -1 +1 @@ -{"version":3,"file":"proxy.source.js","sources":["proxy.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = trueVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch = \"\";\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n var pathKey = path + querySearch;\n if (!path || lastSendPath == pathKey) return;\n\n lastSendPath = pathKey;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_proxy_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","protocol","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","parts","querySearch","shift","pathKey","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"proxy.source.js","sources":["proxy.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData, keepalive) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n var imageUrl =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n\n // Inline events must survive navigation without taking over links or forms.\n if (keepalive && window.fetch) {\n try {\n window\n .fetch(imageUrl, {\n keepalive: trueVar,\n mode: \"no-cors\",\n credentials: \"omit\",\n })\n .catch(function () {\n image.src = imageUrl;\n });\n return;\n } catch (error) {}\n }\n image.src = imageUrl;\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = trueVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch = \"\";\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n var pathKey = path + querySearch;\n if (!path || lastSendPath == pathKey) return;\n\n lastSendPath = pathKey;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n var manualPageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n window[namespace + \"_\" + pageviewText] = manualPageview;\n var defaultPageview = defaultNamespace + \"_\" + pageviewText;\n if (!window[defaultPageview]) window[defaultPageview] = manualPageview;\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw, keepalive) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback,\n undefinedVar,\n keepalive\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n\n var inlineEvent = function (event) {\n var element = event.target;\n while (\n element &&\n element !== doc &&\n (!element.getAttribute || attr(element, \"simple-event\") === null)\n )\n element = element.parentNode;\n\n if (!element || element === doc) return;\n var isForm = element.tagName === \"FORM\";\n var name = attr(element, \"simple-event\");\n if (!name || isForm !== (event.type === \"submit\")) return;\n\n var metadata = { tag: element.tagName.toLowerCase() };\n var attributes = element.attributes;\n for (var i = 0; i < attributes.length; i++) {\n var attribute = attributes[i];\n if (attribute.name.indexOf(\"data-simple-event-\") === 0)\n metadata[attribute.name.slice(18).replace(/-/g, \"_\")] =\n attribute.value;\n }\n if (isForm) {\n var button = event.submitter;\n metadata.button_text = button\n ? (button.textContent || button.value || \"\")\n .replace(/\\s+/g, \" \")\n .trim()\n .slice(0, 200)\n : \"\";\n }\n sendEvent(name, metadata, undefinedVar, trueVar);\n };\n\n doc.addEventListener(\"click\", inlineEvent, falseVar);\n doc.addEventListener(\"submit\", inlineEvent, falseVar);\n\n // 404 confirmation adds a request, so existing installs must opt in.\n if (\n overwriteOptions.detect404 === trueVar ||\n attr(scriptElement, \"detect-404\") == trueText\n ) {\n var detect404 = function () {\n if (\n !/\\b404\\b/.test(doc.title + \" \" + (doc.body && doc.body.textContent))\n )\n return;\n try {\n var request = new window.XMLHttpRequest();\n request.open(\"HEAD\", loc.href, trueVar);\n request.onload = function () {\n if (request.status === 404)\n sendEvent(\"page_404\", {\n url: loc.protocol + \"//\" + definedHostname + loc.pathname,\n status: 404,\n });\n };\n request.send();\n } catch (error) {}\n };\n if (doc.readyState === \"loading\")\n doc.addEventListener(\"DOMContentLoaded\", detect404, falseVar);\n else detect404();\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_proxy_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","keepalive","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","imageUrl","key","fetch","mode","credentials","catch","src","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","protocol","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","parts","querySearch","shift","pathKey","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","manualPageview","defaultPageview","defaultNamespace","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue","detect404","inlineEvent","element","target","parentNode","isForm","tagName","button","tag","toLowerCase","attributes","submitter","button_text","textContent","trim","title","request","XMLHttpRequest","open","href","status","url","send","readyState"],"mappings":"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"} \ No newline at end of file diff --git a/dist/v12/light.js b/dist/v12/light.js index 5e29e92b..876211bb 100644 --- a/dist/v12/light.js +++ b/dist/v12/light.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-15; acb0; SRI-version; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-15; 6cb2; SRI-version; v12) */ -!function(f,e,t,m){try{var u=undefined,n="https:",r=f.console,a="doNotTrack",g=f.navigator,p=f.location,h=p.host,i=f.document,o=g.userAgent,c="Not sending request ",v=!1,s=encodeURIComponent,d=decodeURIComponent,l=JSON.stringify,y=f.addEventListener,_="https://queue."+t,b=(i.documentElement,"language"),w=g.userAgentData,O="platform",S="platformVersion",j="https://docs.simpleanalytics.com",k=/(bot|spider|crawl)/i.test(o)&&!/(cubot)/i.test(o),E=i.currentScript||i.querySelector('script[src*="'+t+'"]');m=function(){var e=[].slice.call(arguments);return e.unshift("Simple Analytics:"),Function.prototype.apply.call(r.warn,r,e)};var q=function(e){return"string"==typeof e},x=function(e,t){return e&&e.getAttribute("data-"+t)},A=function(){for(var e,t,n,r={},a=arguments,i=0;i>e/4).toString(16)})}catch(r){return e.replace(n,function(e){var t=16*Math.random()|0;return(e<2?t:3&t|8).toString(16)})}},N=function(e){return"function"==typeof e},R="namespace",U=e[R]||x(E,R)||"sa",V=e.strictUtm||"true"==x(E,"strict-utm"),B=U+"_loaded";if(1==f[B])return m(c+"twice");f.sa_event_loaded=!0,f[B]=!0;var C,T=function(t,e,n){t=n?t:A(J,M,t),g.brave&&!n&&(t.brave=!0),g._duckduckgoloader_&&!n&&(t.duck=!0),(new Image).src=_+"/simple.gif?"+Object.keys(t).filter(function(e){return t[e]!=u}).map(function(e){return s(e)+"="+s(t[e])}).join("&")+"&time="+Date.now()},F=e.hostname||x(E,"hostname"),H=F||h,z={version:"cdn_light_12",hostname:H};e.mode||x(E,"mode");try{C=Intl.DateTimeFormat().resolvedOptions().timeZone}catch(X){m(X)}k&&(z.bot=!0);var J=A(z,{ua:o,https:p.protocol==n,timezone:C,page_id:I(),session_id:I()});if(J.sri=!0,w&&(J.mobile=w.mobile,J.brands=l(w.brands)),H!==h&&(J.hostname_original=h),a in g&&"1"==g[a])return m("Not sending request when "+a+" is enabled. See "+j+"/dnt");-1!=h.indexOf(".")&&!/^[0-9.:]+$/.test(h)||F||m("Set hostname on "+h+". See "+j+"/overwrite-domain-name");var L,M={},P=(e.referrer||x(E,"referrer")||i.referrer||"").replace(h,H).replace(/^https?:\/\/((m|l|w{2,3}([0-9]+)?)\.)?([^?#]+)(.*)$/,"$4").replace(/^([^/]+)$/,"$1")||u,Z=function(e,t){var n=A(z,{type:"append",original_id:t?e:J.page_id});if(t||!g.sendBeacon)T(n,0,!0);else try{g.sendBeacon.bind(g)(_+"/append",l(n))}catch(r){T(n,0,!0)}};y("pagehide",Z,!1);var G,K,Q=function(e){var t="";try{t=e||d(p.pathname)}catch(X){m(X)}return t},W=function(e,t,n,r,a,i){e&&Z(""+J.page_id,!0),J.page_id=I();var o,c=H+Q(),s=(o=t,(r||p.search).slice(1).split("&").filter(function(e){return!o&&new RegExp("^((utm_)"+(V?"":"?")+"(source|medium|content|term|campaign)"+(V?"":"|ref")+")=","i").test(e)}).join("&")||u);T({id:J.page_id,type:"pageview",referrer:!t||n?P:null,query:s}),P=c,0};!function(e,t,n,r){!r&&N(n)&&(r=n);N(r);var a,i="";q(t)&&-1>e/4).toString(16)})}catch(r){return e.replace(n,function(e){var t=16*Math.random()|0;return(e<2?t:3&t|8).toString(16)})}},N=function(e){return"function"==typeof e},R="namespace",U=e[R]||x(E,R)||"sa",V=e.strictUtm||"true"==x(E,"strict-utm"),B=U+"_loaded";if(1==f[B])return m(c+"twice");f.sa_event_loaded=!0,f[B]=!0;var C,T=function(t,e,n,r){t=n?t:A(J,M,t),g.brave&&!n&&(t.brave=!0),g._duckduckgoloader_&&!n&&(t.duck=!0);var a=new Image,i=_+"/simple.gif?"+Object.keys(t).filter(function(e){return t[e]!=u}).map(function(e){return s(e)+"="+s(t[e])}).join("&")+"&time="+Date.now();a.src=i},F=e.hostname||x(E,"hostname"),H=F||h,z={version:"cdn_light_12",hostname:H};e.mode||x(E,"mode");try{C=Intl.DateTimeFormat().resolvedOptions().timeZone}catch(X){m(X)}k&&(z.bot=!0);var J=A(z,{ua:o,https:p.protocol==n,timezone:C,page_id:I(),session_id:I()});if(J.sri=!0,w&&(J.mobile=w.mobile,J.brands=l(w.brands)),H!==h&&(J.hostname_original=h),a in g&&"1"==g[a])return m("Not sending request when "+a+" is enabled. See "+j+"/dnt");-1!=h.indexOf(".")&&!/^[0-9.:]+$/.test(h)||F||m("Set hostname on "+h+". See "+j+"/overwrite-domain-name");var L,M={},P=(e.referrer||x(E,"referrer")||i.referrer||"").replace(h,H).replace(/^https?:\/\/((m|l|w{2,3}([0-9]+)?)\.)?([^?#]+)(.*)$/,"$4").replace(/^([^/]+)$/,"$1")||u,Z=function(e,t){var n=A(z,{type:"append",original_id:t?e:J.page_id});if(t||!g.sendBeacon)T(n,0,!0);else try{g.sendBeacon.bind(g)(_+"/append",l(n))}catch(r){T(n,0,!0)}};y("pagehide",Z,!1);var G,K,Q=function(e){var t="";try{t=e||d(p.pathname)}catch(X){m(X)}return t},W=function(e,t,n,r,a,i){e&&Z(""+J.page_id,!0),J.page_id=I();var o,c=H+Q(),s=(o=t,(r||p.search).slice(1).split("&").filter(function(e){return!o&&new RegExp("^((utm_)"+(V?"":"?")+"(source|medium|content|term|campaign)"+(V?"":"|ref")+")=","i").test(e)}).join("&")||u);T({id:J.page_id,type:"pageview",referrer:!t||n?P:null,query:s}),P=c,0};!function(e,t,n,r){!r&&N(n)&&(r=n);N(r);var a,i="";q(t)&&-1> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n if (ignore) return falseVar;\n // eslint-disable-next-line no-redeclare\n var regex =\n \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \")=\";\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n return q || undefinedVar;\n };\n\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n\n\n\n\n\n\n\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n // eslint-disable-next-line no-redeclare\n var bot = isBotAgent;\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = trueVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n\n\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch = \"\";\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n var pathKey = path + querySearch;\n if (!path || lastSendPath == pathKey) return;\n\n lastSendPath = pathKey;\n page.path = path;\n\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n sameSite = referrer\n ? referrer.split(slash)[0] == locationHostname\n : falseVar;\n\n\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n\n\n pageview();\n\n } catch (e) {\n warn(e);\n }\n})(\n window,\n {},\n \"simpleanalyticscdn.com\",\n \"queue.\",\n \"cdn_light_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","warn","undefinedVar","undefined","https","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","protocol","language","documentElement","uaData","userAgentData","platformText","platformVersionText","docsUrl","isBotAgent","test","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","isString","string","attr","attribute","getAttribute","assign","obj","prop","object","to","arg","index","length","nextSource","constructor","Object","nextKey","hasOwnProperty","settings","sa_settings","logSettings","keys","Date","now","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","replace","c","getRandomValues","Uint8Array","toString","error","r","Math","random","isFunction","func","namespaceText","namespace","strictUtm","loadedVariable","sa_event_loaded","timezone","sendData","data","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","Image","src","filter","key","map","join","overwrittenHostname","hostname","definedHostname","basePayload","version","mode","Intl","DateTimeFormat","resolvedOptions","timeZone","bot","ua","page_id","session_id","sri","mobile","brands","hostname_original","indexOf","lastSendPath","referrer","sendOnLeave","id","push","append","type","original_id","sendBeacon","bind","e","sameSite","userNavigated","getPath","overwrite","path","pathname","sendPageView","isPushState","deleteSourceInfo","search","metadata","ignoreSource","currentPage","query","split","keyValue","RegExp","pages","pathOverwrite","callbackRaw","parts","querySearch","shift","pathKey","performaceEntryType","perf","performance","navigationText","getEntriesByType","triggerSendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","pageview"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"light.source.js","sources":["light.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n\n var collectMetricByString = function (metricAbbreviation) {\n // eslint-disable-next-line no-unreachable\n return true;\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n if (ignore) return falseVar;\n // eslint-disable-next-line no-redeclare\n var regex =\n \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \")=\";\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n return q || undefinedVar;\n };\n\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData, keepalive) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n var imageUrl =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n\n image.src = imageUrl;\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n\n\n\n\n\n\n\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n // eslint-disable-next-line no-redeclare\n var bot = isBotAgent;\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = trueVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n\n\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch = \"\";\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n var pathKey = path + querySearch;\n if (!path || lastSendPath == pathKey) return;\n\n lastSendPath = pathKey;\n page.path = path;\n\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n sameSite = referrer\n ? referrer.split(slash)[0] == locationHostname\n : falseVar;\n\n\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n\n\n pageview();\n\n } catch (e) {\n warn(e);\n }\n})(\n window,\n {},\n \"simpleanalyticscdn.com\",\n \"queue.\",\n \"cdn_light_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","warn","undefinedVar","undefined","https","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","protocol","language","documentElement","uaData","userAgentData","platformText","platformVersionText","docsUrl","isBotAgent","test","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","isString","string","attr","attribute","getAttribute","assign","obj","prop","object","to","arg","index","length","nextSource","constructor","Object","nextKey","hasOwnProperty","settings","sa_settings","logSettings","keys","Date","now","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","replace","c","getRandomValues","Uint8Array","toString","error","r","Math","random","isFunction","func","namespaceText","namespace","strictUtm","loadedVariable","sa_event_loaded","timezone","sendData","data","callback","onlyThisData","keepalive","payload","page","brave","_duckduckgoloader_","duck","image","Image","imageUrl","filter","key","map","join","src","overwrittenHostname","hostname","definedHostname","basePayload","version","mode","Intl","DateTimeFormat","resolvedOptions","timeZone","bot","ua","page_id","session_id","sri","mobile","brands","hostname_original","indexOf","lastSendPath","referrer","sendOnLeave","id","push","append","type","original_id","sendBeacon","bind","e","sameSite","userNavigated","getPath","overwrite","path","pathname","sendPageView","isPushState","deleteSourceInfo","search","metadata","ignoreSource","currentPage","query","split","keyValue","RegExp","pages","pathOverwrite","callbackRaw","parts","querySearch","shift","pathKey","performaceEntryType","perf","performance","navigationText","getEntriesByType","triggerSendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","pageview"],"mappings":"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"} \ No newline at end of file diff --git a/src/default.js b/src/default.js index 8e375708..f59c9e5d 100644 --- a/src/default.js +++ b/src/default.js @@ -1035,14 +1035,17 @@ if (autoCollect) pageview(); /** if metadata **/ - window.sa_pageview = function (path, metadata, callback) { + var manualPageview = function (path, metadata, callback) { pageview(0, path, metadata, callback); }; /** else **/ - window.sa_pageview = function (path, callback) { + var manualPageview = function (path, callback) { pageview(0, path, undefinedVar, callback); }; /** endif **/ + window[namespace + "_" + pageviewText] = manualPageview; + var defaultPageview = defaultNamespace + "_" + pageviewText; + if (!window[defaultPageview]) window[defaultPageview] = manualPageview; /** else **/ pageview(); diff --git a/test/unit/pageview.test.js b/test/unit/pageview.test.js index 0459f479..fc692a5c 100644 --- a/test/unit/pageview.test.js +++ b/test/unit/pageview.test.js @@ -1,7 +1,55 @@ const { expect } = require("chai"); -const { createDOM } = require("./helpers/dom"); +const { readFileSync } = require("fs"); +const { runInContext } = require("vm"); +const { createDOM, SCRIPT_PATH } = require("./helpers/dom"); describe("pageview", function () { + it("exposes the pageview function under its configured namespace", function () { + const dom = createDOM({ + settings: { namespace: "ba", autoCollect: false }, + }); + expect(dom.window.ba_pageview).to.be.a("function"); + expect(dom.window.sa_pageview).to.equal(dom.window.ba_pageview); + dom.window.sa_pageview("/legacy"); + dom.window.ba_pageview("/namespaced"); + const paths = dom.sent.map((request) => + new URL(request.url).searchParams.get("path") + ); + expect(paths).to.deep.equal(["/legacy", "/namespaced"]); + dom.window.close(); + }); + + it("keeps a default manual tracker separate from an automatic namespaced tracker", function () { + const dom = createDOM({ + beforeRun(context) { + const script = context.document.createElement("script"); + script.setAttribute("data-auto-collect", "false"); + script.setAttribute("data-hostname", "primary.example.com"); + Object.defineProperty(context.document, "currentScript", { + value: script, + }); + }, + }); + const manualPageview = dom.window.sa_pageview; + const script = dom.window.document.currentScript; + script.setAttribute("data-auto-collect", "true"); + script.setAttribute("data-hostname", "secondary.example.com"); + script.setAttribute("data-namespace", "ba"); + runInContext(readFileSync(SCRIPT_PATH, "utf8"), dom.getInternalVMContext()); + expect(dom.window.sa_pageview).to.equal(manualPageview); + dom.window.sa_pageview("/manual"); + dom.window.ba_pageview("/other"); + const hostnames = dom.sent + .filter((request) => request.type === "image") + .map((request) => new URL(request.url).searchParams.get("hostname")); + expect(hostnames).to.deep.equal([ + "secondary.example.com", + "primary.example.com", + "secondary.example.com", + ]); + dom.window.close(); + }); + it("sends pageview, event and beacon requests", function (done) { const dom = createDOM({ navigationType: "reload" }); From 58f6679be9f1864bc46b7efd3430d6d515e941ba Mon Sep 17 00:00:00 2001 From: Adriaan <1079135+adriaandotcom@users.noreply.github.com> Date: Thu, 15 Oct 2026 17:15:29 +0200 Subject: [PATCH 57/62] Fix cmd-click for auto events (#78) * feat(auto-events): allow cmd-click to open in new tab * Preserve browser navigation for automatic link events User request: recheck whether PR #78 remains relevant, fix the current issue, and add the commits to that PR. Current v12 still cancels modified clicks and redirects from tracking callbacks. Use listeners without replacing onclick and reuse the existing keepalive transport; retain event names and metadata. Rebuild current bundles while preserving existing SRI files. Validated with 41 unit tests, 12 deployment tests, typecheck, and 48 local click/transport scenarios. --------- Co-authored-by: Simple Analytics Codex --- dist/latest/auto-events.js | 4 +-- dist/latest/auto-events.js.map | 2 +- dist/latest/cloudflare.js | 8 ++--- dist/latest/custom/app.js | 4 +-- dist/latest/custom/app.js.map | 2 +- dist/latest/custom/auto-events.js | 4 +-- dist/latest/custom/auto-events.js.map | 2 +- dist/latest/custom/e.js | 4 +-- dist/latest/custom/e.js.map | 2 +- dist/latest/custom/latest.dev.js | 8 ++--- dist/latest/custom/latest.js | 4 +-- dist/latest/custom/latest.js.map | 2 +- dist/latest/custom/proxy.js | 4 +-- dist/latest/custom/proxy.js.map | 2 +- dist/latest/hello.js | 4 +-- dist/latest/hello.js.map | 2 +- dist/latest/latest.dev.js | 8 ++--- dist/latest/latest.js | 4 +-- dist/latest/latest.js.map | 2 +- src/auto-events.js | 50 ++++----------------------- src/default.js | 6 ++-- 21 files changed, 45 insertions(+), 83 deletions(-) diff --git a/dist/latest/auto-events.js b/dist/latest/auto-events.js index 390bd44f..2e99bd73 100644 --- a/dist/latest/auto-events.js +++ b/dist/latest/auto-events.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-15; 3352; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-15; 54ac; v12) */ -function r(t,e){var n,o;t.hasAttribute("data-simple-event")||(n=!1,b.downloads&&/^https?:\/\//i.test(t.href)&&new RegExp("\\.("+(b.downloadsExtensions||[]).join("|")+")$","i").test(t.pathname)?n="download":b.outbound&&/^https?:\/\//i.test(t.href)&&t.hostname!==h.location.hostname?n="outbound":b.emails&&/^mailto:/i.test(t.href)?n="email":b.phones&&/^tel:/i.test(t.href)&&(n="phone"),n&&(e?(o="saAutomatedLink(this, '"+n+"');",t.hasAttribute("target")&&"_self"!==t.getAttribute("target")||(o+=" return false;"),t.setAttribute("onclick",o)):t.addEventListener("click",function(){g(this,n)})))}function e(){try{for(var t=document.getElementsByTagName("a"),e=0;e -1,\n emails: collectTypes.indexOf(\"emails\") > -1,\n downloads: collectTypes.indexOf(\"downloads\") > -1,\n phones: collectTypes.indexOf(\"phones\") > -1,\n // Downloads: enter file extensions you want to collect\n downloadsExtensions: setting(\"extensions\", \"array\", [\n \"pdf\",\n \"csv\",\n \"docx\",\n \"xlsx\",\n \"zip\",\n \"doc\",\n \"xls\",\n ]),\n\n // All: use title attribute if set for event name (for all events)\n // THIS TAKES PRECEDENCE OVER OTHER SETTINGS BELOW\n title: setting(\"useTitle\", \"bool\", true),\n // Outbound: use full URL of the links? false for just the hostname\n outboundFullUrl: fullUrls,\n // Downloads: if taking event name from URL, use full URL or just filename (default)\n downloadsFullUrl: fullUrls,\n };\n\n var saGlobal = setting(\"saGlobal\", \"string\", \"sa_event\");\n\n // For compiling the script\n var optionsLink = options;\n\n if (typeof optionsLink === \"undefined\")\n log(\"options object not found, please specify\", \"warn\");\n\n var saAutomatedLink = function saAutomatedLink(element, type) {\n try {\n if (!element) return log(\"no element found\");\n var sent = false;\n\n var callback = function () {\n if (\n type !== \"phone\" &&\n !sent &&\n (!element.hasAttribute(\"target\") ||\n element.getAttribute(\"target\") === \"_self\")\n )\n document.location = element.getAttribute(\"href\");\n sent = true;\n };\n\n if (window[saGlobal] && window[saGlobal + \"_loaded\"]) {\n var hostname = element.hostname;\n var pathname = element.pathname;\n\n var event;\n var metadata = {\n title: element.getAttribute(\"title\") || undefined,\n };\n var url = element.href || undefined;\n\n var useTitle = false;\n if (optionsLink.title && element.hasAttribute(\"title\")) {\n var theTitle = element.getAttribute(\"title\").trim();\n if (theTitle != \"\") useTitle = true;\n }\n\n if (useTitle) {\n event = theTitle;\n } else {\n switch (type) {\n case \"outbound\": {\n event = hostname + (optionsLink.outboundFullUrl ? pathname : \"\");\n metadata.url = url;\n break;\n }\n case \"download\": {\n event = optionsLink.downloadsFullUrl\n ? hostname + pathname\n : pathname.split(\"/\").pop();\n metadata.url = url;\n break;\n }\n case \"email\": {\n var href = element.getAttribute(\"href\");\n event = (href.split(\":\")[1] || \"\").split(\"?\")[0];\n metadata.email = event;\n break;\n }\n case \"phone\": {\n var hrefPhone = element.getAttribute(\"href\");\n event = (hrefPhone.split(\":\")[1] || \"\").split(\"?\")[0];\n metadata.phone = event;\n break;\n }\n }\n }\n\n var clean =\n type +\n \"_\" +\n event.replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_+|_+$)/g, \"\");\n\n window[saGlobal](clean, metadata, callback);\n\n log(\"collected \" + clean);\n\n return type === \"email\" || type === \"phone\"\n ? callback()\n : window.setTimeout(callback, 5000);\n } else {\n log(saGlobal + \" is not defined\", \"warn\");\n return callback();\n }\n } catch (error) {\n log(error.message, \"warn\");\n }\n };\n\n window.saAutomatedLink = saAutomatedLink;\n\n function collectLink(link, onclick) {\n if (link.hasAttribute(\"data-simple-event\")) return;\n var collect = false;\n\n // Collect download clicks\n if (\n optionsLink.downloads &&\n /^https?:\\/\\//i.test(link.href) &&\n new RegExp(\n \"\\\\.(\" + (optionsLink.downloadsExtensions || []).join(\"|\") + \")$\",\n \"i\"\n ).test(link.pathname)\n ) {\n collect = \"download\";\n\n // Collect outbound links clicks\n } else if (\n optionsLink.outbound &&\n /^https?:\\/\\//i.test(link.href) &&\n link.hostname !== window.location.hostname\n ) {\n collect = \"outbound\";\n\n // Collect email clicks\n } else if (optionsLink.emails && /^mailto:/i.test(link.href)) {\n collect = \"email\";\n\n // Collect telephone clicks\n } else if (optionsLink.phones && /^tel:/i.test(link.href)) {\n collect = \"phone\";\n }\n\n if (!collect) return;\n\n if (onclick) {\n var onClickAttribute = \"saAutomatedLink(this, '\" + collect + \"');\";\n\n if (\n !link.hasAttribute(\"target\") ||\n link.getAttribute(\"target\") === \"_self\"\n )\n onClickAttribute += \" return false;\";\n\n link.setAttribute(\"onclick\", onClickAttribute);\n } else {\n link.addEventListener(\"click\", function () {\n saAutomatedLink(this, collect);\n });\n }\n }\n\n function onDOMContentLoaded() {\n try {\n var a = document.getElementsByTagName(\"a\");\n\n // Loop over all links on the page\n for (var i = 0; i < a.length; i++) {\n var link = a[i];\n var href = link.getAttribute(\"href\");\n\n // Skip links that don't have an href\n if (!href) continue;\n\n // We don't want to overwrite website behaviour so we check for the onclick attribute\n if (\n !link.getAttribute(\"onclick\") &&\n !/^mailto:/.test(href) &&\n !/^tel:/.test(href)\n ) {\n collectLink(link, true);\n } else {\n collectLink(link, false);\n }\n }\n } catch (error) {\n log(error.message, \"warn\");\n }\n }\n\n if (doc.readyState === \"ready\" || doc.readyState === \"complete\") {\n onDOMContentLoaded();\n } else {\n document.addEventListener(\"readystatechange\", function (event) {\n if (event.target.readyState === \"complete\") onDOMContentLoaded();\n });\n }\n})(window);\n"],"names":["collectLink","link","onclick","collect","onClickAttribute","hasAttribute","optionsLink","downloads","test","href","RegExp","downloadsExtensions","join","pathname","outbound","hostname","window","location","emails","phones","getAttribute","setAttribute","addEventListener","saAutomatedLink","this","onDOMContentLoaded","a","document","getElementsByTagName","i","length","error","log","message","doc","scriptElement","setting","collectTypes","fullUrls","options","saGlobal","type","logger","console","warn","info","currentScript","querySelector","attribute","defaultValue","value","dataset","split","map","item","trim","filter","Boolean","indexOf","title","outboundFullUrl","downloadsFullUrl","element","sent","callback","theTitle","metadata","undefined","url","useTitle","event","pop","email","phone","clean","replace","setTimeout","readyState","target"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"auto-events.source.js","sources":["auto-events.source.js"],"sourcesContent":["(function saAutomatedEvents(window) {\n // Skip server side rendered pages\n if (typeof window === \"undefined\") return;\n\n var log = function (message, type) {\n var logger = type === \"warn\" ? console.warn : console.info;\n return logger && logger(\"Simple Analytics auto events:\", message);\n };\n\n var doc = window.document;\n\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"auto-events.js\"]');\n\n var setting = function (attribute, type, defaultValue) {\n var value = scriptElement && scriptElement.dataset[attribute];\n\n // Booleans\n if (type === \"bool\" && (value === \"true\" || value === \"false\"))\n return value === \"true\";\n else if (type === \"bool\") return defaultValue;\n\n // Arrays\n if (type === \"array\" && value)\n return value\n .split(\",\")\n .map(function (item) {\n return item.trim();\n })\n .filter(Boolean);\n else if (type === \"array\") return defaultValue;\n\n return value || defaultValue;\n };\n\n var collectTypes = setting(\"collect\", \"array\", [\n \"outbound\",\n \"emails\",\n \"downloads\",\n \"phones\",\n ]);\n var fullUrls = setting(\"fullUrls\", \"bool\", false);\n\n var options = {\n // What to collect\n outbound: collectTypes.indexOf(\"outbound\") > -1,\n emails: collectTypes.indexOf(\"emails\") > -1,\n downloads: collectTypes.indexOf(\"downloads\") > -1,\n phones: collectTypes.indexOf(\"phones\") > -1,\n // Downloads: enter file extensions you want to collect\n downloadsExtensions: setting(\"extensions\", \"array\", [\n \"pdf\",\n \"csv\",\n \"docx\",\n \"xlsx\",\n \"zip\",\n \"doc\",\n \"xls\",\n ]),\n\n // All: use title attribute if set for event name (for all events)\n // THIS TAKES PRECEDENCE OVER OTHER SETTINGS BELOW\n title: setting(\"useTitle\", \"bool\", true),\n // Outbound: use full URL of the links? false for just the hostname\n outboundFullUrl: fullUrls,\n // Downloads: if taking event name from URL, use full URL or just filename (default)\n downloadsFullUrl: fullUrls,\n };\n\n var saGlobal = setting(\"saGlobal\", \"string\", \"sa_event\");\n\n // For compiling the script\n var optionsLink = options;\n\n if (typeof optionsLink === \"undefined\")\n log(\"options object not found, please specify\", \"warn\");\n\n var saAutomatedLink = function saAutomatedLink(element, type) {\n try {\n if (!element) return log(\"no element found\");\n\n if (window[saGlobal] && window[saGlobal + \"_loaded\"]) {\n var hostname = element.hostname;\n var pathname = element.pathname;\n\n var event;\n var metadata = {\n title: element.getAttribute(\"title\") || undefined,\n };\n var url = element.href || undefined;\n\n var useTitle = false;\n if (optionsLink.title && element.hasAttribute(\"title\")) {\n var theTitle = element.getAttribute(\"title\").trim();\n if (theTitle != \"\") useTitle = true;\n }\n\n if (useTitle) {\n event = theTitle;\n } else {\n switch (type) {\n case \"outbound\": {\n event = hostname + (optionsLink.outboundFullUrl ? pathname : \"\");\n metadata.url = url;\n break;\n }\n case \"download\": {\n event = optionsLink.downloadsFullUrl\n ? hostname + pathname\n : pathname.split(\"/\").pop();\n metadata.url = url;\n break;\n }\n case \"email\": {\n var href = element.getAttribute(\"href\");\n event = (href.split(\":\")[1] || \"\").split(\"?\")[0];\n metadata.email = event;\n break;\n }\n case \"phone\": {\n var hrefPhone = element.getAttribute(\"href\");\n event = (hrefPhone.split(\":\")[1] || \"\").split(\"?\")[0];\n metadata.phone = event;\n break;\n }\n }\n }\n\n var clean =\n type +\n \"_\" +\n event.replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_+|_+$)/g, \"\");\n\n window[saGlobal](clean, metadata, function () {}, true);\n\n log(\"collected \" + clean);\n } else {\n log(saGlobal + \" is not defined\", \"warn\");\n }\n } catch (error) {\n log(error.message, \"warn\");\n }\n };\n\n window.saAutomatedLink = saAutomatedLink;\n\n function collectLink(link) {\n if (link.hasAttribute(\"data-simple-event\")) return;\n var collect = false;\n\n // Collect download clicks\n if (\n optionsLink.downloads &&\n /^https?:\\/\\//i.test(link.href) &&\n new RegExp(\n \"\\\\.(\" + (optionsLink.downloadsExtensions || []).join(\"|\") + \")$\",\n \"i\"\n ).test(link.pathname)\n ) {\n collect = \"download\";\n\n // Collect outbound links clicks\n } else if (\n optionsLink.outbound &&\n /^https?:\\/\\//i.test(link.href) &&\n link.hostname !== window.location.hostname\n ) {\n collect = \"outbound\";\n\n // Collect email clicks\n } else if (optionsLink.emails && /^mailto:/i.test(link.href)) {\n collect = \"email\";\n\n // Collect telephone clicks\n } else if (optionsLink.phones && /^tel:/i.test(link.href)) {\n collect = \"phone\";\n }\n\n if (!collect) return;\n\n link.addEventListener(\"click\", function () {\n saAutomatedLink(this, collect);\n });\n }\n\n function onDOMContentLoaded() {\n try {\n var a = document.getElementsByTagName(\"a\");\n\n // Loop over all links on the page\n for (var i = 0; i < a.length; i++) {\n var link = a[i];\n var href = link.getAttribute(\"href\");\n\n // Skip links that don't have an href\n if (!href) continue;\n\n collectLink(link);\n }\n } catch (error) {\n log(error.message, \"warn\");\n }\n }\n\n if (doc.readyState === \"ready\" || doc.readyState === \"complete\") {\n onDOMContentLoaded();\n } else {\n document.addEventListener(\"readystatechange\", function (event) {\n if (event.target.readyState === \"complete\") onDOMContentLoaded();\n });\n }\n})(window);\n"],"names":["onDOMContentLoaded","a","document","getElementsByTagName","i","length","link","getAttribute","collect","hasAttribute","optionsLink","downloads","test","href","RegExp","downloadsExtensions","join","pathname","outbound","hostname","window","location","emails","phones","addEventListener","saAutomatedLink","this","collectLink","error","log","message","doc","scriptElement","setting","collectTypes","fullUrls","options","saGlobal","type","logger","console","warn","info","currentScript","querySelector","attribute","defaultValue","value","dataset","split","map","item","trim","filter","Boolean","indexOf","title","outboundFullUrl","downloadsFullUrl","element","theTitle","metadata","undefined","url","useTitle","event","pop","email","phone","clean","replace","readyState","target"],"mappings":"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"} \ No newline at end of file diff --git a/dist/latest/cloudflare.js b/dist/latest/cloudflare.js index bd29609c..6219fbc1 100644 --- a/dist/latest/cloudflare.js +++ b/dist/latest/cloudflare.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-15; f3cb; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-15; 2af5; v12) */ /* eslint-env browser */ (function ( @@ -328,7 +328,7 @@ "&time=" + Date.now(); - // Inline events must survive navigation without taking over links or forms. + // Events must survive navigation without taking over links or forms. if (keepalive && window.fetch) { try { window @@ -981,8 +981,8 @@ } }; - var defaultEventFunc = function (event, metadata, callback) { - sendEvent(event, metadata, callback); + var defaultEventFunc = function (event, metadata, callback, keepalive) { + sendEvent(event, metadata, callback, keepalive); }; // Set default function if user didn't define a function diff --git a/dist/latest/custom/app.js b/dist/latest/custom/app.js index 5733a065..1f5b3a0e 100644 --- a/dist/latest/custom/app.js +++ b/dist/latest/custom/app.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-15; 986e; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-15; 0372; v12) */ -!function(v,t,e,n,m){try{var g=undefined,y=!0,_=!1,r="true",a="https:",b="pageview",l="event",i="error",o=v.console,c="doNotTrack",w=v.navigator,s=v.location,O=s.host,u=v.document,p=w.userAgent,f="Not sending request ",d=f+"when ",x=_,h=encodeURIComponent,E=decodeURIComponent,M=JSON.stringify,S=v.addEventListener,k="https://"+e,A=u.documentElement||{},q="language",C="Height",D="scroll",$=w.userAgentData,j=D+C,H="offset"+C,R="client"+C,L="pagehide",N="platform",P="platformVersion",T="https://docs.simpleanalytics.com",U=0,I=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),V=v.screen,B=u.currentScript||u.querySelector('script[src*="'+e+'"]');m=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){m("Error in your "+t+" function:",e)},z=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},W=function(t){return"string"==typeof t},G=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},J=function(t,e){return t&&t.getAttribute("data-"+e)},X=function(t){return Array.isArray(t)?t:W(t)&&t.length?t.split(/, ?/):[]},Y=function(t){return t&&t.constructor===Object},Z=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},it=function(t){return"function"==typeof t},ot="namespace",ct=t[ot]||J(B,ot)||"sa",st=function(t,e){var n=v[ct+"_metadata"];Y(n)&&(t=Z(t,n));var r=v[kt];if(!it(r))return kt&&m(kt+" not found, set window."+kt),t;try{return Z(t,r.call(v,Z(t,e)))}catch(a){F("metadata",a)}},ut=t.strictUtm||J(B,"strict-utm")==r,lt=function(i,t){tt=!i&&nt("q")?"":_;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");tt!==_&&0"); +!function(v,t,e,n,m){try{var g=undefined,y=!0,_=!1,r="true",a="https:",b="pageview",l="event",i="error",o=v.console,c="doNotTrack",w=v.navigator,s=v.location,O=s.host,u=v.document,p=w.userAgent,f="Not sending request ",d=f+"when ",x=_,h=encodeURIComponent,E=decodeURIComponent,M=JSON.stringify,S=v.addEventListener,k="https://"+e,A=u.documentElement||{},q="language",C="Height",D="scroll",$=w.userAgentData,j=D+C,H="offset"+C,R="client"+C,L="pagehide",N="platform",P="platformVersion",T="https://docs.simpleanalytics.com",U=0,I=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),V=v.screen,B=u.currentScript||u.querySelector('script[src*="'+e+'"]');m=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){m("Error in your "+t+" function:",e)},z=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},W=function(t){return"string"==typeof t},G=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},J=function(t,e){return t&&t.getAttribute("data-"+e)},X=function(t){return Array.isArray(t)?t:W(t)&&t.length?t.split(/, ?/):[]},Y=function(t){return t&&t.constructor===Object},Z=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},it=function(t){return"function"==typeof t},ot="namespace",ct=t[ot]||J(B,ot)||"sa",st=function(t,e){var n=v[ct+"_metadata"];Y(n)&&(t=Z(t,n));var r=v[kt];if(!it(r))return kt&&m(kt+" not found, set window."+kt),t;try{return Z(t,r.call(v,Z(t,e)))}catch(a){F("metadata",a)}},ut=t.strictUtm||J(B,"strict-utm")==r,lt=function(i,t){tt=!i&&nt("q")?"":_;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");tt!==_&&0"); //# sourceMappingURL=app.js.map \ No newline at end of file diff --git a/dist/latest/custom/app.js.map b/dist/latest/custom/app.js.map index 70aea5a7..5818a0d9 100644 --- a/dist/latest/custom/app.js.map +++ b/dist/latest/custom/app.js.map @@ -1 +1 @@ -{"version":3,"file":"app.source.js","sources":["app.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData, keepalive) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n var imageUrl =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n\n // Inline events must survive navigation without taking over links or forms.\n if (keepalive && window.fetch) {\n try {\n window\n .fetch(imageUrl, {\n keepalive: trueVar,\n mode: \"no-cors\",\n credentials: \"omit\",\n })\n .catch(function () {\n image.src = imageUrl;\n });\n return;\n } catch (error) {}\n }\n image.src = imageUrl;\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch = \"\";\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n var pathKey = path + querySearch;\n if (!path || lastSendPath == pathKey) return;\n\n lastSendPath = pathKey;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n var manualPageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n window[namespace + \"_\" + pageviewText] = manualPageview;\n var defaultPageview = defaultNamespace + \"_\" + pageviewText;\n if (!window[defaultPageview]) window[defaultPageview] = manualPageview;\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw, keepalive) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback,\n undefinedVar,\n keepalive\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n\n var inlineEvent = function (event) {\n var element = event.target;\n while (\n element &&\n element !== doc &&\n (!element.getAttribute || attr(element, \"simple-event\") === null)\n )\n element = element.parentNode;\n\n if (!element || element === doc) return;\n var isForm = element.tagName === \"FORM\";\n var name = attr(element, \"simple-event\");\n if (!name || isForm !== (event.type === \"submit\")) return;\n\n var metadata = { tag: element.tagName.toLowerCase() };\n var attributes = element.attributes;\n for (var i = 0; i < attributes.length; i++) {\n var attribute = attributes[i];\n if (attribute.name.indexOf(\"data-simple-event-\") === 0)\n metadata[attribute.name.slice(18).replace(/-/g, \"_\")] =\n attribute.value;\n }\n if (isForm) {\n var button = event.submitter;\n metadata.button_text = button\n ? (button.textContent || button.value || \"\")\n .replace(/\\s+/g, \" \")\n .trim()\n .slice(0, 200)\n : \"\";\n }\n sendEvent(name, metadata, undefinedVar, trueVar);\n };\n\n doc.addEventListener(\"click\", inlineEvent, falseVar);\n doc.addEventListener(\"submit\", inlineEvent, falseVar);\n\n // 404 confirmation adds a request, so existing installs must opt in.\n if (\n overwriteOptions.detect404 === trueVar ||\n attr(scriptElement, \"detect-404\") == trueText\n ) {\n var detect404 = function () {\n if (\n !/\\b404\\b/.test(doc.title + \" \" + (doc.body && doc.body.textContent))\n )\n return;\n try {\n var request = new window.XMLHttpRequest();\n request.open(\"HEAD\", loc.href, trueVar);\n request.onload = function () {\n if (request.status === 404)\n sendEvent(\"page_404\", {\n url: loc.protocol + \"//\" + definedHostname + loc.pathname,\n status: 404,\n });\n };\n request.send();\n } catch (error) {}\n };\n if (doc.readyState === \"loading\")\n doc.addEventListener(\"DOMContentLoaded\", detect404, falseVar);\n else detect404();\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_app_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","keepalive","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","imageUrl","key","fetch","mode","credentials","catch","src","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","protocol","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","parts","querySearch","shift","pathKey","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","manualPageview","defaultPageview","defaultNamespace","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue","detect404","inlineEvent","element","target","parentNode","isForm","tagName","button","tag","toLowerCase","attributes","submitter","button_text","textContent","trim","title","request","XMLHttpRequest","open","href","status","url","send","readyState"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"app.source.js","sources":["app.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData, keepalive) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n var imageUrl =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n\n // Events must survive navigation without taking over links or forms.\n if (keepalive && window.fetch) {\n try {\n window\n .fetch(imageUrl, {\n keepalive: trueVar,\n mode: \"no-cors\",\n credentials: \"omit\",\n })\n .catch(function () {\n image.src = imageUrl;\n });\n return;\n } catch (error) {}\n }\n image.src = imageUrl;\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch = \"\";\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n var pathKey = path + querySearch;\n if (!path || lastSendPath == pathKey) return;\n\n lastSendPath = pathKey;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n var manualPageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n window[namespace + \"_\" + pageviewText] = manualPageview;\n var defaultPageview = defaultNamespace + \"_\" + pageviewText;\n if (!window[defaultPageview]) window[defaultPageview] = manualPageview;\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw, keepalive) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback,\n undefinedVar,\n keepalive\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback, keepalive) {\n sendEvent(event, metadata, callback, keepalive);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n\n var inlineEvent = function (event) {\n var element = event.target;\n while (\n element &&\n element !== doc &&\n (!element.getAttribute || attr(element, \"simple-event\") === null)\n )\n element = element.parentNode;\n\n if (!element || element === doc) return;\n var isForm = element.tagName === \"FORM\";\n var name = attr(element, \"simple-event\");\n if (!name || isForm !== (event.type === \"submit\")) return;\n\n var metadata = { tag: element.tagName.toLowerCase() };\n var attributes = element.attributes;\n for (var i = 0; i < attributes.length; i++) {\n var attribute = attributes[i];\n if (attribute.name.indexOf(\"data-simple-event-\") === 0)\n metadata[attribute.name.slice(18).replace(/-/g, \"_\")] =\n attribute.value;\n }\n if (isForm) {\n var button = event.submitter;\n metadata.button_text = button\n ? (button.textContent || button.value || \"\")\n .replace(/\\s+/g, \" \")\n .trim()\n .slice(0, 200)\n : \"\";\n }\n sendEvent(name, metadata, undefinedVar, trueVar);\n };\n\n doc.addEventListener(\"click\", inlineEvent, falseVar);\n doc.addEventListener(\"submit\", inlineEvent, falseVar);\n\n // 404 confirmation adds a request, so existing installs must opt in.\n if (\n overwriteOptions.detect404 === trueVar ||\n attr(scriptElement, \"detect-404\") == trueText\n ) {\n var detect404 = function () {\n if (\n !/\\b404\\b/.test(doc.title + \" \" + (doc.body && doc.body.textContent))\n )\n return;\n try {\n var request = new window.XMLHttpRequest();\n request.open(\"HEAD\", loc.href, trueVar);\n request.onload = function () {\n if (request.status === 404)\n sendEvent(\"page_404\", {\n url: loc.protocol + \"//\" + definedHostname + loc.pathname,\n status: 404,\n });\n };\n request.send();\n } catch (error) {}\n };\n if (doc.readyState === \"loading\")\n doc.addEventListener(\"DOMContentLoaded\", detect404, falseVar);\n else detect404();\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_app_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","keepalive","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","imageUrl","key","fetch","mode","credentials","catch","src","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","protocol","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","parts","querySearch","shift","pathKey","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","manualPageview","defaultPageview","defaultNamespace","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue","detect404","inlineEvent","element","target","parentNode","isForm","tagName","button","tag","toLowerCase","attributes","submitter","button_text","textContent","trim","title","request","XMLHttpRequest","open","href","status","url","send","readyState"],"mappings":"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"} \ No newline at end of file diff --git a/dist/latest/custom/auto-events.js b/dist/latest/custom/auto-events.js index 390bd44f..2e99bd73 100644 --- a/dist/latest/custom/auto-events.js +++ b/dist/latest/custom/auto-events.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-15; 3352; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-15; 54ac; v12) */ -function r(t,e){var n,o;t.hasAttribute("data-simple-event")||(n=!1,b.downloads&&/^https?:\/\//i.test(t.href)&&new RegExp("\\.("+(b.downloadsExtensions||[]).join("|")+")$","i").test(t.pathname)?n="download":b.outbound&&/^https?:\/\//i.test(t.href)&&t.hostname!==h.location.hostname?n="outbound":b.emails&&/^mailto:/i.test(t.href)?n="email":b.phones&&/^tel:/i.test(t.href)&&(n="phone"),n&&(e?(o="saAutomatedLink(this, '"+n+"');",t.hasAttribute("target")&&"_self"!==t.getAttribute("target")||(o+=" return false;"),t.setAttribute("onclick",o)):t.addEventListener("click",function(){g(this,n)})))}function e(){try{for(var t=document.getElementsByTagName("a"),e=0;e -1,\n emails: collectTypes.indexOf(\"emails\") > -1,\n downloads: collectTypes.indexOf(\"downloads\") > -1,\n phones: collectTypes.indexOf(\"phones\") > -1,\n // Downloads: enter file extensions you want to collect\n downloadsExtensions: setting(\"extensions\", \"array\", [\n \"pdf\",\n \"csv\",\n \"docx\",\n \"xlsx\",\n \"zip\",\n \"doc\",\n \"xls\",\n ]),\n\n // All: use title attribute if set for event name (for all events)\n // THIS TAKES PRECEDENCE OVER OTHER SETTINGS BELOW\n title: setting(\"useTitle\", \"bool\", true),\n // Outbound: use full URL of the links? false for just the hostname\n outboundFullUrl: fullUrls,\n // Downloads: if taking event name from URL, use full URL or just filename (default)\n downloadsFullUrl: fullUrls,\n };\n\n var saGlobal = setting(\"saGlobal\", \"string\", \"sa_event\");\n\n // For compiling the script\n var optionsLink = options;\n\n if (typeof optionsLink === \"undefined\")\n log(\"options object not found, please specify\", \"warn\");\n\n var saAutomatedLink = function saAutomatedLink(element, type) {\n try {\n if (!element) return log(\"no element found\");\n var sent = false;\n\n var callback = function () {\n if (\n type !== \"phone\" &&\n !sent &&\n (!element.hasAttribute(\"target\") ||\n element.getAttribute(\"target\") === \"_self\")\n )\n document.location = element.getAttribute(\"href\");\n sent = true;\n };\n\n if (window[saGlobal] && window[saGlobal + \"_loaded\"]) {\n var hostname = element.hostname;\n var pathname = element.pathname;\n\n var event;\n var metadata = {\n title: element.getAttribute(\"title\") || undefined,\n };\n var url = element.href || undefined;\n\n var useTitle = false;\n if (optionsLink.title && element.hasAttribute(\"title\")) {\n var theTitle = element.getAttribute(\"title\").trim();\n if (theTitle != \"\") useTitle = true;\n }\n\n if (useTitle) {\n event = theTitle;\n } else {\n switch (type) {\n case \"outbound\": {\n event = hostname + (optionsLink.outboundFullUrl ? pathname : \"\");\n metadata.url = url;\n break;\n }\n case \"download\": {\n event = optionsLink.downloadsFullUrl\n ? hostname + pathname\n : pathname.split(\"/\").pop();\n metadata.url = url;\n break;\n }\n case \"email\": {\n var href = element.getAttribute(\"href\");\n event = (href.split(\":\")[1] || \"\").split(\"?\")[0];\n metadata.email = event;\n break;\n }\n case \"phone\": {\n var hrefPhone = element.getAttribute(\"href\");\n event = (hrefPhone.split(\":\")[1] || \"\").split(\"?\")[0];\n metadata.phone = event;\n break;\n }\n }\n }\n\n var clean =\n type +\n \"_\" +\n event.replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_+|_+$)/g, \"\");\n\n window[saGlobal](clean, metadata, callback);\n\n log(\"collected \" + clean);\n\n return type === \"email\" || type === \"phone\"\n ? callback()\n : window.setTimeout(callback, 5000);\n } else {\n log(saGlobal + \" is not defined\", \"warn\");\n return callback();\n }\n } catch (error) {\n log(error.message, \"warn\");\n }\n };\n\n window.saAutomatedLink = saAutomatedLink;\n\n function collectLink(link, onclick) {\n if (link.hasAttribute(\"data-simple-event\")) return;\n var collect = false;\n\n // Collect download clicks\n if (\n optionsLink.downloads &&\n /^https?:\\/\\//i.test(link.href) &&\n new RegExp(\n \"\\\\.(\" + (optionsLink.downloadsExtensions || []).join(\"|\") + \")$\",\n \"i\"\n ).test(link.pathname)\n ) {\n collect = \"download\";\n\n // Collect outbound links clicks\n } else if (\n optionsLink.outbound &&\n /^https?:\\/\\//i.test(link.href) &&\n link.hostname !== window.location.hostname\n ) {\n collect = \"outbound\";\n\n // Collect email clicks\n } else if (optionsLink.emails && /^mailto:/i.test(link.href)) {\n collect = \"email\";\n\n // Collect telephone clicks\n } else if (optionsLink.phones && /^tel:/i.test(link.href)) {\n collect = \"phone\";\n }\n\n if (!collect) return;\n\n if (onclick) {\n var onClickAttribute = \"saAutomatedLink(this, '\" + collect + \"');\";\n\n if (\n !link.hasAttribute(\"target\") ||\n link.getAttribute(\"target\") === \"_self\"\n )\n onClickAttribute += \" return false;\";\n\n link.setAttribute(\"onclick\", onClickAttribute);\n } else {\n link.addEventListener(\"click\", function () {\n saAutomatedLink(this, collect);\n });\n }\n }\n\n function onDOMContentLoaded() {\n try {\n var a = document.getElementsByTagName(\"a\");\n\n // Loop over all links on the page\n for (var i = 0; i < a.length; i++) {\n var link = a[i];\n var href = link.getAttribute(\"href\");\n\n // Skip links that don't have an href\n if (!href) continue;\n\n // We don't want to overwrite website behaviour so we check for the onclick attribute\n if (\n !link.getAttribute(\"onclick\") &&\n !/^mailto:/.test(href) &&\n !/^tel:/.test(href)\n ) {\n collectLink(link, true);\n } else {\n collectLink(link, false);\n }\n }\n } catch (error) {\n log(error.message, \"warn\");\n }\n }\n\n if (doc.readyState === \"ready\" || doc.readyState === \"complete\") {\n onDOMContentLoaded();\n } else {\n document.addEventListener(\"readystatechange\", function (event) {\n if (event.target.readyState === \"complete\") onDOMContentLoaded();\n });\n }\n})(window);\n"],"names":["collectLink","link","onclick","collect","onClickAttribute","hasAttribute","optionsLink","downloads","test","href","RegExp","downloadsExtensions","join","pathname","outbound","hostname","window","location","emails","phones","getAttribute","setAttribute","addEventListener","saAutomatedLink","this","onDOMContentLoaded","a","document","getElementsByTagName","i","length","error","log","message","doc","scriptElement","setting","collectTypes","fullUrls","options","saGlobal","type","logger","console","warn","info","currentScript","querySelector","attribute","defaultValue","value","dataset","split","map","item","trim","filter","Boolean","indexOf","title","outboundFullUrl","downloadsFullUrl","element","sent","callback","theTitle","metadata","undefined","url","useTitle","event","pop","email","phone","clean","replace","setTimeout","readyState","target"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"auto-events.source.js","sources":["auto-events.source.js"],"sourcesContent":["(function saAutomatedEvents(window) {\n // Skip server side rendered pages\n if (typeof window === \"undefined\") return;\n\n var log = function (message, type) {\n var logger = type === \"warn\" ? console.warn : console.info;\n return logger && logger(\"Simple Analytics auto events:\", message);\n };\n\n var doc = window.document;\n\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"auto-events.js\"]');\n\n var setting = function (attribute, type, defaultValue) {\n var value = scriptElement && scriptElement.dataset[attribute];\n\n // Booleans\n if (type === \"bool\" && (value === \"true\" || value === \"false\"))\n return value === \"true\";\n else if (type === \"bool\") return defaultValue;\n\n // Arrays\n if (type === \"array\" && value)\n return value\n .split(\",\")\n .map(function (item) {\n return item.trim();\n })\n .filter(Boolean);\n else if (type === \"array\") return defaultValue;\n\n return value || defaultValue;\n };\n\n var collectTypes = setting(\"collect\", \"array\", [\n \"outbound\",\n \"emails\",\n \"downloads\",\n \"phones\",\n ]);\n var fullUrls = setting(\"fullUrls\", \"bool\", false);\n\n var options = {\n // What to collect\n outbound: collectTypes.indexOf(\"outbound\") > -1,\n emails: collectTypes.indexOf(\"emails\") > -1,\n downloads: collectTypes.indexOf(\"downloads\") > -1,\n phones: collectTypes.indexOf(\"phones\") > -1,\n // Downloads: enter file extensions you want to collect\n downloadsExtensions: setting(\"extensions\", \"array\", [\n \"pdf\",\n \"csv\",\n \"docx\",\n \"xlsx\",\n \"zip\",\n \"doc\",\n \"xls\",\n ]),\n\n // All: use title attribute if set for event name (for all events)\n // THIS TAKES PRECEDENCE OVER OTHER SETTINGS BELOW\n title: setting(\"useTitle\", \"bool\", true),\n // Outbound: use full URL of the links? false for just the hostname\n outboundFullUrl: fullUrls,\n // Downloads: if taking event name from URL, use full URL or just filename (default)\n downloadsFullUrl: fullUrls,\n };\n\n var saGlobal = setting(\"saGlobal\", \"string\", \"sa_event\");\n\n // For compiling the script\n var optionsLink = options;\n\n if (typeof optionsLink === \"undefined\")\n log(\"options object not found, please specify\", \"warn\");\n\n var saAutomatedLink = function saAutomatedLink(element, type) {\n try {\n if (!element) return log(\"no element found\");\n\n if (window[saGlobal] && window[saGlobal + \"_loaded\"]) {\n var hostname = element.hostname;\n var pathname = element.pathname;\n\n var event;\n var metadata = {\n title: element.getAttribute(\"title\") || undefined,\n };\n var url = element.href || undefined;\n\n var useTitle = false;\n if (optionsLink.title && element.hasAttribute(\"title\")) {\n var theTitle = element.getAttribute(\"title\").trim();\n if (theTitle != \"\") useTitle = true;\n }\n\n if (useTitle) {\n event = theTitle;\n } else {\n switch (type) {\n case \"outbound\": {\n event = hostname + (optionsLink.outboundFullUrl ? pathname : \"\");\n metadata.url = url;\n break;\n }\n case \"download\": {\n event = optionsLink.downloadsFullUrl\n ? hostname + pathname\n : pathname.split(\"/\").pop();\n metadata.url = url;\n break;\n }\n case \"email\": {\n var href = element.getAttribute(\"href\");\n event = (href.split(\":\")[1] || \"\").split(\"?\")[0];\n metadata.email = event;\n break;\n }\n case \"phone\": {\n var hrefPhone = element.getAttribute(\"href\");\n event = (hrefPhone.split(\":\")[1] || \"\").split(\"?\")[0];\n metadata.phone = event;\n break;\n }\n }\n }\n\n var clean =\n type +\n \"_\" +\n event.replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_+|_+$)/g, \"\");\n\n window[saGlobal](clean, metadata, function () {}, true);\n\n log(\"collected \" + clean);\n } else {\n log(saGlobal + \" is not defined\", \"warn\");\n }\n } catch (error) {\n log(error.message, \"warn\");\n }\n };\n\n window.saAutomatedLink = saAutomatedLink;\n\n function collectLink(link) {\n if (link.hasAttribute(\"data-simple-event\")) return;\n var collect = false;\n\n // Collect download clicks\n if (\n optionsLink.downloads &&\n /^https?:\\/\\//i.test(link.href) &&\n new RegExp(\n \"\\\\.(\" + (optionsLink.downloadsExtensions || []).join(\"|\") + \")$\",\n \"i\"\n ).test(link.pathname)\n ) {\n collect = \"download\";\n\n // Collect outbound links clicks\n } else if (\n optionsLink.outbound &&\n /^https?:\\/\\//i.test(link.href) &&\n link.hostname !== window.location.hostname\n ) {\n collect = \"outbound\";\n\n // Collect email clicks\n } else if (optionsLink.emails && /^mailto:/i.test(link.href)) {\n collect = \"email\";\n\n // Collect telephone clicks\n } else if (optionsLink.phones && /^tel:/i.test(link.href)) {\n collect = \"phone\";\n }\n\n if (!collect) return;\n\n link.addEventListener(\"click\", function () {\n saAutomatedLink(this, collect);\n });\n }\n\n function onDOMContentLoaded() {\n try {\n var a = document.getElementsByTagName(\"a\");\n\n // Loop over all links on the page\n for (var i = 0; i < a.length; i++) {\n var link = a[i];\n var href = link.getAttribute(\"href\");\n\n // Skip links that don't have an href\n if (!href) continue;\n\n collectLink(link);\n }\n } catch (error) {\n log(error.message, \"warn\");\n }\n }\n\n if (doc.readyState === \"ready\" || doc.readyState === \"complete\") {\n onDOMContentLoaded();\n } else {\n document.addEventListener(\"readystatechange\", function (event) {\n if (event.target.readyState === \"complete\") onDOMContentLoaded();\n });\n }\n})(window);\n"],"names":["onDOMContentLoaded","a","document","getElementsByTagName","i","length","link","getAttribute","collect","hasAttribute","optionsLink","downloads","test","href","RegExp","downloadsExtensions","join","pathname","outbound","hostname","window","location","emails","phones","addEventListener","saAutomatedLink","this","collectLink","error","log","message","doc","scriptElement","setting","collectTypes","fullUrls","options","saGlobal","type","logger","console","warn","info","currentScript","querySelector","attribute","defaultValue","value","dataset","split","map","item","trim","filter","Boolean","indexOf","title","outboundFullUrl","downloadsFullUrl","element","theTitle","metadata","undefined","url","useTitle","event","pop","email","phone","clean","replace","readyState","target"],"mappings":"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"} \ No newline at end of file diff --git a/dist/latest/custom/e.js b/dist/latest/custom/e.js index 11f827bd..1a578d53 100644 --- a/dist/latest/custom/e.js +++ b/dist/latest/custom/e.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-15; 8df9; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-15; 2231; v12) */ -!function(v,t,e,n,m){try{var g=undefined,y=!0,_=!1,r="true",a="https:",b="pageview",l="event",i="error",o=v.console,c="doNotTrack",w=v.navigator,s=v.location,O=s.host,u=v.document,f=w.userAgent,p="Not sending request ",d=p+"when ",x=_,h=encodeURIComponent,E=decodeURIComponent,M=JSON.stringify,S=v.addEventListener,k="https://"+e,A=u.documentElement||{},q="language",C="Height",D="scroll",$=w.userAgentData,j=D+C,H="offset"+C,R="client"+C,L="pagehide",N="platform",P="platformVersion",T="https://docs.simpleanalytics.com",U=0,I=/(bot|spider|crawl)/i.test(f)&&!/(cubot)/i.test(f),V=v.screen,B=u.currentScript||u.querySelector('script[src*="'+e+'"]');m=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){m("Error in your "+t+" function:",e)},z=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},W=function(t){return"string"==typeof t},G=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},J=function(t,e){return t&&t.getAttribute("data-"+e)},X=function(t){return Array.isArray(t)?t:W(t)&&t.length?t.split(/, ?/):[]},Y=function(t){return t&&t.constructor===Object},Z=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},it=function(t){return"function"==typeof t},ot="namespace",ct=t[ot]||J(B,ot)||"sa",st=function(t,e){var n=v[ct+"_metadata"];Y(n)&&(t=Z(t,n));var r=v[kt];if(!it(r))return kt&&m(kt+" not found, set window."+kt),t;try{return Z(t,r.call(v,Z(t,e)))}catch(a){F("metadata",a)}},ut=t.strictUtm||J(B,"strict-utm")==r,lt=function(i,t){tt=!i&&nt("q")?"":_;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");tt!==_&&0"); +!function(v,t,e,n,m){try{var g=undefined,y=!0,_=!1,r="true",a="https:",b="pageview",l="event",i="error",o=v.console,c="doNotTrack",w=v.navigator,s=v.location,O=s.host,u=v.document,f=w.userAgent,p="Not sending request ",d=p+"when ",x=_,h=encodeURIComponent,E=decodeURIComponent,M=JSON.stringify,S=v.addEventListener,k="https://"+e,A=u.documentElement||{},q="language",C="Height",D="scroll",$=w.userAgentData,j=D+C,H="offset"+C,R="client"+C,L="pagehide",N="platform",P="platformVersion",T="https://docs.simpleanalytics.com",U=0,I=/(bot|spider|crawl)/i.test(f)&&!/(cubot)/i.test(f),V=v.screen,B=u.currentScript||u.querySelector('script[src*="'+e+'"]');m=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){m("Error in your "+t+" function:",e)},z=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},W=function(t){return"string"==typeof t},G=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},J=function(t,e){return t&&t.getAttribute("data-"+e)},X=function(t){return Array.isArray(t)?t:W(t)&&t.length?t.split(/, ?/):[]},Y=function(t){return t&&t.constructor===Object},Z=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},it=function(t){return"function"==typeof t},ot="namespace",ct=t[ot]||J(B,ot)||"sa",st=function(t,e){var n=v[ct+"_metadata"];Y(n)&&(t=Z(t,n));var r=v[kt];if(!it(r))return kt&&m(kt+" not found, set window."+kt),t;try{return Z(t,r.call(v,Z(t,e)))}catch(a){F("metadata",a)}},ut=t.strictUtm||J(B,"strict-utm")==r,lt=function(i,t){tt=!i&&nt("q")?"":_;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");tt!==_&&0"); //# sourceMappingURL=e.js.map \ No newline at end of file diff --git a/dist/latest/custom/e.js.map b/dist/latest/custom/e.js.map index 42ed5137..c14cf973 100644 --- a/dist/latest/custom/e.js.map +++ b/dist/latest/custom/e.js.map @@ -1 +1 @@ -{"version":3,"file":"e.source.js","sources":["e.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData, keepalive) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n var imageUrl =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n\n // Inline events must survive navigation without taking over links or forms.\n if (keepalive && window.fetch) {\n try {\n window\n .fetch(imageUrl, {\n keepalive: trueVar,\n mode: \"no-cors\",\n credentials: \"omit\",\n })\n .catch(function () {\n image.src = imageUrl;\n });\n return;\n } catch (error) {}\n }\n image.src = imageUrl;\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch = \"\";\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n var pathKey = path + querySearch;\n if (!path || lastSendPath == pathKey) return;\n\n lastSendPath = pathKey;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n var manualPageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n window[namespace + \"_\" + pageviewText] = manualPageview;\n var defaultPageview = defaultNamespace + \"_\" + pageviewText;\n if (!window[defaultPageview]) window[defaultPageview] = manualPageview;\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw, keepalive) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback,\n undefinedVar,\n keepalive\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n\n var inlineEvent = function (event) {\n var element = event.target;\n while (\n element &&\n element !== doc &&\n (!element.getAttribute || attr(element, \"simple-event\") === null)\n )\n element = element.parentNode;\n\n if (!element || element === doc) return;\n var isForm = element.tagName === \"FORM\";\n var name = attr(element, \"simple-event\");\n if (!name || isForm !== (event.type === \"submit\")) return;\n\n var metadata = { tag: element.tagName.toLowerCase() };\n var attributes = element.attributes;\n for (var i = 0; i < attributes.length; i++) {\n var attribute = attributes[i];\n if (attribute.name.indexOf(\"data-simple-event-\") === 0)\n metadata[attribute.name.slice(18).replace(/-/g, \"_\")] =\n attribute.value;\n }\n if (isForm) {\n var button = event.submitter;\n metadata.button_text = button\n ? (button.textContent || button.value || \"\")\n .replace(/\\s+/g, \" \")\n .trim()\n .slice(0, 200)\n : \"\";\n }\n sendEvent(name, metadata, undefinedVar, trueVar);\n };\n\n doc.addEventListener(\"click\", inlineEvent, falseVar);\n doc.addEventListener(\"submit\", inlineEvent, falseVar);\n\n // 404 confirmation adds a request, so existing installs must opt in.\n if (\n overwriteOptions.detect404 === trueVar ||\n attr(scriptElement, \"detect-404\") == trueText\n ) {\n var detect404 = function () {\n if (\n !/\\b404\\b/.test(doc.title + \" \" + (doc.body && doc.body.textContent))\n )\n return;\n try {\n var request = new window.XMLHttpRequest();\n request.open(\"HEAD\", loc.href, trueVar);\n request.onload = function () {\n if (request.status === 404)\n sendEvent(\"page_404\", {\n url: loc.protocol + \"//\" + definedHostname + loc.pathname,\n status: 404,\n });\n };\n request.send();\n } catch (error) {}\n };\n if (doc.readyState === \"loading\")\n doc.addEventListener(\"DOMContentLoaded\", detect404, falseVar);\n else detect404();\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_events_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","keepalive","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","imageUrl","key","fetch","mode","credentials","catch","src","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","protocol","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","parts","querySearch","shift","pathKey","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","manualPageview","defaultPageview","defaultNamespace","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue","detect404","inlineEvent","element","target","parentNode","isForm","tagName","button","tag","toLowerCase","attributes","submitter","button_text","textContent","trim","title","request","XMLHttpRequest","open","href","status","url","send","readyState"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"e.source.js","sources":["e.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData, keepalive) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n var imageUrl =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n\n // Events must survive navigation without taking over links or forms.\n if (keepalive && window.fetch) {\n try {\n window\n .fetch(imageUrl, {\n keepalive: trueVar,\n mode: \"no-cors\",\n credentials: \"omit\",\n })\n .catch(function () {\n image.src = imageUrl;\n });\n return;\n } catch (error) {}\n }\n image.src = imageUrl;\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch = \"\";\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n var pathKey = path + querySearch;\n if (!path || lastSendPath == pathKey) return;\n\n lastSendPath = pathKey;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n var manualPageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n window[namespace + \"_\" + pageviewText] = manualPageview;\n var defaultPageview = defaultNamespace + \"_\" + pageviewText;\n if (!window[defaultPageview]) window[defaultPageview] = manualPageview;\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw, keepalive) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback,\n undefinedVar,\n keepalive\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback, keepalive) {\n sendEvent(event, metadata, callback, keepalive);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n\n var inlineEvent = function (event) {\n var element = event.target;\n while (\n element &&\n element !== doc &&\n (!element.getAttribute || attr(element, \"simple-event\") === null)\n )\n element = element.parentNode;\n\n if (!element || element === doc) return;\n var isForm = element.tagName === \"FORM\";\n var name = attr(element, \"simple-event\");\n if (!name || isForm !== (event.type === \"submit\")) return;\n\n var metadata = { tag: element.tagName.toLowerCase() };\n var attributes = element.attributes;\n for (var i = 0; i < attributes.length; i++) {\n var attribute = attributes[i];\n if (attribute.name.indexOf(\"data-simple-event-\") === 0)\n metadata[attribute.name.slice(18).replace(/-/g, \"_\")] =\n attribute.value;\n }\n if (isForm) {\n var button = event.submitter;\n metadata.button_text = button\n ? (button.textContent || button.value || \"\")\n .replace(/\\s+/g, \" \")\n .trim()\n .slice(0, 200)\n : \"\";\n }\n sendEvent(name, metadata, undefinedVar, trueVar);\n };\n\n doc.addEventListener(\"click\", inlineEvent, falseVar);\n doc.addEventListener(\"submit\", inlineEvent, falseVar);\n\n // 404 confirmation adds a request, so existing installs must opt in.\n if (\n overwriteOptions.detect404 === trueVar ||\n attr(scriptElement, \"detect-404\") == trueText\n ) {\n var detect404 = function () {\n if (\n !/\\b404\\b/.test(doc.title + \" \" + (doc.body && doc.body.textContent))\n )\n return;\n try {\n var request = new window.XMLHttpRequest();\n request.open(\"HEAD\", loc.href, trueVar);\n request.onload = function () {\n if (request.status === 404)\n sendEvent(\"page_404\", {\n url: loc.protocol + \"//\" + definedHostname + loc.pathname,\n status: 404,\n });\n };\n request.send();\n } catch (error) {}\n };\n if (doc.readyState === \"loading\")\n doc.addEventListener(\"DOMContentLoaded\", detect404, falseVar);\n else detect404();\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_events_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","keepalive","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","imageUrl","key","fetch","mode","credentials","catch","src","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","protocol","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","parts","querySearch","shift","pathKey","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","manualPageview","defaultPageview","defaultNamespace","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue","detect404","inlineEvent","element","target","parentNode","isForm","tagName","button","tag","toLowerCase","attributes","submitter","button_text","textContent","trim","title","request","XMLHttpRequest","open","href","status","url","send","readyState"],"mappings":"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"} \ No newline at end of file diff --git a/dist/latest/custom/latest.dev.js b/dist/latest/custom/latest.dev.js index ba91e7f8..4133bd77 100644 --- a/dist/latest/custom/latest.dev.js +++ b/dist/latest/custom/latest.dev.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-15; 079c; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-15; ee41; v12) */ /* eslint-env browser */ (function ( @@ -327,7 +327,7 @@ "&time=" + Date.now(); - // Inline events must survive navigation without taking over links or forms. + // Events must survive navigation without taking over links or forms. if (keepalive && window.fetch) { try { window @@ -981,8 +981,8 @@ } }; - var defaultEventFunc = function (event, metadata, callback) { - sendEvent(event, metadata, callback); + var defaultEventFunc = function (event, metadata, callback, keepalive) { + sendEvent(event, metadata, callback, keepalive); }; // Set default function if user didn't define a function diff --git a/dist/latest/custom/latest.js b/dist/latest/custom/latest.js index af584663..f81adbaa 100644 --- a/dist/latest/custom/latest.js +++ b/dist/latest/custom/latest.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-15; 126d; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-15; ddc9; v12) */ -!function(v,t,e,n,m){try{var g=undefined,y=!0,_=!1,r="true",a="https:",b="pageview",l="event",i="error",o=v.console,c="doNotTrack",w=v.navigator,s=v.location,O=s.host,u=v.document,f=w.userAgent,p="Not sending request ",d=p+"when ",x=_,h=encodeURIComponent,E=decodeURIComponent,M=JSON.stringify,S=v.addEventListener,k="https://"+e,A=u.documentElement||{},q="language",C="Height",D="scroll",$=w.userAgentData,j=D+C,H="offset"+C,R="client"+C,L="pagehide",N="platform",P="platformVersion",T="https://docs.simpleanalytics.com",U=0,I=/(bot|spider|crawl)/i.test(f)&&!/(cubot)/i.test(f),V=v.screen,B=u.currentScript||u.querySelector('script[src*="'+e+'"]');m=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){m("Error in your "+t+" function:",e)},z=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},W=function(t){return"string"==typeof t},G=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},J=function(t,e){return t&&t.getAttribute("data-"+e)},X=function(t){return Array.isArray(t)?t:W(t)&&t.length?t.split(/, ?/):[]},Y=function(t){return t&&t.constructor===Object},Z=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},it=function(t){return"function"==typeof t},ot="namespace",ct=t[ot]||J(B,ot)||"sa",st=function(t,e){var n=v[ct+"_metadata"];Y(n)&&(t=Z(t,n));var r=v[kt];if(!it(r))return kt&&m(kt+" not found, set window."+kt),t;try{return Z(t,r.call(v,Z(t,e)))}catch(a){F("metadata",a)}},ut=t.strictUtm||J(B,"strict-utm")==r,lt=function(i,t){tt=!i&&nt("q")?"":_;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");tt!==_&&0"); +!function(v,t,e,n,m){try{var g=undefined,y=!0,_=!1,r="true",a="https:",b="pageview",l="event",i="error",o=v.console,c="doNotTrack",w=v.navigator,s=v.location,O=s.host,u=v.document,f=w.userAgent,p="Not sending request ",d=p+"when ",x=_,h=encodeURIComponent,E=decodeURIComponent,M=JSON.stringify,S=v.addEventListener,k="https://"+e,A=u.documentElement||{},q="language",C="Height",D="scroll",$=w.userAgentData,j=D+C,H="offset"+C,R="client"+C,L="pagehide",N="platform",P="platformVersion",T="https://docs.simpleanalytics.com",U=0,I=/(bot|spider|crawl)/i.test(f)&&!/(cubot)/i.test(f),V=v.screen,B=u.currentScript||u.querySelector('script[src*="'+e+'"]');m=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){m("Error in your "+t+" function:",e)},z=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},W=function(t){return"string"==typeof t},G=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},J=function(t,e){return t&&t.getAttribute("data-"+e)},X=function(t){return Array.isArray(t)?t:W(t)&&t.length?t.split(/, ?/):[]},Y=function(t){return t&&t.constructor===Object},Z=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},it=function(t){return"function"==typeof t},ot="namespace",ct=t[ot]||J(B,ot)||"sa",st=function(t,e){var n=v[ct+"_metadata"];Y(n)&&(t=Z(t,n));var r=v[kt];if(!it(r))return kt&&m(kt+" not found, set window."+kt),t;try{return Z(t,r.call(v,Z(t,e)))}catch(a){F("metadata",a)}},ut=t.strictUtm||J(B,"strict-utm")==r,lt=function(i,t){tt=!i&&nt("q")?"":_;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");tt!==_&&0"); //# sourceMappingURL=latest.js.map \ No newline at end of file diff --git a/dist/latest/custom/latest.js.map b/dist/latest/custom/latest.js.map index bae65c84..4cdee688 100644 --- a/dist/latest/custom/latest.js.map +++ b/dist/latest/custom/latest.js.map @@ -1 +1 @@ -{"version":3,"file":"latest.source.js","sources":["latest.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData, keepalive) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n var imageUrl =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n\n // Inline events must survive navigation without taking over links or forms.\n if (keepalive && window.fetch) {\n try {\n window\n .fetch(imageUrl, {\n keepalive: trueVar,\n mode: \"no-cors\",\n credentials: \"omit\",\n })\n .catch(function () {\n image.src = imageUrl;\n });\n return;\n } catch (error) {}\n }\n image.src = imageUrl;\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch = \"\";\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n var pathKey = path + querySearch;\n if (!path || lastSendPath == pathKey) return;\n\n lastSendPath = pathKey;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n var manualPageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n window[namespace + \"_\" + pageviewText] = manualPageview;\n var defaultPageview = defaultNamespace + \"_\" + pageviewText;\n if (!window[defaultPageview]) window[defaultPageview] = manualPageview;\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw, keepalive) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback,\n undefinedVar,\n keepalive\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n\n var inlineEvent = function (event) {\n var element = event.target;\n while (\n element &&\n element !== doc &&\n (!element.getAttribute || attr(element, \"simple-event\") === null)\n )\n element = element.parentNode;\n\n if (!element || element === doc) return;\n var isForm = element.tagName === \"FORM\";\n var name = attr(element, \"simple-event\");\n if (!name || isForm !== (event.type === \"submit\")) return;\n\n var metadata = { tag: element.tagName.toLowerCase() };\n var attributes = element.attributes;\n for (var i = 0; i < attributes.length; i++) {\n var attribute = attributes[i];\n if (attribute.name.indexOf(\"data-simple-event-\") === 0)\n metadata[attribute.name.slice(18).replace(/-/g, \"_\")] =\n attribute.value;\n }\n if (isForm) {\n var button = event.submitter;\n metadata.button_text = button\n ? (button.textContent || button.value || \"\")\n .replace(/\\s+/g, \" \")\n .trim()\n .slice(0, 200)\n : \"\";\n }\n sendEvent(name, metadata, undefinedVar, trueVar);\n };\n\n doc.addEventListener(\"click\", inlineEvent, falseVar);\n doc.addEventListener(\"submit\", inlineEvent, falseVar);\n\n // 404 confirmation adds a request, so existing installs must opt in.\n if (\n overwriteOptions.detect404 === trueVar ||\n attr(scriptElement, \"detect-404\") == trueText\n ) {\n var detect404 = function () {\n if (\n !/\\b404\\b/.test(doc.title + \" \" + (doc.body && doc.body.textContent))\n )\n return;\n try {\n var request = new window.XMLHttpRequest();\n request.open(\"HEAD\", loc.href, trueVar);\n request.onload = function () {\n if (request.status === 404)\n sendEvent(\"page_404\", {\n url: loc.protocol + \"//\" + definedHostname + loc.pathname,\n status: 404,\n });\n };\n request.send();\n } catch (error) {}\n };\n if (doc.readyState === \"loading\")\n doc.addEventListener(\"DOMContentLoaded\", detect404, falseVar);\n else detect404();\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_latest_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","keepalive","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","imageUrl","key","fetch","mode","credentials","catch","src","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","protocol","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","parts","querySearch","shift","pathKey","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","manualPageview","defaultPageview","defaultNamespace","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue","detect404","inlineEvent","element","target","parentNode","isForm","tagName","button","tag","toLowerCase","attributes","submitter","button_text","textContent","trim","title","request","XMLHttpRequest","open","href","status","url","send","readyState"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"latest.source.js","sources":["latest.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData, keepalive) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n var imageUrl =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n\n // Events must survive navigation without taking over links or forms.\n if (keepalive && window.fetch) {\n try {\n window\n .fetch(imageUrl, {\n keepalive: trueVar,\n mode: \"no-cors\",\n credentials: \"omit\",\n })\n .catch(function () {\n image.src = imageUrl;\n });\n return;\n } catch (error) {}\n }\n image.src = imageUrl;\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch = \"\";\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n var pathKey = path + querySearch;\n if (!path || lastSendPath == pathKey) return;\n\n lastSendPath = pathKey;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n var manualPageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n window[namespace + \"_\" + pageviewText] = manualPageview;\n var defaultPageview = defaultNamespace + \"_\" + pageviewText;\n if (!window[defaultPageview]) window[defaultPageview] = manualPageview;\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw, keepalive) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback,\n undefinedVar,\n keepalive\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback, keepalive) {\n sendEvent(event, metadata, callback, keepalive);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n\n var inlineEvent = function (event) {\n var element = event.target;\n while (\n element &&\n element !== doc &&\n (!element.getAttribute || attr(element, \"simple-event\") === null)\n )\n element = element.parentNode;\n\n if (!element || element === doc) return;\n var isForm = element.tagName === \"FORM\";\n var name = attr(element, \"simple-event\");\n if (!name || isForm !== (event.type === \"submit\")) return;\n\n var metadata = { tag: element.tagName.toLowerCase() };\n var attributes = element.attributes;\n for (var i = 0; i < attributes.length; i++) {\n var attribute = attributes[i];\n if (attribute.name.indexOf(\"data-simple-event-\") === 0)\n metadata[attribute.name.slice(18).replace(/-/g, \"_\")] =\n attribute.value;\n }\n if (isForm) {\n var button = event.submitter;\n metadata.button_text = button\n ? (button.textContent || button.value || \"\")\n .replace(/\\s+/g, \" \")\n .trim()\n .slice(0, 200)\n : \"\";\n }\n sendEvent(name, metadata, undefinedVar, trueVar);\n };\n\n doc.addEventListener(\"click\", inlineEvent, falseVar);\n doc.addEventListener(\"submit\", inlineEvent, falseVar);\n\n // 404 confirmation adds a request, so existing installs must opt in.\n if (\n overwriteOptions.detect404 === trueVar ||\n attr(scriptElement, \"detect-404\") == trueText\n ) {\n var detect404 = function () {\n if (\n !/\\b404\\b/.test(doc.title + \" \" + (doc.body && doc.body.textContent))\n )\n return;\n try {\n var request = new window.XMLHttpRequest();\n request.open(\"HEAD\", loc.href, trueVar);\n request.onload = function () {\n if (request.status === 404)\n sendEvent(\"page_404\", {\n url: loc.protocol + \"//\" + definedHostname + loc.pathname,\n status: 404,\n });\n };\n request.send();\n } catch (error) {}\n };\n if (doc.readyState === \"loading\")\n doc.addEventListener(\"DOMContentLoaded\", detect404, falseVar);\n else detect404();\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_latest_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","keepalive","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","imageUrl","key","fetch","mode","credentials","catch","src","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","protocol","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","parts","querySearch","shift","pathKey","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","manualPageview","defaultPageview","defaultNamespace","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue","detect404","inlineEvent","element","target","parentNode","isForm","tagName","button","tag","toLowerCase","attributes","submitter","button_text","textContent","trim","title","request","XMLHttpRequest","open","href","status","url","send","readyState"],"mappings":"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"} \ No newline at end of file diff --git a/dist/latest/custom/proxy.js b/dist/latest/custom/proxy.js index b4c99ea5..1eef4705 100644 --- a/dist/latest/custom/proxy.js +++ b/dist/latest/custom/proxy.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-15; 1a8e; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-15; b4e1; v12) */ -!function(v,t,e,n,m){try{var g=undefined,y=!0,_=!1,r="true",a="https:",b="pageview",l="event",i="error",o=v.console,c="doNotTrack",w=v.navigator,s=v.location,x=s.host,u=v.document,f=w.userAgent,p="Not sending request ",d=p+"when ",O=_,h=encodeURIComponent,E=decodeURIComponent,M=JSON.stringify,S=v.addEventListener,k="https://"+e,A=u.documentElement||{},q="language",C="Height",D="scroll",$=w.userAgentData,j=D+C,H="offset"+C,R="client"+C,L="pagehide",N="platform",P="platformVersion",T="https://docs.simpleanalytics.com",U=0,I=/(bot|spider|crawl)/i.test(f)&&!/(cubot)/i.test(f),V=v.screen,B=u.currentScript||u.querySelector('script[src*="'+e+'"]');m=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){m("Error in your "+t+" function:",e)},z=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},W=function(t){return"string"==typeof t},G=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},J=function(t,e){return t&&t.getAttribute("data-"+e)},X=function(t){return Array.isArray(t)?t:W(t)&&t.length?t.split(/, ?/):[]},Y=function(t){return t&&t.constructor===Object},Z=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},it=function(t){return"function"==typeof t},ot="namespace",ct=t[ot]||J(B,ot)||"sa",st=function(t,e){var n=v[ct+"_metadata"];Y(n)&&(t=Z(t,n));var r=v[kt];if(!it(r))return kt&&m(kt+" not found, set window."+kt),t;try{return Z(t,r.call(v,Z(t,e)))}catch(a){F("metadata",a)}},ut=t.strictUtm||J(B,"strict-utm")==r,lt=function(i,t){tt=!i&&nt("q")?"":_;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");tt!==_&&0"); +!function(v,t,e,n,m){try{var g=undefined,y=!0,_=!1,r="true",a="https:",b="pageview",l="event",i="error",o=v.console,c="doNotTrack",w=v.navigator,s=v.location,x=s.host,u=v.document,f=w.userAgent,p="Not sending request ",d=p+"when ",O=_,h=encodeURIComponent,E=decodeURIComponent,M=JSON.stringify,S=v.addEventListener,k="https://"+e,A=u.documentElement||{},q="language",C="Height",D="scroll",$=w.userAgentData,j=D+C,H="offset"+C,R="client"+C,L="pagehide",N="platform",P="platformVersion",T="https://docs.simpleanalytics.com",U=0,I=/(bot|spider|crawl)/i.test(f)&&!/(cubot)/i.test(f),V=v.screen,B=u.currentScript||u.querySelector('script[src*="'+e+'"]');m=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){m("Error in your "+t+" function:",e)},z=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},W=function(t){return"string"==typeof t},G=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},J=function(t,e){return t&&t.getAttribute("data-"+e)},X=function(t){return Array.isArray(t)?t:W(t)&&t.length?t.split(/, ?/):[]},Y=function(t){return t&&t.constructor===Object},Z=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},it=function(t){return"function"==typeof t},ot="namespace",ct=t[ot]||J(B,ot)||"sa",st=function(t,e){var n=v[ct+"_metadata"];Y(n)&&(t=Z(t,n));var r=v[kt];if(!it(r))return kt&&m(kt+" not found, set window."+kt),t;try{return Z(t,r.call(v,Z(t,e)))}catch(a){F("metadata",a)}},ut=t.strictUtm||J(B,"strict-utm")==r,lt=function(i,t){tt=!i&&nt("q")?"":_;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");tt!==_&&0"); //# sourceMappingURL=proxy.js.map \ No newline at end of file diff --git a/dist/latest/custom/proxy.js.map b/dist/latest/custom/proxy.js.map index 6f89ad5e..1a4174ca 100644 --- a/dist/latest/custom/proxy.js.map +++ b/dist/latest/custom/proxy.js.map @@ -1 +1 @@ -{"version":3,"file":"proxy.source.js","sources":["proxy.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData, keepalive) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n var imageUrl =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n\n // Inline events must survive navigation without taking over links or forms.\n if (keepalive && window.fetch) {\n try {\n window\n .fetch(imageUrl, {\n keepalive: trueVar,\n mode: \"no-cors\",\n credentials: \"omit\",\n })\n .catch(function () {\n image.src = imageUrl;\n });\n return;\n } catch (error) {}\n }\n image.src = imageUrl;\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch = \"\";\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n var pathKey = path + querySearch;\n if (!path || lastSendPath == pathKey) return;\n\n lastSendPath = pathKey;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n var manualPageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n window[namespace + \"_\" + pageviewText] = manualPageview;\n var defaultPageview = defaultNamespace + \"_\" + pageviewText;\n if (!window[defaultPageview]) window[defaultPageview] = manualPageview;\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw, keepalive) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback,\n undefinedVar,\n keepalive\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n\n var inlineEvent = function (event) {\n var element = event.target;\n while (\n element &&\n element !== doc &&\n (!element.getAttribute || attr(element, \"simple-event\") === null)\n )\n element = element.parentNode;\n\n if (!element || element === doc) return;\n var isForm = element.tagName === \"FORM\";\n var name = attr(element, \"simple-event\");\n if (!name || isForm !== (event.type === \"submit\")) return;\n\n var metadata = { tag: element.tagName.toLowerCase() };\n var attributes = element.attributes;\n for (var i = 0; i < attributes.length; i++) {\n var attribute = attributes[i];\n if (attribute.name.indexOf(\"data-simple-event-\") === 0)\n metadata[attribute.name.slice(18).replace(/-/g, \"_\")] =\n attribute.value;\n }\n if (isForm) {\n var button = event.submitter;\n metadata.button_text = button\n ? (button.textContent || button.value || \"\")\n .replace(/\\s+/g, \" \")\n .trim()\n .slice(0, 200)\n : \"\";\n }\n sendEvent(name, metadata, undefinedVar, trueVar);\n };\n\n doc.addEventListener(\"click\", inlineEvent, falseVar);\n doc.addEventListener(\"submit\", inlineEvent, falseVar);\n\n // 404 confirmation adds a request, so existing installs must opt in.\n if (\n overwriteOptions.detect404 === trueVar ||\n attr(scriptElement, \"detect-404\") == trueText\n ) {\n var detect404 = function () {\n if (\n !/\\b404\\b/.test(doc.title + \" \" + (doc.body && doc.body.textContent))\n )\n return;\n try {\n var request = new window.XMLHttpRequest();\n request.open(\"HEAD\", loc.href, trueVar);\n request.onload = function () {\n if (request.status === 404)\n sendEvent(\"page_404\", {\n url: loc.protocol + \"//\" + definedHostname + loc.pathname,\n status: 404,\n });\n };\n request.send();\n } catch (error) {}\n };\n if (doc.readyState === \"loading\")\n doc.addEventListener(\"DOMContentLoaded\", detect404, falseVar);\n else detect404();\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_proxy_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","keepalive","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","imageUrl","key","fetch","mode","credentials","catch","src","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","protocol","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","parts","querySearch","shift","pathKey","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","manualPageview","defaultPageview","defaultNamespace","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue","detect404","inlineEvent","element","target","parentNode","isForm","tagName","button","tag","toLowerCase","attributes","submitter","button_text","textContent","trim","title","request","XMLHttpRequest","open","href","status","url","send","readyState"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"proxy.source.js","sources":["proxy.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData, keepalive) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n var imageUrl =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n\n // Events must survive navigation without taking over links or forms.\n if (keepalive && window.fetch) {\n try {\n window\n .fetch(imageUrl, {\n keepalive: trueVar,\n mode: \"no-cors\",\n credentials: \"omit\",\n })\n .catch(function () {\n image.src = imageUrl;\n });\n return;\n } catch (error) {}\n }\n image.src = imageUrl;\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch = \"\";\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n var pathKey = path + querySearch;\n if (!path || lastSendPath == pathKey) return;\n\n lastSendPath = pathKey;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n var manualPageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n window[namespace + \"_\" + pageviewText] = manualPageview;\n var defaultPageview = defaultNamespace + \"_\" + pageviewText;\n if (!window[defaultPageview]) window[defaultPageview] = manualPageview;\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw, keepalive) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback,\n undefinedVar,\n keepalive\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback, keepalive) {\n sendEvent(event, metadata, callback, keepalive);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n\n var inlineEvent = function (event) {\n var element = event.target;\n while (\n element &&\n element !== doc &&\n (!element.getAttribute || attr(element, \"simple-event\") === null)\n )\n element = element.parentNode;\n\n if (!element || element === doc) return;\n var isForm = element.tagName === \"FORM\";\n var name = attr(element, \"simple-event\");\n if (!name || isForm !== (event.type === \"submit\")) return;\n\n var metadata = { tag: element.tagName.toLowerCase() };\n var attributes = element.attributes;\n for (var i = 0; i < attributes.length; i++) {\n var attribute = attributes[i];\n if (attribute.name.indexOf(\"data-simple-event-\") === 0)\n metadata[attribute.name.slice(18).replace(/-/g, \"_\")] =\n attribute.value;\n }\n if (isForm) {\n var button = event.submitter;\n metadata.button_text = button\n ? (button.textContent || button.value || \"\")\n .replace(/\\s+/g, \" \")\n .trim()\n .slice(0, 200)\n : \"\";\n }\n sendEvent(name, metadata, undefinedVar, trueVar);\n };\n\n doc.addEventListener(\"click\", inlineEvent, falseVar);\n doc.addEventListener(\"submit\", inlineEvent, falseVar);\n\n // 404 confirmation adds a request, so existing installs must opt in.\n if (\n overwriteOptions.detect404 === trueVar ||\n attr(scriptElement, \"detect-404\") == trueText\n ) {\n var detect404 = function () {\n if (\n !/\\b404\\b/.test(doc.title + \" \" + (doc.body && doc.body.textContent))\n )\n return;\n try {\n var request = new window.XMLHttpRequest();\n request.open(\"HEAD\", loc.href, trueVar);\n request.onload = function () {\n if (request.status === 404)\n sendEvent(\"page_404\", {\n url: loc.protocol + \"//\" + definedHostname + loc.pathname,\n status: 404,\n });\n };\n request.send();\n } catch (error) {}\n };\n if (doc.readyState === \"loading\")\n doc.addEventListener(\"DOMContentLoaded\", detect404, falseVar);\n else detect404();\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_proxy_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","keepalive","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","imageUrl","key","fetch","mode","credentials","catch","src","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","protocol","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","parts","querySearch","shift","pathKey","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","manualPageview","defaultPageview","defaultNamespace","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue","detect404","inlineEvent","element","target","parentNode","isForm","tagName","button","tag","toLowerCase","attributes","submitter","button_text","textContent","trim","title","request","XMLHttpRequest","open","href","status","url","send","readyState"],"mappings":"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"} \ No newline at end of file diff --git a/dist/latest/hello.js b/dist/latest/hello.js index 038ae7d9..737e36e2 100644 --- a/dist/latest/hello.js +++ b/dist/latest/hello.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-15; 1adb) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-15; 8a81) */ -!function(m,t,e,n,v){try{var g=undefined,y=!0,_=!1,r="true",a="https:",b="pageview",l="event",i="error",o=m.console,c="doNotTrack",w=m.navigator,s=m.location,O=s.host,u=m.document,f=w.userAgent,p="Not sending request ",d=p+"when ",E=_,h=encodeURIComponent,x=decodeURIComponent,M=JSON.stringify,S=m.addEventListener,k="https://queue."+e,q=u.documentElement||{},A="language",C="Height",D="scroll",$=w.userAgentData,j=D+C,R="offset"+C,H="client"+C,L="pagehide",N="platform",P="platformVersion",T="https://docs.simpleanalytics.com",U=0,I=/(bot|spider|crawl)/i.test(f)&&!/(cubot)/i.test(f),V=m.screen,B=u.currentScript||u.querySelector('script[src*="'+e+'"]');v=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){v("Error in your "+t+" function:",e)},z=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},W=function(t){return"string"==typeof t},G=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},J=function(t,e){return t&&t.getAttribute("data-"+e)},X=function(t){return Array.isArray(t)?t:W(t)&&t.length?t.split(/, ?/):[]},Y=function(t){return t&&t.constructor===Object},Z=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},it=function(t){return"function"==typeof t},ot="namespace",ct=t[ot]||J(B,ot)||"sa",st=function(t,e){var n=m[ct+"_metadata"];Y(n)&&(t=Z(t,n));var r=m[kt];if(!it(r))return kt&&v(kt+" not found, set window."+kt),t;try{return Z(t,r.call(m,Z(t,e)))}catch(a){F("metadata",a)}},ut=t.strictUtm||J(B,"strict-utm")==r,lt=function(i,t){tt=!i&&nt("q")?"":_;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");tt!==_&&0>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},it=function(t){return"function"==typeof t},ot="namespace",ct=t[ot]||J(B,ot)||"sa",st=function(t,e){var n=m[ct+"_metadata"];Y(n)&&(t=Z(t,n));var r=m[kt];if(!it(r))return kt&&v(kt+" not found, set window."+kt),t;try{return Z(t,r.call(m,Z(t,e)))}catch(a){F("metadata",a)}},ut=t.strictUtm||J(B,"strict-utm")==r,lt=function(i,t){tt=!i&&nt("q")?"":_;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");tt!==_&&0> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData, keepalive) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n var imageUrl =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n\n // Inline events must survive navigation without taking over links or forms.\n if (keepalive && window.fetch) {\n try {\n window\n .fetch(imageUrl, {\n keepalive: trueVar,\n mode: \"no-cors\",\n credentials: \"omit\",\n })\n .catch(function () {\n image.src = imageUrl;\n });\n return;\n } catch (error) {}\n }\n image.src = imageUrl;\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch = \"\";\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n var pathKey = path + querySearch;\n if (!path || lastSendPath == pathKey) return;\n\n lastSendPath = pathKey;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n var manualPageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n window[namespace + \"_\" + pageviewText] = manualPageview;\n var defaultPageview = defaultNamespace + \"_\" + pageviewText;\n if (!window[defaultPageview]) window[defaultPageview] = manualPageview;\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw, keepalive) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback,\n undefinedVar,\n keepalive\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n\n var inlineEvent = function (event) {\n var element = event.target;\n while (\n element &&\n element !== doc &&\n (!element.getAttribute || attr(element, \"simple-event\") === null)\n )\n element = element.parentNode;\n\n if (!element || element === doc) return;\n var isForm = element.tagName === \"FORM\";\n var name = attr(element, \"simple-event\");\n if (!name || isForm !== (event.type === \"submit\")) return;\n\n var metadata = { tag: element.tagName.toLowerCase() };\n var attributes = element.attributes;\n for (var i = 0; i < attributes.length; i++) {\n var attribute = attributes[i];\n if (attribute.name.indexOf(\"data-simple-event-\") === 0)\n metadata[attribute.name.slice(18).replace(/-/g, \"_\")] =\n attribute.value;\n }\n if (isForm) {\n var button = event.submitter;\n metadata.button_text = button\n ? (button.textContent || button.value || \"\")\n .replace(/\\s+/g, \" \")\n .trim()\n .slice(0, 200)\n : \"\";\n }\n sendEvent(name, metadata, undefinedVar, trueVar);\n };\n\n doc.addEventListener(\"click\", inlineEvent, falseVar);\n doc.addEventListener(\"submit\", inlineEvent, falseVar);\n\n // 404 confirmation adds a request, so existing installs must opt in.\n if (\n overwriteOptions.detect404 === trueVar ||\n attr(scriptElement, \"detect-404\") == trueText\n ) {\n var detect404 = function () {\n if (\n !/\\b404\\b/.test(doc.title + \" \" + (doc.body && doc.body.textContent))\n )\n return;\n try {\n var request = new window.XMLHttpRequest();\n request.open(\"HEAD\", loc.href, trueVar);\n request.onload = function () {\n if (request.status === 404)\n sendEvent(\"page_404\", {\n url: loc.protocol + \"//\" + definedHostname + loc.pathname,\n status: 404,\n });\n };\n request.send();\n } catch (error) {}\n };\n if (doc.readyState === \"loading\")\n doc.addEventListener(\"DOMContentLoaded\", detect404, falseVar);\n else detect404();\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"simpleanalyticscdn.com\",\n \"queue.\",\n \"cdn_hello_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","protocol","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","keepalive","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","imageUrl","key","fetch","mode","credentials","catch","src","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","parts","querySearch","shift","pathKey","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","manualPageview","defaultPageview","defaultNamespace","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue","detect404","inlineEvent","element","target","parentNode","isForm","tagName","button","tag","toLowerCase","attributes","submitter","button_text","textContent","trim","title","request","XMLHttpRequest","open","href","status","url","send","readyState"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"hello.source.js","sources":["hello.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData, keepalive) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n var imageUrl =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n\n // Events must survive navigation without taking over links or forms.\n if (keepalive && window.fetch) {\n try {\n window\n .fetch(imageUrl, {\n keepalive: trueVar,\n mode: \"no-cors\",\n credentials: \"omit\",\n })\n .catch(function () {\n image.src = imageUrl;\n });\n return;\n } catch (error) {}\n }\n image.src = imageUrl;\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch = \"\";\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n var pathKey = path + querySearch;\n if (!path || lastSendPath == pathKey) return;\n\n lastSendPath = pathKey;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n var manualPageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n window[namespace + \"_\" + pageviewText] = manualPageview;\n var defaultPageview = defaultNamespace + \"_\" + pageviewText;\n if (!window[defaultPageview]) window[defaultPageview] = manualPageview;\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw, keepalive) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback,\n undefinedVar,\n keepalive\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback, keepalive) {\n sendEvent(event, metadata, callback, keepalive);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n\n var inlineEvent = function (event) {\n var element = event.target;\n while (\n element &&\n element !== doc &&\n (!element.getAttribute || attr(element, \"simple-event\") === null)\n )\n element = element.parentNode;\n\n if (!element || element === doc) return;\n var isForm = element.tagName === \"FORM\";\n var name = attr(element, \"simple-event\");\n if (!name || isForm !== (event.type === \"submit\")) return;\n\n var metadata = { tag: element.tagName.toLowerCase() };\n var attributes = element.attributes;\n for (var i = 0; i < attributes.length; i++) {\n var attribute = attributes[i];\n if (attribute.name.indexOf(\"data-simple-event-\") === 0)\n metadata[attribute.name.slice(18).replace(/-/g, \"_\")] =\n attribute.value;\n }\n if (isForm) {\n var button = event.submitter;\n metadata.button_text = button\n ? (button.textContent || button.value || \"\")\n .replace(/\\s+/g, \" \")\n .trim()\n .slice(0, 200)\n : \"\";\n }\n sendEvent(name, metadata, undefinedVar, trueVar);\n };\n\n doc.addEventListener(\"click\", inlineEvent, falseVar);\n doc.addEventListener(\"submit\", inlineEvent, falseVar);\n\n // 404 confirmation adds a request, so existing installs must opt in.\n if (\n overwriteOptions.detect404 === trueVar ||\n attr(scriptElement, \"detect-404\") == trueText\n ) {\n var detect404 = function () {\n if (\n !/\\b404\\b/.test(doc.title + \" \" + (doc.body && doc.body.textContent))\n )\n return;\n try {\n var request = new window.XMLHttpRequest();\n request.open(\"HEAD\", loc.href, trueVar);\n request.onload = function () {\n if (request.status === 404)\n sendEvent(\"page_404\", {\n url: loc.protocol + \"//\" + definedHostname + loc.pathname,\n status: 404,\n });\n };\n request.send();\n } catch (error) {}\n };\n if (doc.readyState === \"loading\")\n doc.addEventListener(\"DOMContentLoaded\", detect404, falseVar);\n else detect404();\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"simpleanalyticscdn.com\",\n \"queue.\",\n \"cdn_hello_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","protocol","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","keepalive","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","imageUrl","key","fetch","mode","credentials","catch","src","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","parts","querySearch","shift","pathKey","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","manualPageview","defaultPageview","defaultNamespace","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue","detect404","inlineEvent","element","target","parentNode","isForm","tagName","button","tag","toLowerCase","attributes","submitter","button_text","textContent","trim","title","request","XMLHttpRequest","open","href","status","url","send","readyState"],"mappings":"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"} \ No newline at end of file diff --git a/dist/latest/latest.dev.js b/dist/latest/latest.dev.js index ac6344b0..a756fd62 100644 --- a/dist/latest/latest.dev.js +++ b/dist/latest/latest.dev.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-15; 0605; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-15; 0e2c; v12) */ /* eslint-env browser */ (function ( @@ -327,7 +327,7 @@ "&time=" + Date.now(); - // Inline events must survive navigation without taking over links or forms. + // Events must survive navigation without taking over links or forms. if (keepalive && window.fetch) { try { window @@ -981,8 +981,8 @@ } }; - var defaultEventFunc = function (event, metadata, callback) { - sendEvent(event, metadata, callback); + var defaultEventFunc = function (event, metadata, callback, keepalive) { + sendEvent(event, metadata, callback, keepalive); }; // Set default function if user didn't define a function diff --git a/dist/latest/latest.js b/dist/latest/latest.js index b84ff5bd..fb7ceaa1 100644 --- a/dist/latest/latest.js +++ b/dist/latest/latest.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-15; 0ebb; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-15; dfc8; v12) */ -!function(m,t,e,n,v){try{var g=undefined,y=!0,_=!1,r="true",a="https:",b="pageview",l="event",i="error",o=m.console,c="doNotTrack",w=m.navigator,s=m.location,O=s.host,u=m.document,f=w.userAgent,p="Not sending request ",d=p+"when ",E=_,h=encodeURIComponent,x=decodeURIComponent,M=JSON.stringify,S=m.addEventListener,k="https://queue."+e,q=u.documentElement||{},A="language",C="Height",D="scroll",$=w.userAgentData,j=D+C,R="offset"+C,H="client"+C,L="pagehide",N="platform",P="platformVersion",T="https://docs.simpleanalytics.com",U=0,I=/(bot|spider|crawl)/i.test(f)&&!/(cubot)/i.test(f),V=m.screen,B=u.currentScript||u.querySelector('script[src*="'+e+'"]');v=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){v("Error in your "+t+" function:",e)},z=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},W=function(t){return"string"==typeof t},G=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},J=function(t,e){return t&&t.getAttribute("data-"+e)},X=function(t){return Array.isArray(t)?t:W(t)&&t.length?t.split(/, ?/):[]},Y=function(t){return t&&t.constructor===Object},Z=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},it=function(t){return"function"==typeof t},ot="namespace",ct=t[ot]||J(B,ot)||"sa",st=function(t,e){var n=m[ct+"_metadata"];Y(n)&&(t=Z(t,n));var r=m[kt];if(!it(r))return kt&&v(kt+" not found, set window."+kt),t;try{return Z(t,r.call(m,Z(t,e)))}catch(a){F("metadata",a)}},ut=t.strictUtm||J(B,"strict-utm")==r,lt=function(i,t){tt=!i&&nt("q")?"":_;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");tt!==_&&0>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},it=function(t){return"function"==typeof t},ot="namespace",ct=t[ot]||J(B,ot)||"sa",st=function(t,e){var n=m[ct+"_metadata"];Y(n)&&(t=Z(t,n));var r=m[kt];if(!it(r))return kt&&v(kt+" not found, set window."+kt),t;try{return Z(t,r.call(m,Z(t,e)))}catch(a){F("metadata",a)}},ut=t.strictUtm||J(B,"strict-utm")==r,lt=function(i,t){tt=!i&&nt("q")?"":_;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");tt!==_&&0> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData, keepalive) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n var imageUrl =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n\n // Inline events must survive navigation without taking over links or forms.\n if (keepalive && window.fetch) {\n try {\n window\n .fetch(imageUrl, {\n keepalive: trueVar,\n mode: \"no-cors\",\n credentials: \"omit\",\n })\n .catch(function () {\n image.src = imageUrl;\n });\n return;\n } catch (error) {}\n }\n image.src = imageUrl;\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch = \"\";\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n var pathKey = path + querySearch;\n if (!path || lastSendPath == pathKey) return;\n\n lastSendPath = pathKey;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n var manualPageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n window[namespace + \"_\" + pageviewText] = manualPageview;\n var defaultPageview = defaultNamespace + \"_\" + pageviewText;\n if (!window[defaultPageview]) window[defaultPageview] = manualPageview;\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw, keepalive) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback,\n undefinedVar,\n keepalive\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n\n var inlineEvent = function (event) {\n var element = event.target;\n while (\n element &&\n element !== doc &&\n (!element.getAttribute || attr(element, \"simple-event\") === null)\n )\n element = element.parentNode;\n\n if (!element || element === doc) return;\n var isForm = element.tagName === \"FORM\";\n var name = attr(element, \"simple-event\");\n if (!name || isForm !== (event.type === \"submit\")) return;\n\n var metadata = { tag: element.tagName.toLowerCase() };\n var attributes = element.attributes;\n for (var i = 0; i < attributes.length; i++) {\n var attribute = attributes[i];\n if (attribute.name.indexOf(\"data-simple-event-\") === 0)\n metadata[attribute.name.slice(18).replace(/-/g, \"_\")] =\n attribute.value;\n }\n if (isForm) {\n var button = event.submitter;\n metadata.button_text = button\n ? (button.textContent || button.value || \"\")\n .replace(/\\s+/g, \" \")\n .trim()\n .slice(0, 200)\n : \"\";\n }\n sendEvent(name, metadata, undefinedVar, trueVar);\n };\n\n doc.addEventListener(\"click\", inlineEvent, falseVar);\n doc.addEventListener(\"submit\", inlineEvent, falseVar);\n\n // 404 confirmation adds a request, so existing installs must opt in.\n if (\n overwriteOptions.detect404 === trueVar ||\n attr(scriptElement, \"detect-404\") == trueText\n ) {\n var detect404 = function () {\n if (\n !/\\b404\\b/.test(doc.title + \" \" + (doc.body && doc.body.textContent))\n )\n return;\n try {\n var request = new window.XMLHttpRequest();\n request.open(\"HEAD\", loc.href, trueVar);\n request.onload = function () {\n if (request.status === 404)\n sendEvent(\"page_404\", {\n url: loc.protocol + \"//\" + definedHostname + loc.pathname,\n status: 404,\n });\n };\n request.send();\n } catch (error) {}\n };\n if (doc.readyState === \"loading\")\n doc.addEventListener(\"DOMContentLoaded\", detect404, falseVar);\n else detect404();\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"simpleanalyticscdn.com\",\n \"queue.\",\n \"cdn_latest_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","protocol","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","keepalive","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","imageUrl","key","fetch","mode","credentials","catch","src","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","parts","querySearch","shift","pathKey","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","manualPageview","defaultPageview","defaultNamespace","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue","detect404","inlineEvent","element","target","parentNode","isForm","tagName","button","tag","toLowerCase","attributes","submitter","button_text","textContent","trim","title","request","XMLHttpRequest","open","href","status","url","send","readyState"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"latest.source.js","sources":["latest.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData, keepalive) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n var imageUrl =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n\n // Events must survive navigation without taking over links or forms.\n if (keepalive && window.fetch) {\n try {\n window\n .fetch(imageUrl, {\n keepalive: trueVar,\n mode: \"no-cors\",\n credentials: \"omit\",\n })\n .catch(function () {\n image.src = imageUrl;\n });\n return;\n } catch (error) {}\n }\n image.src = imageUrl;\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch = \"\";\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n var pathKey = path + querySearch;\n if (!path || lastSendPath == pathKey) return;\n\n lastSendPath = pathKey;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n var manualPageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n window[namespace + \"_\" + pageviewText] = manualPageview;\n var defaultPageview = defaultNamespace + \"_\" + pageviewText;\n if (!window[defaultPageview]) window[defaultPageview] = manualPageview;\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw, keepalive) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback,\n undefinedVar,\n keepalive\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback, keepalive) {\n sendEvent(event, metadata, callback, keepalive);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n\n var inlineEvent = function (event) {\n var element = event.target;\n while (\n element &&\n element !== doc &&\n (!element.getAttribute || attr(element, \"simple-event\") === null)\n )\n element = element.parentNode;\n\n if (!element || element === doc) return;\n var isForm = element.tagName === \"FORM\";\n var name = attr(element, \"simple-event\");\n if (!name || isForm !== (event.type === \"submit\")) return;\n\n var metadata = { tag: element.tagName.toLowerCase() };\n var attributes = element.attributes;\n for (var i = 0; i < attributes.length; i++) {\n var attribute = attributes[i];\n if (attribute.name.indexOf(\"data-simple-event-\") === 0)\n metadata[attribute.name.slice(18).replace(/-/g, \"_\")] =\n attribute.value;\n }\n if (isForm) {\n var button = event.submitter;\n metadata.button_text = button\n ? (button.textContent || button.value || \"\")\n .replace(/\\s+/g, \" \")\n .trim()\n .slice(0, 200)\n : \"\";\n }\n sendEvent(name, metadata, undefinedVar, trueVar);\n };\n\n doc.addEventListener(\"click\", inlineEvent, falseVar);\n doc.addEventListener(\"submit\", inlineEvent, falseVar);\n\n // 404 confirmation adds a request, so existing installs must opt in.\n if (\n overwriteOptions.detect404 === trueVar ||\n attr(scriptElement, \"detect-404\") == trueText\n ) {\n var detect404 = function () {\n if (\n !/\\b404\\b/.test(doc.title + \" \" + (doc.body && doc.body.textContent))\n )\n return;\n try {\n var request = new window.XMLHttpRequest();\n request.open(\"HEAD\", loc.href, trueVar);\n request.onload = function () {\n if (request.status === 404)\n sendEvent(\"page_404\", {\n url: loc.protocol + \"//\" + definedHostname + loc.pathname,\n status: 404,\n });\n };\n request.send();\n } catch (error) {}\n };\n if (doc.readyState === \"loading\")\n doc.addEventListener(\"DOMContentLoaded\", detect404, falseVar);\n else detect404();\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"simpleanalyticscdn.com\",\n \"queue.\",\n \"cdn_latest_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","protocol","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","keepalive","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","imageUrl","key","fetch","mode","credentials","catch","src","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","parts","querySearch","shift","pathKey","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","manualPageview","defaultPageview","defaultNamespace","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue","detect404","inlineEvent","element","target","parentNode","isForm","tagName","button","tag","toLowerCase","attributes","submitter","button_text","textContent","trim","title","request","XMLHttpRequest","open","href","status","url","send","readyState"],"mappings":"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"} \ No newline at end of file diff --git a/src/auto-events.js b/src/auto-events.js index 499a6710..5095d86f 100644 --- a/src/auto-events.js +++ b/src/auto-events.js @@ -78,18 +78,6 @@ var saAutomatedLink = function saAutomatedLink(element, type) { try { if (!element) return log("no element found"); - var sent = false; - - var callback = function () { - if ( - type !== "phone" && - !sent && - (!element.hasAttribute("target") || - element.getAttribute("target") === "_self") - ) - document.location = element.getAttribute("href"); - sent = true; - }; if (window[saGlobal] && window[saGlobal + "_loaded"]) { var hostname = element.hostname; @@ -143,16 +131,11 @@ "_" + event.replace(/[^a-z0-9]+/gi, "_").replace(/(^_+|_+$)/g, ""); - window[saGlobal](clean, metadata, callback); + window[saGlobal](clean, metadata, function () {}, true); log("collected " + clean); - - return type === "email" || type === "phone" - ? callback() - : window.setTimeout(callback, 5000); } else { log(saGlobal + " is not defined", "warn"); - return callback(); } } catch (error) { log(error.message, "warn"); @@ -161,7 +144,7 @@ window.saAutomatedLink = saAutomatedLink; - function collectLink(link, onclick) { + function collectLink(link) { if (link.hasAttribute("data-simple-event")) return; var collect = false; @@ -195,21 +178,9 @@ if (!collect) return; - if (onclick) { - var onClickAttribute = "saAutomatedLink(this, '" + collect + "');"; - - if ( - !link.hasAttribute("target") || - link.getAttribute("target") === "_self" - ) - onClickAttribute += " return false;"; - - link.setAttribute("onclick", onClickAttribute); - } else { - link.addEventListener("click", function () { - saAutomatedLink(this, collect); - }); - } + link.addEventListener("click", function () { + saAutomatedLink(this, collect); + }); } function onDOMContentLoaded() { @@ -224,16 +195,7 @@ // Skip links that don't have an href if (!href) continue; - // We don't want to overwrite website behaviour so we check for the onclick attribute - if ( - !link.getAttribute("onclick") && - !/^mailto:/.test(href) && - !/^tel:/.test(href) - ) { - collectLink(link, true); - } else { - collectLink(link, false); - } + collectLink(link); } } catch (error) { log(error.message, "warn"); diff --git a/src/default.js b/src/default.js index f59c9e5d..cfd5b0be 100644 --- a/src/default.js +++ b/src/default.js @@ -369,7 +369,7 @@ Date.now(); /** if events **/ - // Inline events must survive navigation without taking over links or forms. + // Events must survive navigation without taking over links or forms. if (keepalive && window.fetch) { try { window @@ -1117,8 +1117,8 @@ } }; - var defaultEventFunc = function (event, metadata, callback) { - sendEvent(event, metadata, callback); + var defaultEventFunc = function (event, metadata, callback, keepalive) { + sendEvent(event, metadata, callback, keepalive); }; // Set default function if user didn't define a function From 6af229d392542f3c82589c4146248d12e83003ea Mon Sep 17 00:00:00 2001 From: "simple-analytics-ai[bot]" <313929673+simple-analytics-ai[bot]@users.noreply.github.com> Date: Fri, 16 Oct 2026 00:00:38 +0200 Subject: [PATCH 58/62] Count Cloudflare challenge arrivals as unique (#112) * Recognize Cloudflare challenge markers only in query names Requested in the compatibility review: avoid path false positives and inspect raw query-only markers. Reuse the referrer helper without sending raw query values or adding bytes to light builds. Refs #107 * Refresh the Cloudflare compatibility fix on current v12 Requested: make issue #107 mergeable while preserving manual-query overrides, browser-query fallback, and existing filtering. Resolve the older Cloudflare branch against current v12 source and regenerate its bundles, preserving inline events and the merged phone-click fix. All 45 unit tests and 24 additional query payload checks pass. Refs #107 * Use the requested simple Cloudflare marker check on latest v12 User asked to replace the parameter-name regex with a literal ?__cf_ check, omit the extra same-URL guard, and merge current v12 into #112. Preserve the latest modified-click, namespace, manual-query, and phone-click fixes. Rebuild matching tracker bundles while retaining unrelated pinned auto-events artifacts. All 53 unit tests, 33 payload checks, changed JavaScript formatting, and diff checks pass. Manual-query overrides and location.search fallback remain intact. Refs #107 * Keep the simple Cloudflare check working after campaign parameters User requested a simple marker check and current v12 merge. Address review by accepting both ?__cf_ and appended &__cf_ with the short /[?&]__cf_/ expression, retaining the requested broad matching and omitting the declined same-URL guard. Update the existing regression and matching bundles. All 53 unit tests and 36 payload checks pass. Current v12 remains included. Refs #107 --------- Co-authored-by: Simple Analytics Codex Co-authored-by: simple-analytics-ai[bot] <313929673+simple-analytics-ai[bot]@users.noreply.github.com> --- dist/latest/cloudflare.js | 20 ++++++---- dist/latest/custom/app.js | 4 +- dist/latest/custom/app.js.map | 2 +- dist/latest/custom/e.js | 4 +- dist/latest/custom/e.js.map | 2 +- dist/latest/custom/latest.dev.js | 20 ++++++---- dist/latest/custom/latest.js | 4 +- dist/latest/custom/latest.js.map | 2 +- dist/latest/custom/light.js | 2 +- dist/latest/custom/light.js.map | 2 +- dist/latest/custom/proxy.js | 4 +- dist/latest/custom/proxy.js.map | 2 +- dist/latest/hello.js | 4 +- dist/latest/hello.js.map | 2 +- dist/latest/latest.dev.js | 20 ++++++---- dist/latest/latest.js | 4 +- dist/latest/latest.js.map | 2 +- dist/latest/light.js | 2 +- dist/latest/light.js.map | 2 +- dist/v12/app.js | 4 +- dist/v12/app.js.map | 2 +- dist/v12/custom/app.js | 4 +- dist/v12/custom/app.js.map | 2 +- dist/v12/custom/light.js | 2 +- dist/v12/custom/light.js.map | 2 +- dist/v12/custom/proxy.js | 4 +- dist/v12/custom/proxy.js.map | 2 +- dist/v12/light.js | 2 +- dist/v12/light.js.map | 2 +- src/default.js | 20 ++++++---- test/unit/pageview.test.js | 64 ++++++++++++++++++++++++++++++++ 31 files changed, 148 insertions(+), 66 deletions(-) diff --git a/dist/latest/cloudflare.js b/dist/latest/cloudflare.js index 6219fbc1..6576d28e 100644 --- a/dist/latest/cloudflare.js +++ b/dist/latest/cloudflare.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-15; 2af5; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-15; 5f31; v12) */ /* eslint-env browser */ (function ( @@ -543,13 +543,17 @@ var page = {}; var lastSendPath; - var getReferrer = function () { + var getReferrer = function (raw) { // Customers can overwrite their referrer, here we check for that - var overwrittenReferrer = - overwriteOptions.referrer || attr(scriptElement, "referrer"); + var referrer = + overwriteOptions.referrer || + attr(scriptElement, "referrer") || + doc.referrer || + ""; + if (raw) return referrer; return ( - (overwrittenReferrer || doc.referrer || "") + referrer .replace(locationHostname, definedHostname) .replace(/^https?:\/\/((m|l|w{2,3}([0-9]+)?)\.)?([^?#]+)(.*)$/, "$4") .replace(/^([^/]+)$/, "$1") || undefinedVar @@ -800,11 +804,11 @@ currentReferrerHostname == locationHostname : falseVar; - // We set unique variable based on pushstate or back navigation, if no match we check the referrer + // Only the first pageview can use a Cloudflare referrer as a unique arrival. page.unique = - /__cf_/.test(getReferrer()) || isPushState || userNavigated + isPushState || userNavigated ? falseVar - : !sameSite; + : !sameSite || (!pages && /[?&]__cf_/.test(getReferrer(trueVar))); metadata = appendMetadata(metadata, { type: pageviewText, diff --git a/dist/latest/custom/app.js b/dist/latest/custom/app.js index 1f5b3a0e..541e6121 100644 --- a/dist/latest/custom/app.js +++ b/dist/latest/custom/app.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-15; 0372; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-15; f441; v12) */ -!function(v,t,e,n,m){try{var g=undefined,y=!0,_=!1,r="true",a="https:",b="pageview",l="event",i="error",o=v.console,c="doNotTrack",w=v.navigator,s=v.location,O=s.host,u=v.document,p=w.userAgent,f="Not sending request ",d=f+"when ",x=_,h=encodeURIComponent,E=decodeURIComponent,M=JSON.stringify,S=v.addEventListener,k="https://"+e,A=u.documentElement||{},q="language",C="Height",D="scroll",$=w.userAgentData,j=D+C,H="offset"+C,R="client"+C,L="pagehide",N="platform",P="platformVersion",T="https://docs.simpleanalytics.com",U=0,I=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),V=v.screen,B=u.currentScript||u.querySelector('script[src*="'+e+'"]');m=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){m("Error in your "+t+" function:",e)},z=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},W=function(t){return"string"==typeof t},G=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},J=function(t,e){return t&&t.getAttribute("data-"+e)},X=function(t){return Array.isArray(t)?t:W(t)&&t.length?t.split(/, ?/):[]},Y=function(t){return t&&t.constructor===Object},Z=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},it=function(t){return"function"==typeof t},ot="namespace",ct=t[ot]||J(B,ot)||"sa",st=function(t,e){var n=v[ct+"_metadata"];Y(n)&&(t=Z(t,n));var r=v[kt];if(!it(r))return kt&&m(kt+" not found, set window."+kt),t;try{return Z(t,r.call(v,Z(t,e)))}catch(a){F("metadata",a)}},ut=t.strictUtm||J(B,"strict-utm")==r,lt=function(i,t){tt=!i&&nt("q")?"":_;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");tt!==_&&0"); +!function(v,n,e,r,m){try{var g=undefined,y=!0,_=!1,t="true",a="https:",b="pageview",l="event",i="error",o=v.console,c="doNotTrack",w=v.navigator,s=v.location,O=s.host,u=v.document,p=w.userAgent,f="Not sending request ",d=f+"when ",x=_,h=encodeURIComponent,E=decodeURIComponent,M=JSON.stringify,S=v.addEventListener,k="https://"+e,A=u.documentElement||{},q="language",C="Height",D="scroll",$=w.userAgentData,j=D+C,H="offset"+C,R="client"+C,L="pagehide",N="platform",P="platformVersion",T="https://docs.simpleanalytics.com",U=0,I=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),V=v.screen,B=u.currentScript||u.querySelector('script[src*="'+e+'"]');m=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){m("Error in your "+t+" function:",e)},z=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},W=function(t){return"string"==typeof t},G=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},J=function(t,e){return t&&t.getAttribute("data-"+e)},X=function(t){return Array.isArray(t)?t:W(t)&&t.length?t.split(/, ?/):[]},Y=function(t){return t&&t.constructor===Object},Z=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},it=function(t){return"function"==typeof t},ot="namespace",ct=n[ot]||J(B,ot)||"sa",st=function(t,e){var n=v[ct+"_metadata"];Y(n)&&(t=Z(t,n));var r=v[kt];if(!it(r))return kt&&m(kt+" not found, set window."+kt),t;try{return Z(t,r.call(v,Z(t,e)))}catch(a){F("metadata",a)}},ut=n.strictUtm||J(B,"strict-utm")==t,lt=function(i,t){tt=!i&&nt("q")?"":_;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");tt!==_&&0"); //# sourceMappingURL=app.js.map \ No newline at end of file diff --git a/dist/latest/custom/app.js.map b/dist/latest/custom/app.js.map index 5818a0d9..a83e8755 100644 --- a/dist/latest/custom/app.js.map +++ b/dist/latest/custom/app.js.map @@ -1 +1 @@ -{"version":3,"file":"app.source.js","sources":["app.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData, keepalive) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n var imageUrl =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n\n // Events must survive navigation without taking over links or forms.\n if (keepalive && window.fetch) {\n try {\n window\n .fetch(imageUrl, {\n keepalive: trueVar,\n mode: \"no-cors\",\n credentials: \"omit\",\n })\n .catch(function () {\n image.src = imageUrl;\n });\n return;\n } catch (error) {}\n }\n image.src = imageUrl;\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch = \"\";\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n var pathKey = path + querySearch;\n if (!path || lastSendPath == pathKey) return;\n\n lastSendPath = pathKey;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n var manualPageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n window[namespace + \"_\" + pageviewText] = manualPageview;\n var defaultPageview = defaultNamespace + \"_\" + pageviewText;\n if (!window[defaultPageview]) window[defaultPageview] = manualPageview;\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw, keepalive) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback,\n undefinedVar,\n keepalive\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback, keepalive) {\n sendEvent(event, metadata, callback, keepalive);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n\n var inlineEvent = function (event) {\n var element = event.target;\n while (\n element &&\n element !== doc &&\n (!element.getAttribute || attr(element, \"simple-event\") === null)\n )\n element = element.parentNode;\n\n if (!element || element === doc) return;\n var isForm = element.tagName === \"FORM\";\n var name = attr(element, \"simple-event\");\n if (!name || isForm !== (event.type === \"submit\")) return;\n\n var metadata = { tag: element.tagName.toLowerCase() };\n var attributes = element.attributes;\n for (var i = 0; i < attributes.length; i++) {\n var attribute = attributes[i];\n if (attribute.name.indexOf(\"data-simple-event-\") === 0)\n metadata[attribute.name.slice(18).replace(/-/g, \"_\")] =\n attribute.value;\n }\n if (isForm) {\n var button = event.submitter;\n metadata.button_text = button\n ? (button.textContent || button.value || \"\")\n .replace(/\\s+/g, \" \")\n .trim()\n .slice(0, 200)\n : \"\";\n }\n sendEvent(name, metadata, undefinedVar, trueVar);\n };\n\n doc.addEventListener(\"click\", inlineEvent, falseVar);\n doc.addEventListener(\"submit\", inlineEvent, falseVar);\n\n // 404 confirmation adds a request, so existing installs must opt in.\n if (\n overwriteOptions.detect404 === trueVar ||\n attr(scriptElement, \"detect-404\") == trueText\n ) {\n var detect404 = function () {\n if (\n !/\\b404\\b/.test(doc.title + \" \" + (doc.body && doc.body.textContent))\n )\n return;\n try {\n var request = new window.XMLHttpRequest();\n request.open(\"HEAD\", loc.href, trueVar);\n request.onload = function () {\n if (request.status === 404)\n sendEvent(\"page_404\", {\n url: loc.protocol + \"//\" + definedHostname + loc.pathname,\n status: 404,\n });\n };\n request.send();\n } catch (error) {}\n };\n if (doc.readyState === \"loading\")\n doc.addEventListener(\"DOMContentLoaded\", detect404, falseVar);\n else detect404();\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_app_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","keepalive","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","imageUrl","key","fetch","mode","credentials","catch","src","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","protocol","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","parts","querySearch","shift","pathKey","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","manualPageview","defaultPageview","defaultNamespace","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue","detect404","inlineEvent","element","target","parentNode","isForm","tagName","button","tag","toLowerCase","attributes","submitter","button_text","textContent","trim","title","request","XMLHttpRequest","open","href","status","url","send","readyState"],"mappings":";;CAEA,SACEA,EACAC,EACAC,EAIAC,EACAC,GAEA,IAQE,IAAIC,EAAeC,UACfC,GAAU,EACVC,GAAW,EACXC,EAAW,OACXC,EAAQ,SACRC,EAAe,WACfC,EAAY,QACZC,EAAY,QAGZC,EAAMd,EAAOe,QACbC,EAAa,aACbC,EAAMjB,EAAOkB,UACbC,EAAMnB,EAAOoB,SACbC,EAAmBF,EAAIG,KACvBC,EAAMvB,EAAOwB,SACbC,EAAYR,EAAIQ,UAChBC,EAAa,uBACbC,EAAiBD,EAAa,QAC9BE,EAA2BpB,EAC3BqB,EAAyBC,mBACzBC,EAAyBC,mBACzBC,EAAYC,KAAKD,UAEjBE,EAAuBnC,EAAOoC,iBAC9BC,EAhBW3B,WAgB4BR,EACvCoC,EAAkBf,EAAIe,iBAAmB,GACzCC,EAAW,WACXC,EAAS,SAETC,EAAS,SACTC,EAASzB,EAAI0B,cACbC,EAAeH,EAASD,EACxBK,EAAe,SAAWL,EAC1BM,EAAe,SAAWN,EAE1BO,EAAW,WACXC,EAAe,WACfC,EAAsB,kBACtBC,EAAU,mCACVC,EAAQ,EACRC,EACF,sBAAsBC,KAAK5B,KAAe,WAAW4B,KAAK5B,GACxD6B,EAAStD,EAAOsD,OAIhBC,EACFhC,EAAIiC,eAAiBjC,EAAIkC,cAAc,gBAAkBvD,EAAU,MAOrEE,EAAO,WAEL,IAAIsD,EAAO,GAAGC,MAAMC,KAAKC,WAOzB,OAJAH,EAAKI,QAAQ,qBAINC,SAASC,UAAUC,MAAML,KAAK9C,EAAIV,KAAMU,EAAK4C,IAGtD,IAAIQ,EAAiB,SAAUC,EAAMC,GACnChE,EAAK,iBAAmB+D,EAAO,aAAcC,IAG3CC,EAAU,SAAUC,EAAKC,GAC3B,OAAOC,OAAOR,UAAUS,eAAeb,KAAKU,EAAKC,IAG/CG,EAAW,SAAUC,GACvB,MAAwB,iBAAVA,GAGZC,EAAc,SAAUC,GAC1B,OAAOA,EAAKC,QAAQ,sBAAuB,SAGzCC,EAAO,SAAUxB,EAAeyB,GAClC,OAAOzB,GAAiBA,EAAc0B,aAAa,QAAUD,IAG3DE,EAA+B,SAAUC,GAC3C,OAAOC,MAAMC,QAAQF,GACjBA,EACAT,EAASS,IAAQA,EAAIG,OACnBH,EAAII,MAAM,OACV,IAGJC,EAAW,SAAUC,GACvB,OAAOA,GAAUA,EAAOC,cAAgBlB,QAGtCmB,EAAS,WAGX,IAFA,IAAIC,EAAK,GACLC,EAAMhC,UACDiC,EAAQ,EAAGA,EAAQD,EAAIP,OAAQQ,IAAS,CAC/C,IAAIC,EAAaF,EAAIC,GACrB,GAAIN,EAASO,GACX,IAAK,IAAIC,KAAWD,EACd1B,EAAQ0B,EAAYC,KACtBJ,EAAGI,GAAWD,EAAWC,IAKjC,OAAOJ,GAGLK,EAAWjG,EAAOkG,YAClBC,EAAcF,GAAYzB,OAAO4B,KAAKnG,GAAkBqF,OAG5DrF,EAAmB0F,EAAO1F,EAAkBgG,GAExCE,GAAa/F,EAAK,WAAYH,GAGlC,IA+EIoG,GA/EAC,GAAgBpB,EAClBjF,EAAiBqG,eAAiBvB,EAAKxB,EAAe,mBAGpDgD,GAAwB,SAAUC,GAEpC,OAGgB,IAFdF,GAAcG,OAAO,SAAU5B,GAC7B,OAAO,IAAI6B,OAAO,IAAMF,GAAoBnD,KAAKwB,KAChDS,QAIHqB,GAAMC,KAAKD,IAEXE,GAAO,WACT,IAAIC,EAAe9G,EAAO+G,QAAU/G,EAAOgH,SACvCC,EAAY,CAAC,MAAQ,KAAO,KAAO,KAAO,KAC1CC,EAAY,SAEhB,IACE,OAAOD,EAAUnC,QAAQoC,EAAW,SAAUC,GAC5C,OACEA,EACCL,EAAaM,gBAAgB,IAAIC,WAAW,IAAI,GAC9C,IAAOF,EAAI,GACdG,SAAS,MAEb,MAAOlD,GACP,OAAO6C,EAAUnC,QAAQoC,EAAW,SAAUC,GAC5C,IAAII,EAAqB,GAAhBC,KAAKC,SAAiB,EAE/B,OADMN,EAAI,EAAII,EAAS,EAAJA,EAAW,GACrBD,SAAS,QAKpBI,GAAa,SAAUC,GACzB,MAAsB,mBAARA,GAIZC,GAAgB,YAChBC,GACF5H,EAAiB2H,KACjB7C,EAAKxB,EAAeqE,KAy3BxB,KAt3BME,GAAiB,SAAUC,EAAUC,GACvC,IAAIC,EAAiBjI,EAAO6H,GAAY,aACpCrC,EAASyC,KAAiBF,EAAWpC,EAAOoC,EAAUE,IAC1D,IAAIC,EAA4BlI,EAAOmI,IACvC,IAAKT,GAAWQ,GAKd,OAJIC,IACF/H,EACE+H,GAAoB,0BAA4BA,IAE7CJ,EAET,IACE,OAAOpC,EACLoC,EACAG,EAA0BtE,KAAK5D,EAAQ2F,EAAOoC,EAAUC,KAE1D,MAAO5D,GACPF,EAAe,WAAYE,KAU3BgE,GACFnI,EAAiBmI,WACjBrD,EAAKxB,EAAe,eAAiB9C,EAInC4H,GAAiB,SAAUC,EAAcC,GAC3ClC,IAAKiC,GAAgB/B,GAAsB,KAAO,GAAK/F,EACvD,IAAIgI,GAAKD,GAAmBpH,EAAIsH,QAC7B9E,MAAM,GACN4B,MAAM,KACNkB,OAAO,SAAUiC,GAChB,IAAIC,EAAID,EAASE,QAAQ,KACrBvC,KAAM7F,GAAgB,EAAJmI,GAASD,EAAS/E,MAAMgF,EAAI,KAChDtC,KAAMA,GAAI,IAAM,IAAMqC,EAAS/E,MAAM,EAAGgF,IAE1C,IAAIE,EAASP,IAAiB/B,GAAsB,MAEhDuC,EAAkBC,GAAYC,IAAIpE,GAAaqE,KAAK,KACpDC,EAAQL,EACR,KAAOC,EAAkB,KACzB,YACCV,GAAY,GAAK,KAClB,yCACCA,GAAY,GAAK,QAClB,IACAU,EACA,KACJ,OAAID,IAAWE,GAAYzD,OAAe9E,EAInC,IAAIkG,OAAOwC,EAAO,KAAK7F,KAAKqF,KAEpCO,KAAK,KAGR,OADA5C,GAAIA,IAAKhG,EACFmI,GAAKnI,GA+BV8I,GAAiBtB,GAAY,UACjC,GAAI7H,EAAOmJ,KAAmB5I,EAAS,OAAOH,EAAKsB,EAAa,SAChE1B,EAAOoJ,gBAAkB7I,EACzBP,EAAOmJ,IAAkB5I,EAOzB,IAAI8I,GAAW,SAAUrB,EAAMsB,EAAUC,EAAcC,GACrDxB,EAAOuB,EAAevB,EAAOrC,EAAO8D,GAASC,GAAM1B,GAE/C/G,EAAI0I,QAAUJ,IAAcvB,EAAK2B,MAAQpJ,GACzCU,EAAI2I,qBAAuBL,IAAcvB,EAAK6B,KAAOtJ,GAGzD,IAAIuJ,EAAQ,IAAIC,MACZT,IACFQ,EAAME,QAAUV,EAChBQ,EAAMG,OAASX,GAEjB,IAAIY,EACF7H,EACA,eACAmC,OAAO4B,KAAK4B,GACTvB,OAAO,SAAU0D,GAChB,OAAOnC,EAAKmC,IAAQ9J,IAErB2I,IAAI,SAAUmB,GACb,OACEtI,EAAuBsI,GACvB,IACAtI,EAAuBmG,EAAKmC,MAG/BlB,KAAK,KACR,SACArC,KAAKD,MAGP,GAAI6C,GAAaxJ,EAAOoK,MACtB,IAUE,YATApK,EACGoK,MAAMF,EAAU,CACfV,UAAWjJ,EACX8J,KAAM,UACNC,YAAa,SAEdC,SAAM,WACLT,EAAMU,IAAMN,IAGhB,MAAO9F,IAEX0F,EAAMU,IAAMN,GAIVO,GACFxK,EAAiByK,UAAY3F,EAAKxB,EAAe,YAC/CoH,GAAkBF,IAAuBpJ,EAEzCuJ,GAAc,CAChBC,QAstBJ,gBArtBIH,SAAUC,IASZxK,EAAY,SAAU2K,GACpBA,EAAiBA,EAAeC,MAC5BD,EAAiB,IAAMA,EAAeC,MACtCD,EACJ1K,EAAK0K,GACLzB,GACE1D,EAAOiF,GAAa,CAClBI,KAAMnK,EACNuD,MAAO0G,EACPG,KAAM9J,EAAI+J,WAEZ7K,EACAE,IAMJ4B,EACEtB,EACA,SAAUsK,GACJA,EAAMC,WAA+C,EAAnCD,EAAMC,SAASxC,QAAQ1I,IAC3CC,EAAUgL,EAAME,UAGpB7K,GAOF,IAwDI8K,GAxDAC,GAAQ5E,KAER6E,GAAW,EAOXnB,GAAOpK,EAAiBoK,MAAQtF,EAAKxB,EAAe,QAGpDkI,MAhMsBC,GAgMCzL,EAAiBwL,cA/LvBC,GAgMjBzL,EAAiBwL,WACjB1G,EAAKxB,EAAe,eAAiB9C,GACrCsE,EAAKxB,EAAe,aAAe9C,GACnCsE,EAAKxB,EAAe,gBAAkB9C,EAGtCkL,KACqC,SAAvC5G,EAAKxB,EAAe,iBACpBtD,EAAiB0L,cAAgBnL,GAI/BoL,GACF3L,EAAiB4L,UACjB9G,EAAKxB,EAAe,cACpBsE,GAAY,IAAMjH,EAGhBkL,GAAc5G,EAChBjF,EAAiB6L,aAAe/G,EAAKxB,EAAe,iBAIlDwF,GAAc7D,EAChBjF,EAAiB8I,aAAehE,EAAKxB,EAAe,iBAIlDwI,GAAqB7G,EACvBjF,EAAiB8L,oBACfhH,EAAKxB,EAAe,yBAIpByI,GACF/L,EAAiB+L,gBAAkBjH,EAAKxB,EAAe,mBAGrD4E,GACFlI,EAAiBkI,mBACjBpD,EAAKxB,EAAe,sBAItB,IAEE+H,GAAW/E,GAAsB,KAC7B0F,KAAKC,iBAAiBC,kBAAkBC,SACxC/L,EACJ,MAAO+D,IACPhE,EAAKgE,IAOP,IAAIiI,GAAUrM,EAAOqM,QACjBC,GACFrL,EAAIsL,WACJvM,EAAOwM,aACPxM,EAAOyM,aACPzM,EAAO0M,UACNL,KAAYA,GAAQM,QACrB3M,EAAO4M,YACP5M,EAAO6M,MACPzJ,GACAoE,KAAKC,UAAYD,KAAKC,SAGpBqF,GACFvG,GAAsB,MAAQA,GAAsB,QAElD+F,KAAK1B,GAAY0B,IAAM/L,GAE3B,IAAIkJ,GAAU9D,EAAOiF,GAAa,CAEhCmC,GAAIxG,GAAsB,MAAQ9E,EAAYpB,EAE9CK,MAAOS,EAAI6L,UAAYtM,EACvB4K,SAAUA,GACV2B,QAASH,GAAqBjG,KAASxG,EAGvC6M,WAAY3G,GAAsB,MAAQM,KAASxG,IA0BrD,GAvBAoJ,GAAQ0D,IAAM3M,EAIVkC,IACF+G,GAAQ2D,OAAS1K,EAAO0K,OACxB3D,GAAQ4D,OAASpL,EAAUS,EAAO2K,SAS/B9L,EAAI+L,SAASlN,EAAK,4CAInBuK,KAAoBtJ,IACtBoI,GAAQ8D,kBAAoBlM,IAGzBoK,IAAczK,KAAcC,GAA0B,KAAnBA,EAAID,GAC1C,OAAOZ,EACLuB,EAAiBX,EAAa,oBAAsBkC,EAAU,SAK7B,GAAlC7B,EAAiBuH,QAAQ,OACxB,aAAavF,KAAKhC,IACnBoJ,IAEDrK,EACE,mBACEiB,EACA,SACA6B,EACA,0BAON,IACIsK,GA0DAC,GA3DA/D,GAAO,GAGPgE,GAAc,WAKhB,OAFEzN,EAAiB0N,UAAY5I,EAAKxB,EAAe,aAGzBhC,EAAIoM,UAAY,IACrC7I,QAAQzD,EAAkBsJ,IAC1B7F,QAAQ,sDAAuD,MAC/DA,QAAQ,YAAa,OAASzE,GAKjCsN,GAAWD,KAOXE,GAAW,EAEXC,GAAc,SAAUC,EAAIC,GAC9B,GAAKjB,GAAL,CAEA,IAAIkB,EAASrI,EAAOiF,GAAa,CAC/BI,KAAM,SACNiD,YAAaF,EAAOD,EAAKrE,GAAQwD,UAenC,GAXI1G,GAAsB,OACxByH,EAAOE,SAAW1G,KAAK2G,OAAOxH,KAAQ4E,GAAQqC,IAphBnC,MAshBbA,GAAW,EACXrC,GAAQ5E,KAGJJ,GAAsB,UACxByH,EAAOxC,SAAWhE,KAAK4G,IAAI,EAAG5C,GAAU6C,OAGtCN,IAAS9M,EAAIqN,WAEfjF,GAAS2E,EAAQ3N,EAAcE,QAE/B,IACEU,EAAIqN,WAAWC,KAAKtN,EAApBA,CAAyBoB,EAAa,UAAWJ,EAAU+L,IAC3D,MAAOQ,GAEPnF,GAAS2E,EAAQ3N,EAAcE,MAMrC4B,EACE,mBACA,WACMZ,EAAIkN,QACA,KAAO1L,KAAY/C,GAAS6N,KAClCJ,GAAc9G,MACTiH,IAAYjH,KAAQ8G,IAE7BjN,GAGF2B,EAAqBY,EAAU8K,GAAarN,GAE5C,IAAIkO,GAAOnN,EAAImN,MAAQ,GACnBL,GAAW,WACb,IACE,IAAIM,EAAuBrM,EAAgBQ,IAAiB,EACxD8L,EAASpH,KAAK4G,IAChBM,GAAK9L,IAAiB,EACtB8L,GAAK7L,IAAiB,EACtBP,EAAgBQ,IAAiB,EACjCR,EAAgBM,IAAiB,EACjCN,EAAgBO,IAAiB,GAEnC,OAAO2E,KAAKqH,IACV,IAKI,EAJJrH,KAAK2G,MACF,MAAQ7L,EAAgBwM,WAAa,GAAKH,GACzCC,EACA,IAGN,MAAOxK,IAEP,OADAhE,EAAKgE,IACE,IAIXjC,EAAqB,OAAQ,WAC3BqJ,GAAW6C,KACXlM,EACEM,EACA,WACM+I,GAAW6C,OAAY7C,GAAW6C,OAExC7N,KAQJ,IAgCIuO,GAoCAC,GAAUC,GApEVC,GAAU,SAAUC,GACtB,IAAIlE,EAAO,GAIX,IACEA,EAAOkE,GAAapN,EAAuBZ,EAAI+J,UAC/C,MAAO9G,IACPhE,EAAKgE,IAGP,IAAIgL,EAAyBpP,EAAOgM,IACpC,GAAItE,GAAW0H,GACb,IACEnE,EAAOmE,EAAuBxL,KAAK5D,EAAQ,CAAEiL,KAAMA,KAAWA,EAC9D,MAAO7G,IACPF,EAAe,OAAQE,IAK3B,IA7ZiB,SAAU6G,GAC3B,IAAK,IAAItC,KAAKmD,GAAa,CACzB,IAAIuD,EAAgBvD,GAAYnD,GAChC,GAAK0G,EAAL,CAGA,IAAIC,EA9OI,KA+OND,EAAc,GAAcA,EA/OtB,IA+O8CA,EAEtD,GACEC,IAAerE,GACf,IAAIvE,OACF,IAAM9B,EAAY0K,GAAYxK,QAAQ,SAAU,QAAU,IAC1D,KACAzB,KAAK4H,GAEP,OAAO1K,GAEX,OAAOC,EA2YH+O,CAAatE,GAQjB,MAFY,QAARZ,IAAkBlJ,EAAIqO,OAAMvE,GAAQ9J,EAAIqO,KAAKjK,MAAM,KAAK,IAErD0F,EAPL7K,EAAKuB,EAAiB,YAAcsJ,IAgDpCwE,GAAW,SACbC,EACAC,EACA5H,EACA6H,IAEKA,GAAelI,GAAWK,KAAW6H,EAAc7H,GACxD,IAIM8H,EAJFvG,EAAW5B,GAAWkI,GAAeA,EAAc,aACnDE,EAAc,GACdpL,EAASiL,KAAgD,EAA9BA,EAAc/G,QAAQ,OAGnD+G,GADIE,EAAQF,EAAcpK,MAAM,MACVwK,QACtBD,EAAc,IAAMD,EAAM5G,KAAK,MAGjC,IAAIgC,EAAOiE,GAAQS,GAGfK,EAAU/E,EAAO6E,EACrB,GAAK7E,GAAQuC,IAAgBwC,EAA7B,CAEAxC,GAAewC,EACftG,GAAKuB,KAAOA,EAGR1E,GAAsB,OACxBmD,GAAKuG,eACHzI,KAAK4G,IAAI9L,EAA2B,aAAK,EAAGtC,EAAOkQ,YAAc,IACjE,KACFxG,GAAKyG,gBACH3I,KAAK4G,IACH9L,EAAgBQ,IAAiB,EACjC9C,EAAOoQ,aAAe,IACnB,MAIL7J,GAAsB,MACpBtF,EAAIsB,KAAWmH,GAAKnH,GAAYtB,EAAIsB,IAItCe,GAAUiD,GAAsB,QAClCmD,GAAK2G,aAAe/M,EAAOgN,MAC3B5G,GAAK6G,cAAgBjN,EAAOsL,QAI9B,IAII4B,EAJAC,EAAOzQ,EAAO0Q,YACdC,EAAiB,aAIrB,IACEH,EAAsBC,EAAKG,iBAAiBD,GAAgB,GAAG3F,KAC/D,MAAO5G,IACPhE,EAAKgE,IAGP6K,GAAgBuB,GAC+C,EAA3D,CAAC,SAAU,gBAAgB5H,QAAQ4H,GAGnCC,GACAA,EAAKE,KACwC,EAA7C,CAAC,EAAG,GAAG/H,QAAQ6H,EAAKE,GAAgB3F,MAGxC,IAAI6F,EAA0BlD,GAC1BA,GAASpI,MA5vBH,KA4vBgB,GACtBlF,EACJ2O,GAAWrB,IACgD,EAAvD5B,GAAmBnD,QAAQiI,IAC3BA,GAA2BxP,EAC3Bb,EAGJkJ,GAAKoH,OACH,QAAQzN,KAAKqK,OAAkBgC,GAAeT,GAC1CzO,GACCwO,GAEPjH,EAAWD,GAAeC,EAAU,CAClCiD,KAAMrK,EACNsK,KAAMvB,GAAKuB,OAGb,IAAI8F,EAAsB,WACxBnP,EAA2BrB,EAC3B,IAAIyQ,EACFtB,GAAeT,KAAkB1I,GAAsB,MA9H1C,SACjBmJ,EACAuB,EACAjC,EACAvG,EACAV,EACAuB,GAEIoG,GAAa7B,GAAY,GAAKpE,GAAQwD,QAAS1M,GAC/CuM,KAAoBrD,GAAQwD,QAAUpG,MAE1C,IAAIqK,EAAcvG,GAAkBuE,KAChCiC,EAAQ9I,GAAe4I,EAAkBxI,GAE7CY,GACE,CACEyE,GAAIrE,GAAQwD,QACZjC,KAAMrK,EACNgN,UAAWsD,GAAoBjC,EAAWrB,GAAW,KACrDwD,MAAOA,EACP9K,EAAGA,GAEH0B,SAAU9F,EAAU8F,IAEtBuB,GAGFyF,GAAmBpB,GACnBA,GAAWuD,EAEX/N,IAiGEiO,CACE1B,EACAsB,EACAhC,GACAc,EACA/H,EACAuB,IAIJ,GAAK1H,EAmBHmP,SAjBA,IACMrO,GAAUgF,GAAWhF,EAAO2O,sBAC9B3O,EACG2O,qBAAqB,CAACrO,EAAcC,IACpCqO,KAAK,SAAUC,GACd9H,GAAQ+H,QAAUD,EAAkBvO,GACpCyG,GAAQgI,WAAaF,EAAkBtO,GACvC8N,MAEDxG,SAAMwG,GAETA,IAEF,MAAOvC,GACPuC,OAWFW,GAAM1R,EAAO2R,QACbC,GAAeF,GAAMA,GAAIG,UAAYxR,EACrCyR,GAAM9R,EAAO+R,cACbC,GAAgB,YAIhBrG,IAAeiG,IAAgBK,OAASH,KAqB1CJ,GAAIG,WAnBEK,GAAOR,GADiB1G,GAoBAgH,IAlBrB,WACL,IAEI7G,EAFAtF,EAAMhC,UACNsO,EAAKD,GAAKjO,MAAMmO,KAAMvM,GAY1B,OAVI6B,GAAWuK,OACb9G,EAAQ,IAAI8G,MAAMjH,KAIlBG,EAAQ5J,EAAI8Q,YAAY,UAClBC,UAAUtH,GAAMzK,EAASA,GAEjC4K,EAAMtH,UAAYgC,EAClBiM,GAAI3G,GACGgH,IAMXhQ,EACE6P,GACA,WACEvC,GAAS,IAEXjP,GAGF2B,EACE,WACA,WACEsN,GAAS,IAEXjP,IAKAmL,IAAuB,QAARtB,IAAkB,iBAAkBrK,GACrDmC,EACE,aACA,WACEsN,GAAS,IAEXjP,GAIAmL,IAAa8D,KAEjB,IAAI8C,GAAiB,SAAUtH,EAAMlD,EAAUuB,GAC7CmG,GAAS,EAAGxE,EAAMlD,EAAUuB,IAE9BtJ,EAAO6H,GAAY,IAAMlH,GAAgB4R,GACzC,IAAIC,GAAkBC,MAAyB9R,EAC1CX,EAAOwS,MAAkBxS,EAAOwS,IAAmBD,IAOxD,IAAIG,GAAa,CAAC,SAAU,UAExBC,GAAY,SAAUxH,EAAOpD,EAAU6H,EAAapG,IACjDoG,GAAelI,GAAWK,KAAW6H,EAAc7H,GAExD,IAAI6K,EAAkBlL,GAAWyD,GAC7B7B,EAAW5B,GAAWkI,GAAeA,EAAc,aACnDiD,SAAmB1H,EAEvB,GAAIuH,GAAW9J,QAAQiK,GAAa,IAAMD,EAExC,OADA1O,EAAe0H,GAAmBhL,EAAY,aAAeiS,GACtDvJ,IAGT,IACE,GAAIsJ,EAAiB,CACnB,IAAIE,EAAc3H,IAClB,GAAIuH,GAAW9J,eAAekK,GAAe,EAK3C,OAJA5O,EACE0H,GACAT,EAAQ,uBAAyB2H,GAE5BxJ,IAET6B,EAAQ2H,GAEV,MAAO1O,IAEP,OADAF,EAAe0H,GAAmBxH,IAC3BkF,IAGT6B,GAAS,GAAKA,GAAOrG,QAAQ,eAAgB,KAAKA,QAAQ,WAAY,IAEtE,IAAIiO,EAAc,CAAE/H,KAAMpK,EAAWuK,MAAOA,GACxC6H,GAAa/D,IAAiB9L,EAAQ,EAE1C4E,EAAWD,GAAeC,EAAUgL,GAEhC5H,GACF9B,GACE1D,EAAOoN,EAAa,CAClBjF,GAAIjH,KACJsK,MAAO9I,IAAgB2K,GACvBrF,UACGqF,GAAahE,KAAazI,GAAsB,KAC7CwI,GACA,KAENhH,SAAU9F,EAAU8F,KAEtBuB,EACAjJ,EACAmJ,IAKFyJ,GAAmB,SAAU9H,EAAOpD,EAAUuB,EAAUE,GAC1DmJ,GAAUxH,EAAOpD,EAAUuB,EAAUE,IAIlCxJ,EAAO4L,MACV5L,EAAO4L,IAAqBqH,IAE9B,IAAIC,GAAYlT,EAAO4L,IAGnBuH,GAAQD,IAAaA,GAAU1K,EAAI0K,GAAU1K,EAAI,GAMrD,IAAK,IAAI2C,MAHTnL,EAAO4L,IAAqBqH,GAGVE,GACZ9O,EAAQ8O,GAAOhI,MACjB/F,MAAMC,QAAQ8N,GAAMhI,KAChBwH,GAAU1O,MAAM,KAAMkP,GAAMhI,KAC5BwH,GAAUQ,GAAMhI,MAIxB,IA0CMiI,GA1CFC,GAAc,SAAUlI,GAE1B,IADA,IAAImI,EAAUnI,EAAMoI,OAElBD,GACAA,IAAY/R,KACV+R,EAAQrO,cAAkD,OAAlCF,EAAKuO,EAAS,kBAExCA,EAAUA,EAAQE,WAEpB,GAAKF,GAAWA,IAAY/R,EAA5B,CACA,IAAIkS,EAA6B,SAApBH,EAAQI,QACjBvP,EAAOY,EAAKuO,EAAS,gBACzB,GAAKnP,GAAQsP,IAA2B,WAAftI,EAAMH,MAA/B,CAIA,IAFA,IASM2I,EATF5L,EAAW,CAAE6L,IAAKN,EAAQI,QAAQG,eAClCC,EAAaR,EAAQQ,WAChBnL,EAAI,EAAGA,EAAImL,EAAWxO,OAAQqD,IAAK,CAC1C,IAAI3D,EAAY8O,EAAWnL,GAC0B,IAAjD3D,EAAUb,KAAKyE,QAAQ,wBACzBb,EAAS/C,EAAUb,KAAKR,MAAM,IAAImB,QAAQ,KAAM,MAC9CE,EAAU0G,OAEZ+H,IACEE,EAASxI,EAAM4I,UACnBhM,EAASiM,YAAcL,GAClBA,EAAOM,aAAeN,EAAOjI,OAAS,IACpC5G,QAAQ,OAAQ,KAChBoP,OACAvQ,MAAM,EAAG,KACZ,IAENgP,GAAUxO,EAAM4D,EAAU1H,EAAcE,MAG1CgB,EAAIa,iBAAiB,QAASiR,GAAa7S,GAC3Ce,EAAIa,iBAAiB,SAAUiR,GAAa7S,GAI1CP,EAAiBmT,YAAc7S,GAC/BwE,EAAKxB,EAAe,eAAiB9C,IAEjC2S,GAAY,WACd,GACG,UAAU/P,KAAK9B,EAAI4S,MAAQ,KAAO5S,EAAImN,MAAQnN,EAAImN,KAAKuF,cAG1D,IACE,IAAIG,EAAU,IAAIpU,EAAOqU,eACzBD,EAAQE,KAAK,OAAQnT,EAAIoT,KAAMhU,GAC/B6T,EAAQnK,OAAS,WACQ,MAAnBmK,EAAQI,QACV7B,GAAU,WAAY,CACpB8B,IAAKtT,EAAI6L,SAAW,KAAOrC,GAAkBxJ,EAAI+J,SACjDsJ,OAAQ,OAGdJ,EAAQM,OACR,MAAOtQ,OAEY,YAAnB7C,EAAIoT,WACNpT,EAAIa,iBAAiB,mBAAoBgR,GAAW5S,GACjD4S,MAEP,MAAO5E,IACPrO,EAAUqO,IAnNY,IAAUxD,GACxBkH,GAvoBkBxG,GAnN9B,CA+iCE1L,OACA,uBACA"} \ No newline at end of file +{"version":3,"file":"app.source.js","sources":["app.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData, keepalive) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n var imageUrl =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n\n // Events must survive navigation without taking over links or forms.\n if (keepalive && window.fetch) {\n try {\n window\n .fetch(imageUrl, {\n keepalive: trueVar,\n mode: \"no-cors\",\n credentials: \"omit\",\n })\n .catch(function () {\n image.src = imageUrl;\n });\n return;\n } catch (error) {}\n }\n image.src = imageUrl;\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function (raw) {\n // Customers can overwrite their referrer, here we check for that\n var referrer =\n overwriteOptions.referrer ||\n attr(scriptElement, \"referrer\") ||\n doc.referrer ||\n \"\";\n\n if (raw) return referrer;\n return (\n referrer\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch = \"\";\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n var pathKey = path + querySearch;\n if (!path || lastSendPath == pathKey) return;\n\n lastSendPath = pathKey;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // Only the first pageview can use a Cloudflare referrer as a unique arrival.\n page.unique =\n isPushState || userNavigated\n ? falseVar\n : !sameSite || (!pages && /[?&]__cf_/.test(getReferrer(trueVar)));\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n var manualPageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n window[namespace + \"_\" + pageviewText] = manualPageview;\n var defaultPageview = defaultNamespace + \"_\" + pageviewText;\n if (!window[defaultPageview]) window[defaultPageview] = manualPageview;\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw, keepalive) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback,\n undefinedVar,\n keepalive\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback, keepalive) {\n sendEvent(event, metadata, callback, keepalive);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n\n var inlineEvent = function (event) {\n var element = event.target;\n while (\n element &&\n element !== doc &&\n (!element.getAttribute || attr(element, \"simple-event\") === null)\n )\n element = element.parentNode;\n\n if (!element || element === doc) return;\n var isForm = element.tagName === \"FORM\";\n var name = attr(element, \"simple-event\");\n if (!name || isForm !== (event.type === \"submit\")) return;\n\n var metadata = { tag: element.tagName.toLowerCase() };\n var attributes = element.attributes;\n for (var i = 0; i < attributes.length; i++) {\n var attribute = attributes[i];\n if (attribute.name.indexOf(\"data-simple-event-\") === 0)\n metadata[attribute.name.slice(18).replace(/-/g, \"_\")] =\n attribute.value;\n }\n if (isForm) {\n var button = event.submitter;\n metadata.button_text = button\n ? (button.textContent || button.value || \"\")\n .replace(/\\s+/g, \" \")\n .trim()\n .slice(0, 200)\n : \"\";\n }\n sendEvent(name, metadata, undefinedVar, trueVar);\n };\n\n doc.addEventListener(\"click\", inlineEvent, falseVar);\n doc.addEventListener(\"submit\", inlineEvent, falseVar);\n\n // 404 confirmation adds a request, so existing installs must opt in.\n if (\n overwriteOptions.detect404 === trueVar ||\n attr(scriptElement, \"detect-404\") == trueText\n ) {\n var detect404 = function () {\n if (\n !/\\b404\\b/.test(doc.title + \" \" + (doc.body && doc.body.textContent))\n )\n return;\n try {\n var request = new window.XMLHttpRequest();\n request.open(\"HEAD\", loc.href, trueVar);\n request.onload = function () {\n if (request.status === 404)\n sendEvent(\"page_404\", {\n url: loc.protocol + \"//\" + definedHostname + loc.pathname,\n status: 404,\n });\n };\n request.send();\n } catch (error) {}\n };\n if (doc.readyState === \"loading\")\n doc.addEventListener(\"DOMContentLoaded\", detect404, falseVar);\n else detect404();\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_app_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","keepalive","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","imageUrl","key","fetch","mode","credentials","catch","src","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","protocol","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","raw","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","parts","querySearch","shift","pathKey","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","manualPageview","defaultPageview","defaultNamespace","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue","detect404","inlineEvent","element","target","parentNode","isForm","tagName","button","tag","toLowerCase","attributes","submitter","button_text","textContent","trim","title","request","XMLHttpRequest","open","href","status","url","send","readyState"],"mappings":"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"} \ No newline at end of file diff --git a/dist/latest/custom/e.js b/dist/latest/custom/e.js index 1a578d53..9b9a681b 100644 --- a/dist/latest/custom/e.js +++ b/dist/latest/custom/e.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-15; 2231; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-15; 04c5; v12) */ -!function(v,t,e,n,m){try{var g=undefined,y=!0,_=!1,r="true",a="https:",b="pageview",l="event",i="error",o=v.console,c="doNotTrack",w=v.navigator,s=v.location,O=s.host,u=v.document,f=w.userAgent,p="Not sending request ",d=p+"when ",x=_,h=encodeURIComponent,E=decodeURIComponent,M=JSON.stringify,S=v.addEventListener,k="https://"+e,A=u.documentElement||{},q="language",C="Height",D="scroll",$=w.userAgentData,j=D+C,H="offset"+C,R="client"+C,L="pagehide",N="platform",P="platformVersion",T="https://docs.simpleanalytics.com",U=0,I=/(bot|spider|crawl)/i.test(f)&&!/(cubot)/i.test(f),V=v.screen,B=u.currentScript||u.querySelector('script[src*="'+e+'"]');m=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){m("Error in your "+t+" function:",e)},z=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},W=function(t){return"string"==typeof t},G=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},J=function(t,e){return t&&t.getAttribute("data-"+e)},X=function(t){return Array.isArray(t)?t:W(t)&&t.length?t.split(/, ?/):[]},Y=function(t){return t&&t.constructor===Object},Z=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},it=function(t){return"function"==typeof t},ot="namespace",ct=t[ot]||J(B,ot)||"sa",st=function(t,e){var n=v[ct+"_metadata"];Y(n)&&(t=Z(t,n));var r=v[kt];if(!it(r))return kt&&m(kt+" not found, set window."+kt),t;try{return Z(t,r.call(v,Z(t,e)))}catch(a){F("metadata",a)}},ut=t.strictUtm||J(B,"strict-utm")==r,lt=function(i,t){tt=!i&&nt("q")?"":_;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");tt!==_&&0"); +!function(v,n,e,r,m){try{var g=undefined,y=!0,_=!1,t="true",a="https:",b="pageview",l="event",i="error",o=v.console,c="doNotTrack",w=v.navigator,s=v.location,O=s.host,u=v.document,f=w.userAgent,p="Not sending request ",d=p+"when ",x=_,h=encodeURIComponent,E=decodeURIComponent,M=JSON.stringify,S=v.addEventListener,k="https://"+e,A=u.documentElement||{},q="language",C="Height",D="scroll",$=w.userAgentData,j=D+C,H="offset"+C,R="client"+C,L="pagehide",N="platform",P="platformVersion",T="https://docs.simpleanalytics.com",U=0,I=/(bot|spider|crawl)/i.test(f)&&!/(cubot)/i.test(f),V=v.screen,B=u.currentScript||u.querySelector('script[src*="'+e+'"]');m=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){m("Error in your "+t+" function:",e)},z=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},W=function(t){return"string"==typeof t},G=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},J=function(t,e){return t&&t.getAttribute("data-"+e)},X=function(t){return Array.isArray(t)?t:W(t)&&t.length?t.split(/, ?/):[]},Y=function(t){return t&&t.constructor===Object},Z=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},it=function(t){return"function"==typeof t},ot="namespace",ct=n[ot]||J(B,ot)||"sa",st=function(t,e){var n=v[ct+"_metadata"];Y(n)&&(t=Z(t,n));var r=v[kt];if(!it(r))return kt&&m(kt+" not found, set window."+kt),t;try{return Z(t,r.call(v,Z(t,e)))}catch(a){F("metadata",a)}},ut=n.strictUtm||J(B,"strict-utm")==t,lt=function(i,t){tt=!i&&nt("q")?"":_;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");tt!==_&&0"); //# sourceMappingURL=e.js.map \ No newline at end of file diff --git a/dist/latest/custom/e.js.map b/dist/latest/custom/e.js.map index c14cf973..8250885b 100644 --- a/dist/latest/custom/e.js.map +++ b/dist/latest/custom/e.js.map @@ -1 +1 @@ -{"version":3,"file":"e.source.js","sources":["e.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData, keepalive) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n var imageUrl =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n\n // Events must survive navigation without taking over links or forms.\n if (keepalive && window.fetch) {\n try {\n window\n .fetch(imageUrl, {\n keepalive: trueVar,\n mode: \"no-cors\",\n credentials: \"omit\",\n })\n .catch(function () {\n image.src = imageUrl;\n });\n return;\n } catch (error) {}\n }\n image.src = imageUrl;\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch = \"\";\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n var pathKey = path + querySearch;\n if (!path || lastSendPath == pathKey) return;\n\n lastSendPath = pathKey;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n var manualPageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n window[namespace + \"_\" + pageviewText] = manualPageview;\n var defaultPageview = defaultNamespace + \"_\" + pageviewText;\n if (!window[defaultPageview]) window[defaultPageview] = manualPageview;\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw, keepalive) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback,\n undefinedVar,\n keepalive\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback, keepalive) {\n sendEvent(event, metadata, callback, keepalive);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n\n var inlineEvent = function (event) {\n var element = event.target;\n while (\n element &&\n element !== doc &&\n (!element.getAttribute || attr(element, \"simple-event\") === null)\n )\n element = element.parentNode;\n\n if (!element || element === doc) return;\n var isForm = element.tagName === \"FORM\";\n var name = attr(element, \"simple-event\");\n if (!name || isForm !== (event.type === \"submit\")) return;\n\n var metadata = { tag: element.tagName.toLowerCase() };\n var attributes = element.attributes;\n for (var i = 0; i < attributes.length; i++) {\n var attribute = attributes[i];\n if (attribute.name.indexOf(\"data-simple-event-\") === 0)\n metadata[attribute.name.slice(18).replace(/-/g, \"_\")] =\n attribute.value;\n }\n if (isForm) {\n var button = event.submitter;\n metadata.button_text = button\n ? (button.textContent || button.value || \"\")\n .replace(/\\s+/g, \" \")\n .trim()\n .slice(0, 200)\n : \"\";\n }\n sendEvent(name, metadata, undefinedVar, trueVar);\n };\n\n doc.addEventListener(\"click\", inlineEvent, falseVar);\n doc.addEventListener(\"submit\", inlineEvent, falseVar);\n\n // 404 confirmation adds a request, so existing installs must opt in.\n if (\n overwriteOptions.detect404 === trueVar ||\n attr(scriptElement, \"detect-404\") == trueText\n ) {\n var detect404 = function () {\n if (\n !/\\b404\\b/.test(doc.title + \" \" + (doc.body && doc.body.textContent))\n )\n return;\n try {\n var request = new window.XMLHttpRequest();\n request.open(\"HEAD\", loc.href, trueVar);\n request.onload = function () {\n if (request.status === 404)\n sendEvent(\"page_404\", {\n url: loc.protocol + \"//\" + definedHostname + loc.pathname,\n status: 404,\n });\n };\n request.send();\n } catch (error) {}\n };\n if (doc.readyState === \"loading\")\n doc.addEventListener(\"DOMContentLoaded\", detect404, falseVar);\n else detect404();\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_events_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","keepalive","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","imageUrl","key","fetch","mode","credentials","catch","src","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","protocol","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","parts","querySearch","shift","pathKey","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","manualPageview","defaultPageview","defaultNamespace","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue","detect404","inlineEvent","element","target","parentNode","isForm","tagName","button","tag","toLowerCase","attributes","submitter","button_text","textContent","trim","title","request","XMLHttpRequest","open","href","status","url","send","readyState"],"mappings":";;CAEA,SACEA,EACAC,EACAC,EAIAC,EACAC,GAEA,IAQE,IAAIC,EAAeC,UACfC,GAAU,EACVC,GAAW,EACXC,EAAW,OACXC,EAAQ,SACRC,EAAe,WACfC,EAAY,QACZC,EAAY,QAGZC,EAAMd,EAAOe,QACbC,EAAa,aACbC,EAAMjB,EAAOkB,UACbC,EAAMnB,EAAOoB,SACbC,EAAmBF,EAAIG,KACvBC,EAAMvB,EAAOwB,SACbC,EAAYR,EAAIQ,UAChBC,EAAa,uBACbC,EAAiBD,EAAa,QAC9BE,EAA2BpB,EAC3BqB,EAAyBC,mBACzBC,EAAyBC,mBACzBC,EAAYC,KAAKD,UAEjBE,EAAuBnC,EAAOoC,iBAC9BC,EAhBW3B,WAgB4BR,EACvCoC,EAAkBf,EAAIe,iBAAmB,GACzCC,EAAW,WACXC,EAAS,SAETC,EAAS,SACTC,EAASzB,EAAI0B,cACbC,EAAeH,EAASD,EACxBK,EAAe,SAAWL,EAC1BM,EAAe,SAAWN,EAE1BO,EAAW,WACXC,EAAe,WACfC,EAAsB,kBACtBC,EAAU,mCACVC,EAAQ,EACRC,EACF,sBAAsBC,KAAK5B,KAAe,WAAW4B,KAAK5B,GACxD6B,EAAStD,EAAOsD,OAIhBC,EACFhC,EAAIiC,eAAiBjC,EAAIkC,cAAc,gBAAkBvD,EAAU,MAOrEE,EAAO,WAEL,IAAIsD,EAAO,GAAGC,MAAMC,KAAKC,WAOzB,OAJAH,EAAKI,QAAQ,qBAINC,SAASC,UAAUC,MAAML,KAAK9C,EAAIV,KAAMU,EAAK4C,IAGtD,IAAIQ,EAAiB,SAAUC,EAAMC,GACnChE,EAAK,iBAAmB+D,EAAO,aAAcC,IAG3CC,EAAU,SAAUC,EAAKC,GAC3B,OAAOC,OAAOR,UAAUS,eAAeb,KAAKU,EAAKC,IAG/CG,EAAW,SAAUC,GACvB,MAAwB,iBAAVA,GAGZC,EAAc,SAAUC,GAC1B,OAAOA,EAAKC,QAAQ,sBAAuB,SAGzCC,EAAO,SAAUxB,EAAeyB,GAClC,OAAOzB,GAAiBA,EAAc0B,aAAa,QAAUD,IAG3DE,EAA+B,SAAUC,GAC3C,OAAOC,MAAMC,QAAQF,GACjBA,EACAT,EAASS,IAAQA,EAAIG,OACnBH,EAAII,MAAM,OACV,IAGJC,EAAW,SAAUC,GACvB,OAAOA,GAAUA,EAAOC,cAAgBlB,QAGtCmB,EAAS,WAGX,IAFA,IAAIC,EAAK,GACLC,EAAMhC,UACDiC,EAAQ,EAAGA,EAAQD,EAAIP,OAAQQ,IAAS,CAC/C,IAAIC,EAAaF,EAAIC,GACrB,GAAIN,EAASO,GACX,IAAK,IAAIC,KAAWD,EACd1B,EAAQ0B,EAAYC,KACtBJ,EAAGI,GAAWD,EAAWC,IAKjC,OAAOJ,GAGLK,EAAWjG,EAAOkG,YAClBC,EAAcF,GAAYzB,OAAO4B,KAAKnG,GAAkBqF,OAG5DrF,EAAmB0F,EAAO1F,EAAkBgG,GAExCE,GAAa/F,EAAK,WAAYH,GAGlC,IA+EIoG,GA/EAC,GAAgBpB,EAClBjF,EAAiBqG,eAAiBvB,EAAKxB,EAAe,mBAGpDgD,GAAwB,SAAUC,GAEpC,OAGgB,IAFdF,GAAcG,OAAO,SAAU5B,GAC7B,OAAO,IAAI6B,OAAO,IAAMF,GAAoBnD,KAAKwB,KAChDS,QAIHqB,GAAMC,KAAKD,IAEXE,GAAO,WACT,IAAIC,EAAe9G,EAAO+G,QAAU/G,EAAOgH,SACvCC,EAAY,CAAC,MAAQ,KAAO,KAAO,KAAO,KAC1CC,EAAY,SAEhB,IACE,OAAOD,EAAUnC,QAAQoC,EAAW,SAAUC,GAC5C,OACEA,EACCL,EAAaM,gBAAgB,IAAIC,WAAW,IAAI,GAC9C,IAAOF,EAAI,GACdG,SAAS,MAEb,MAAOlD,GACP,OAAO6C,EAAUnC,QAAQoC,EAAW,SAAUC,GAC5C,IAAII,EAAqB,GAAhBC,KAAKC,SAAiB,EAE/B,OADMN,EAAI,EAAII,EAAS,EAAJA,EAAW,GACrBD,SAAS,QAKpBI,GAAa,SAAUC,GACzB,MAAsB,mBAARA,GAIZC,GAAgB,YAChBC,GACF5H,EAAiB2H,KACjB7C,EAAKxB,EAAeqE,KAy3BxB,KAt3BME,GAAiB,SAAUC,EAAUC,GACvC,IAAIC,EAAiBjI,EAAO6H,GAAY,aACpCrC,EAASyC,KAAiBF,EAAWpC,EAAOoC,EAAUE,IAC1D,IAAIC,EAA4BlI,EAAOmI,IACvC,IAAKT,GAAWQ,GAKd,OAJIC,IACF/H,EACE+H,GAAoB,0BAA4BA,IAE7CJ,EAET,IACE,OAAOpC,EACLoC,EACAG,EAA0BtE,KAAK5D,EAAQ2F,EAAOoC,EAAUC,KAE1D,MAAO5D,GACPF,EAAe,WAAYE,KAU3BgE,GACFnI,EAAiBmI,WACjBrD,EAAKxB,EAAe,eAAiB9C,EAInC4H,GAAiB,SAAUC,EAAcC,GAC3ClC,IAAKiC,GAAgB/B,GAAsB,KAAO,GAAK/F,EACvD,IAAIgI,GAAKD,GAAmBpH,EAAIsH,QAC7B9E,MAAM,GACN4B,MAAM,KACNkB,OAAO,SAAUiC,GAChB,IAAIC,EAAID,EAASE,QAAQ,KACrBvC,KAAM7F,GAAgB,EAAJmI,GAASD,EAAS/E,MAAMgF,EAAI,KAChDtC,KAAMA,GAAI,IAAM,IAAMqC,EAAS/E,MAAM,EAAGgF,IAE1C,IAAIE,EAASP,IAAiB/B,GAAsB,MAEhDuC,EAAkBC,GAAYC,IAAIpE,GAAaqE,KAAK,KACpDC,EAAQL,EACR,KAAOC,EAAkB,KACzB,YACCV,GAAY,GAAK,KAClB,yCACCA,GAAY,GAAK,QAClB,IACAU,EACA,KACJ,OAAID,IAAWE,GAAYzD,OAAe9E,EAInC,IAAIkG,OAAOwC,EAAO,KAAK7F,KAAKqF,KAEpCO,KAAK,KAGR,OADA5C,GAAIA,IAAKhG,EACFmI,GAAKnI,GA+BV8I,GAAiBtB,GAAY,UACjC,GAAI7H,EAAOmJ,KAAmB5I,EAAS,OAAOH,EAAKsB,EAAa,SAChE1B,EAAOoJ,gBAAkB7I,EACzBP,EAAOmJ,IAAkB5I,EAOzB,IAAI8I,GAAW,SAAUrB,EAAMsB,EAAUC,EAAcC,GACrDxB,EAAOuB,EAAevB,EAAOrC,EAAO8D,GAASC,GAAM1B,GAE/C/G,EAAI0I,QAAUJ,IAAcvB,EAAK2B,MAAQpJ,GACzCU,EAAI2I,qBAAuBL,IAAcvB,EAAK6B,KAAOtJ,GAGzD,IAAIuJ,EAAQ,IAAIC,MACZT,IACFQ,EAAME,QAAUV,EAChBQ,EAAMG,OAASX,GAEjB,IAAIY,EACF7H,EACA,eACAmC,OAAO4B,KAAK4B,GACTvB,OAAO,SAAU0D,GAChB,OAAOnC,EAAKmC,IAAQ9J,IAErB2I,IAAI,SAAUmB,GACb,OACEtI,EAAuBsI,GACvB,IACAtI,EAAuBmG,EAAKmC,MAG/BlB,KAAK,KACR,SACArC,KAAKD,MAGP,GAAI6C,GAAaxJ,EAAOoK,MACtB,IAUE,YATApK,EACGoK,MAAMF,EAAU,CACfV,UAAWjJ,EACX8J,KAAM,UACNC,YAAa,SAEdC,SAAM,WACLT,EAAMU,IAAMN,IAGhB,MAAO9F,IAEX0F,EAAMU,IAAMN,GAIVO,GACFxK,EAAiByK,UAAY3F,EAAKxB,EAAe,YAC/CoH,GAAkBF,IAAuBpJ,EAEzCuJ,GAAc,CAChBC,QAstBJ,mBArtBIH,SAAUC,IASZxK,EAAY,SAAU2K,GACpBA,EAAiBA,EAAeC,MAC5BD,EAAiB,IAAMA,EAAeC,MACtCD,EACJ1K,EAAK0K,GACLzB,GACE1D,EAAOiF,GAAa,CAClBI,KAAMnK,EACNuD,MAAO0G,EACPG,KAAM9J,EAAI+J,WAEZ7K,EACAE,IAMJ4B,EACEtB,EACA,SAAUsK,GACJA,EAAMC,WAA+C,EAAnCD,EAAMC,SAASxC,QAAQ1I,IAC3CC,EAAUgL,EAAME,UAGpB7K,GAOF,IAwDI8K,GAxDAC,GAAQ5E,KAER6E,GAAW,EAOXnB,GAAOpK,EAAiBoK,MAAQtF,EAAKxB,EAAe,QAGpDkI,MAhMsBC,GAgMCzL,EAAiBwL,cA/LvBC,GAgMjBzL,EAAiBwL,WACjB1G,EAAKxB,EAAe,eAAiB9C,GACrCsE,EAAKxB,EAAe,aAAe9C,GACnCsE,EAAKxB,EAAe,gBAAkB9C,EAGtCkL,KACqC,SAAvC5G,EAAKxB,EAAe,iBACpBtD,EAAiB0L,cAAgBnL,GAI/BoL,GACF3L,EAAiB4L,UACjB9G,EAAKxB,EAAe,cACpBsE,GAAY,IAAMjH,EAGhBkL,GAAc5G,EAChBjF,EAAiB6L,aAAe/G,EAAKxB,EAAe,iBAIlDwF,GAAc7D,EAChBjF,EAAiB8I,aAAehE,EAAKxB,EAAe,iBAIlDwI,GAAqB7G,EACvBjF,EAAiB8L,oBACfhH,EAAKxB,EAAe,yBAIpByI,GACF/L,EAAiB+L,gBAAkBjH,EAAKxB,EAAe,mBAGrD4E,GACFlI,EAAiBkI,mBACjBpD,EAAKxB,EAAe,sBAItB,IAEE+H,GAAW/E,GAAsB,KAC7B0F,KAAKC,iBAAiBC,kBAAkBC,SACxC/L,EACJ,MAAO+D,IACPhE,EAAKgE,IAOP,IAAIiI,GAAUrM,EAAOqM,QACjBC,GACFrL,EAAIsL,WACJvM,EAAOwM,aACPxM,EAAOyM,aACPzM,EAAO0M,UACNL,KAAYA,GAAQM,QACrB3M,EAAO4M,YACP5M,EAAO6M,MACPzJ,GACAoE,KAAKC,UAAYD,KAAKC,SAGpBqF,GACFvG,GAAsB,MAAQA,GAAsB,QAElD+F,KAAK1B,GAAY0B,IAAM/L,GAE3B,IAAIkJ,GAAU9D,EAAOiF,GAAa,CAEhCmC,GAAIxG,GAAsB,MAAQ9E,EAAYpB,EAE9CK,MAAOS,EAAI6L,UAAYtM,EACvB4K,SAAUA,GACV2B,QAASH,GAAqBjG,KAASxG,EAGvC6M,WAAY3G,GAAsB,MAAQM,KAASxG,IA0BrD,GAvBAoJ,GAAQ0D,IAAM3M,EAIVkC,IACF+G,GAAQ2D,OAAS1K,EAAO0K,OACxB3D,GAAQ4D,OAASpL,EAAUS,EAAO2K,SAS/B9L,EAAI+L,SAASlN,EAAK,4CAInBuK,KAAoBtJ,IACtBoI,GAAQ8D,kBAAoBlM,IAGzBoK,IAAczK,KAAcC,GAA0B,KAAnBA,EAAID,GAC1C,OAAOZ,EACLuB,EAAiBX,EAAa,oBAAsBkC,EAAU,SAK7B,GAAlC7B,EAAiBuH,QAAQ,OACxB,aAAavF,KAAKhC,IACnBoJ,IAEDrK,EACE,mBACEiB,EACA,SACA6B,EACA,0BAON,IACIsK,GA0DAC,GA3DA/D,GAAO,GAGPgE,GAAc,WAKhB,OAFEzN,EAAiB0N,UAAY5I,EAAKxB,EAAe,aAGzBhC,EAAIoM,UAAY,IACrC7I,QAAQzD,EAAkBsJ,IAC1B7F,QAAQ,sDAAuD,MAC/DA,QAAQ,YAAa,OAASzE,GAKjCsN,GAAWD,KAOXE,GAAW,EAEXC,GAAc,SAAUC,EAAIC,GAC9B,GAAKjB,GAAL,CAEA,IAAIkB,EAASrI,EAAOiF,GAAa,CAC/BI,KAAM,SACNiD,YAAaF,EAAOD,EAAKrE,GAAQwD,UAenC,GAXI1G,GAAsB,OACxByH,EAAOE,SAAW1G,KAAK2G,OAAOxH,KAAQ4E,GAAQqC,IAphBnC,MAshBbA,GAAW,EACXrC,GAAQ5E,KAGJJ,GAAsB,UACxByH,EAAOxC,SAAWhE,KAAK4G,IAAI,EAAG5C,GAAU6C,OAGtCN,IAAS9M,EAAIqN,WAEfjF,GAAS2E,EAAQ3N,EAAcE,QAE/B,IACEU,EAAIqN,WAAWC,KAAKtN,EAApBA,CAAyBoB,EAAa,UAAWJ,EAAU+L,IAC3D,MAAOQ,GAEPnF,GAAS2E,EAAQ3N,EAAcE,MAMrC4B,EACE,mBACA,WACMZ,EAAIkN,QACA,KAAO1L,KAAY/C,GAAS6N,KAClCJ,GAAc9G,MACTiH,IAAYjH,KAAQ8G,IAE7BjN,GAGF2B,EAAqBY,EAAU8K,GAAarN,GAE5C,IAAIkO,GAAOnN,EAAImN,MAAQ,GACnBL,GAAW,WACb,IACE,IAAIM,EAAuBrM,EAAgBQ,IAAiB,EACxD8L,EAASpH,KAAK4G,IAChBM,GAAK9L,IAAiB,EACtB8L,GAAK7L,IAAiB,EACtBP,EAAgBQ,IAAiB,EACjCR,EAAgBM,IAAiB,EACjCN,EAAgBO,IAAiB,GAEnC,OAAO2E,KAAKqH,IACV,IAKI,EAJJrH,KAAK2G,MACF,MAAQ7L,EAAgBwM,WAAa,GAAKH,GACzCC,EACA,IAGN,MAAOxK,IAEP,OADAhE,EAAKgE,IACE,IAIXjC,EAAqB,OAAQ,WAC3BqJ,GAAW6C,KACXlM,EACEM,EACA,WACM+I,GAAW6C,OAAY7C,GAAW6C,OAExC7N,KAQJ,IAgCIuO,GAoCAC,GAAUC,GApEVC,GAAU,SAAUC,GACtB,IAAIlE,EAAO,GAIX,IACEA,EAAOkE,GAAapN,EAAuBZ,EAAI+J,UAC/C,MAAO9G,IACPhE,EAAKgE,IAGP,IAAIgL,EAAyBpP,EAAOgM,IACpC,GAAItE,GAAW0H,GACb,IACEnE,EAAOmE,EAAuBxL,KAAK5D,EAAQ,CAAEiL,KAAMA,KAAWA,EAC9D,MAAO7G,IACPF,EAAe,OAAQE,IAK3B,IA7ZiB,SAAU6G,GAC3B,IAAK,IAAItC,KAAKmD,GAAa,CACzB,IAAIuD,EAAgBvD,GAAYnD,GAChC,GAAK0G,EAAL,CAGA,IAAIC,EA9OI,KA+OND,EAAc,GAAcA,EA/OtB,IA+O8CA,EAEtD,GACEC,IAAerE,GACf,IAAIvE,OACF,IAAM9B,EAAY0K,GAAYxK,QAAQ,SAAU,QAAU,IAC1D,KACAzB,KAAK4H,GAEP,OAAO1K,GAEX,OAAOC,EA2YH+O,CAAatE,GAQjB,MAFY,QAARZ,IAAkBlJ,EAAIqO,OAAMvE,GAAQ9J,EAAIqO,KAAKjK,MAAM,KAAK,IAErD0F,EAPL7K,EAAKuB,EAAiB,YAAcsJ,IAgDpCwE,GAAW,SACbC,EACAC,EACA5H,EACA6H,IAEKA,GAAelI,GAAWK,KAAW6H,EAAc7H,GACxD,IAIM8H,EAJFvG,EAAW5B,GAAWkI,GAAeA,EAAc,aACnDE,EAAc,GACdpL,EAASiL,KAAgD,EAA9BA,EAAc/G,QAAQ,OAGnD+G,GADIE,EAAQF,EAAcpK,MAAM,MACVwK,QACtBD,EAAc,IAAMD,EAAM5G,KAAK,MAGjC,IAAIgC,EAAOiE,GAAQS,GAGfK,EAAU/E,EAAO6E,EACrB,GAAK7E,GAAQuC,IAAgBwC,EAA7B,CAEAxC,GAAewC,EACftG,GAAKuB,KAAOA,EAGR1E,GAAsB,OACxBmD,GAAKuG,eACHzI,KAAK4G,IAAI9L,EAA2B,aAAK,EAAGtC,EAAOkQ,YAAc,IACjE,KACFxG,GAAKyG,gBACH3I,KAAK4G,IACH9L,EAAgBQ,IAAiB,EACjC9C,EAAOoQ,aAAe,IACnB,MAIL7J,GAAsB,MACpBtF,EAAIsB,KAAWmH,GAAKnH,GAAYtB,EAAIsB,IAItCe,GAAUiD,GAAsB,QAClCmD,GAAK2G,aAAe/M,EAAOgN,MAC3B5G,GAAK6G,cAAgBjN,EAAOsL,QAI9B,IAII4B,EAJAC,EAAOzQ,EAAO0Q,YACdC,EAAiB,aAIrB,IACEH,EAAsBC,EAAKG,iBAAiBD,GAAgB,GAAG3F,KAC/D,MAAO5G,IACPhE,EAAKgE,IAGP6K,GAAgBuB,GAC+C,EAA3D,CAAC,SAAU,gBAAgB5H,QAAQ4H,GAGnCC,GACAA,EAAKE,KACwC,EAA7C,CAAC,EAAG,GAAG/H,QAAQ6H,EAAKE,GAAgB3F,MAGxC,IAAI6F,EAA0BlD,GAC1BA,GAASpI,MA5vBH,KA4vBgB,GACtBlF,EACJ2O,GAAWrB,IACgD,EAAvD5B,GAAmBnD,QAAQiI,IAC3BA,GAA2BxP,EAC3Bb,EAGJkJ,GAAKoH,OACH,QAAQzN,KAAKqK,OAAkBgC,GAAeT,GAC1CzO,GACCwO,GAEPjH,EAAWD,GAAeC,EAAU,CAClCiD,KAAMrK,EACNsK,KAAMvB,GAAKuB,OAGb,IAAI8F,EAAsB,WACxBnP,EAA2BrB,EAC3B,IAAIyQ,EACFtB,GAAeT,KAAkB1I,GAAsB,MA9H1C,SACjBmJ,EACAuB,EACAjC,EACAvG,EACAV,EACAuB,GAEIoG,GAAa7B,GAAY,GAAKpE,GAAQwD,QAAS1M,GAC/CuM,KAAoBrD,GAAQwD,QAAUpG,MAE1C,IAAIqK,EAAcvG,GAAkBuE,KAChCiC,EAAQ9I,GAAe4I,EAAkBxI,GAE7CY,GACE,CACEyE,GAAIrE,GAAQwD,QACZjC,KAAMrK,EACNgN,UAAWsD,GAAoBjC,EAAWrB,GAAW,KACrDwD,MAAOA,EACP9K,EAAGA,GAEH0B,SAAU9F,EAAU8F,IAEtBuB,GAGFyF,GAAmBpB,GACnBA,GAAWuD,EAEX/N,IAiGEiO,CACE1B,EACAsB,EACAhC,GACAc,EACA/H,EACAuB,IAIJ,GAAK1H,EAmBHmP,SAjBA,IACMrO,GAAUgF,GAAWhF,EAAO2O,sBAC9B3O,EACG2O,qBAAqB,CAACrO,EAAcC,IACpCqO,KAAK,SAAUC,GACd9H,GAAQ+H,QAAUD,EAAkBvO,GACpCyG,GAAQgI,WAAaF,EAAkBtO,GACvC8N,MAEDxG,SAAMwG,GAETA,IAEF,MAAOvC,GACPuC,OAWFW,GAAM1R,EAAO2R,QACbC,GAAeF,GAAMA,GAAIG,UAAYxR,EACrCyR,GAAM9R,EAAO+R,cACbC,GAAgB,YAIhBrG,IAAeiG,IAAgBK,OAASH,KAqB1CJ,GAAIG,WAnBEK,GAAOR,GADiB1G,GAoBAgH,IAlBrB,WACL,IAEI7G,EAFAtF,EAAMhC,UACNsO,EAAKD,GAAKjO,MAAMmO,KAAMvM,GAY1B,OAVI6B,GAAWuK,OACb9G,EAAQ,IAAI8G,MAAMjH,KAIlBG,EAAQ5J,EAAI8Q,YAAY,UAClBC,UAAUtH,GAAMzK,EAASA,GAEjC4K,EAAMtH,UAAYgC,EAClBiM,GAAI3G,GACGgH,IAMXhQ,EACE6P,GACA,WACEvC,GAAS,IAEXjP,GAGF2B,EACE,WACA,WACEsN,GAAS,IAEXjP,IAKAmL,IAAuB,QAARtB,IAAkB,iBAAkBrK,GACrDmC,EACE,aACA,WACEsN,GAAS,IAEXjP,GAIAmL,IAAa8D,KAEjB,IAAI8C,GAAiB,SAAUtH,EAAMlD,EAAUuB,GAC7CmG,GAAS,EAAGxE,EAAMlD,EAAUuB,IAE9BtJ,EAAO6H,GAAY,IAAMlH,GAAgB4R,GACzC,IAAIC,GAAkBC,MAAyB9R,EAC1CX,EAAOwS,MAAkBxS,EAAOwS,IAAmBD,IAOxD,IAAIG,GAAa,CAAC,SAAU,UAExBC,GAAY,SAAUxH,EAAOpD,EAAU6H,EAAapG,IACjDoG,GAAelI,GAAWK,KAAW6H,EAAc7H,GAExD,IAAI6K,EAAkBlL,GAAWyD,GAC7B7B,EAAW5B,GAAWkI,GAAeA,EAAc,aACnDiD,SAAmB1H,EAEvB,GAAIuH,GAAW9J,QAAQiK,GAAa,IAAMD,EAExC,OADA1O,EAAe0H,GAAmBhL,EAAY,aAAeiS,GACtDvJ,IAGT,IACE,GAAIsJ,EAAiB,CACnB,IAAIE,EAAc3H,IAClB,GAAIuH,GAAW9J,eAAekK,GAAe,EAK3C,OAJA5O,EACE0H,GACAT,EAAQ,uBAAyB2H,GAE5BxJ,IAET6B,EAAQ2H,GAEV,MAAO1O,IAEP,OADAF,EAAe0H,GAAmBxH,IAC3BkF,IAGT6B,GAAS,GAAKA,GAAOrG,QAAQ,eAAgB,KAAKA,QAAQ,WAAY,IAEtE,IAAIiO,EAAc,CAAE/H,KAAMpK,EAAWuK,MAAOA,GACxC6H,GAAa/D,IAAiB9L,EAAQ,EAE1C4E,EAAWD,GAAeC,EAAUgL,GAEhC5H,GACF9B,GACE1D,EAAOoN,EAAa,CAClBjF,GAAIjH,KACJsK,MAAO9I,IAAgB2K,GACvBrF,UACGqF,GAAahE,KAAazI,GAAsB,KAC7CwI,GACA,KAENhH,SAAU9F,EAAU8F,KAEtBuB,EACAjJ,EACAmJ,IAKFyJ,GAAmB,SAAU9H,EAAOpD,EAAUuB,EAAUE,GAC1DmJ,GAAUxH,EAAOpD,EAAUuB,EAAUE,IAIlCxJ,EAAO4L,MACV5L,EAAO4L,IAAqBqH,IAE9B,IAAIC,GAAYlT,EAAO4L,IAGnBuH,GAAQD,IAAaA,GAAU1K,EAAI0K,GAAU1K,EAAI,GAMrD,IAAK,IAAI2C,MAHTnL,EAAO4L,IAAqBqH,GAGVE,GACZ9O,EAAQ8O,GAAOhI,MACjB/F,MAAMC,QAAQ8N,GAAMhI,KAChBwH,GAAU1O,MAAM,KAAMkP,GAAMhI,KAC5BwH,GAAUQ,GAAMhI,MAIxB,IA0CMiI,GA1CFC,GAAc,SAAUlI,GAE1B,IADA,IAAImI,EAAUnI,EAAMoI,OAElBD,GACAA,IAAY/R,KACV+R,EAAQrO,cAAkD,OAAlCF,EAAKuO,EAAS,kBAExCA,EAAUA,EAAQE,WAEpB,GAAKF,GAAWA,IAAY/R,EAA5B,CACA,IAAIkS,EAA6B,SAApBH,EAAQI,QACjBvP,EAAOY,EAAKuO,EAAS,gBACzB,GAAKnP,GAAQsP,IAA2B,WAAftI,EAAMH,MAA/B,CAIA,IAFA,IASM2I,EATF5L,EAAW,CAAE6L,IAAKN,EAAQI,QAAQG,eAClCC,EAAaR,EAAQQ,WAChBnL,EAAI,EAAGA,EAAImL,EAAWxO,OAAQqD,IAAK,CAC1C,IAAI3D,EAAY8O,EAAWnL,GAC0B,IAAjD3D,EAAUb,KAAKyE,QAAQ,wBACzBb,EAAS/C,EAAUb,KAAKR,MAAM,IAAImB,QAAQ,KAAM,MAC9CE,EAAU0G,OAEZ+H,IACEE,EAASxI,EAAM4I,UACnBhM,EAASiM,YAAcL,GAClBA,EAAOM,aAAeN,EAAOjI,OAAS,IACpC5G,QAAQ,OAAQ,KAChBoP,OACAvQ,MAAM,EAAG,KACZ,IAENgP,GAAUxO,EAAM4D,EAAU1H,EAAcE,MAG1CgB,EAAIa,iBAAiB,QAASiR,GAAa7S,GAC3Ce,EAAIa,iBAAiB,SAAUiR,GAAa7S,GAI1CP,EAAiBmT,YAAc7S,GAC/BwE,EAAKxB,EAAe,eAAiB9C,IAEjC2S,GAAY,WACd,GACG,UAAU/P,KAAK9B,EAAI4S,MAAQ,KAAO5S,EAAImN,MAAQnN,EAAImN,KAAKuF,cAG1D,IACE,IAAIG,EAAU,IAAIpU,EAAOqU,eACzBD,EAAQE,KAAK,OAAQnT,EAAIoT,KAAMhU,GAC/B6T,EAAQnK,OAAS,WACQ,MAAnBmK,EAAQI,QACV7B,GAAU,WAAY,CACpB8B,IAAKtT,EAAI6L,SAAW,KAAOrC,GAAkBxJ,EAAI+J,SACjDsJ,OAAQ,OAGdJ,EAAQM,OACR,MAAOtQ,OAEY,YAAnB7C,EAAIoT,WACNpT,EAAIa,iBAAiB,mBAAoBgR,GAAW5S,GACjD4S,MAEP,MAAO5E,IACPrO,EAAUqO,IAnNY,IAAUxD,GACxBkH,GAvoBkBxG,GAnN9B,CA+iCE1L,OACA,uBACA"} \ No newline at end of file +{"version":3,"file":"e.source.js","sources":["e.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData, keepalive) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n var imageUrl =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n\n // Events must survive navigation without taking over links or forms.\n if (keepalive && window.fetch) {\n try {\n window\n .fetch(imageUrl, {\n keepalive: trueVar,\n mode: \"no-cors\",\n credentials: \"omit\",\n })\n .catch(function () {\n image.src = imageUrl;\n });\n return;\n } catch (error) {}\n }\n image.src = imageUrl;\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function (raw) {\n // Customers can overwrite their referrer, here we check for that\n var referrer =\n overwriteOptions.referrer ||\n attr(scriptElement, \"referrer\") ||\n doc.referrer ||\n \"\";\n\n if (raw) return referrer;\n return (\n referrer\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch = \"\";\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n var pathKey = path + querySearch;\n if (!path || lastSendPath == pathKey) return;\n\n lastSendPath = pathKey;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // Only the first pageview can use a Cloudflare referrer as a unique arrival.\n page.unique =\n isPushState || userNavigated\n ? falseVar\n : !sameSite || (!pages && /[?&]__cf_/.test(getReferrer(trueVar)));\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n var manualPageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n window[namespace + \"_\" + pageviewText] = manualPageview;\n var defaultPageview = defaultNamespace + \"_\" + pageviewText;\n if (!window[defaultPageview]) window[defaultPageview] = manualPageview;\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw, keepalive) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback,\n undefinedVar,\n keepalive\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback, keepalive) {\n sendEvent(event, metadata, callback, keepalive);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n\n var inlineEvent = function (event) {\n var element = event.target;\n while (\n element &&\n element !== doc &&\n (!element.getAttribute || attr(element, \"simple-event\") === null)\n )\n element = element.parentNode;\n\n if (!element || element === doc) return;\n var isForm = element.tagName === \"FORM\";\n var name = attr(element, \"simple-event\");\n if (!name || isForm !== (event.type === \"submit\")) return;\n\n var metadata = { tag: element.tagName.toLowerCase() };\n var attributes = element.attributes;\n for (var i = 0; i < attributes.length; i++) {\n var attribute = attributes[i];\n if (attribute.name.indexOf(\"data-simple-event-\") === 0)\n metadata[attribute.name.slice(18).replace(/-/g, \"_\")] =\n attribute.value;\n }\n if (isForm) {\n var button = event.submitter;\n metadata.button_text = button\n ? (button.textContent || button.value || \"\")\n .replace(/\\s+/g, \" \")\n .trim()\n .slice(0, 200)\n : \"\";\n }\n sendEvent(name, metadata, undefinedVar, trueVar);\n };\n\n doc.addEventListener(\"click\", inlineEvent, falseVar);\n doc.addEventListener(\"submit\", inlineEvent, falseVar);\n\n // 404 confirmation adds a request, so existing installs must opt in.\n if (\n overwriteOptions.detect404 === trueVar ||\n attr(scriptElement, \"detect-404\") == trueText\n ) {\n var detect404 = function () {\n if (\n !/\\b404\\b/.test(doc.title + \" \" + (doc.body && doc.body.textContent))\n )\n return;\n try {\n var request = new window.XMLHttpRequest();\n request.open(\"HEAD\", loc.href, trueVar);\n request.onload = function () {\n if (request.status === 404)\n sendEvent(\"page_404\", {\n url: loc.protocol + \"//\" + definedHostname + loc.pathname,\n status: 404,\n });\n };\n request.send();\n } catch (error) {}\n };\n if (doc.readyState === \"loading\")\n doc.addEventListener(\"DOMContentLoaded\", detect404, falseVar);\n else detect404();\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_events_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","keepalive","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","imageUrl","key","fetch","mode","credentials","catch","src","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","protocol","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","raw","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","parts","querySearch","shift","pathKey","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","manualPageview","defaultPageview","defaultNamespace","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue","detect404","inlineEvent","element","target","parentNode","isForm","tagName","button","tag","toLowerCase","attributes","submitter","button_text","textContent","trim","title","request","XMLHttpRequest","open","href","status","url","send","readyState"],"mappings":"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"} \ No newline at end of file diff --git a/dist/latest/custom/latest.dev.js b/dist/latest/custom/latest.dev.js index 4133bd77..4efdcd15 100644 --- a/dist/latest/custom/latest.dev.js +++ b/dist/latest/custom/latest.dev.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-15; ee41; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-15; 25ef; v12) */ /* eslint-env browser */ (function ( @@ -543,13 +543,17 @@ var page = {}; var lastSendPath; - var getReferrer = function () { + var getReferrer = function (raw) { // Customers can overwrite their referrer, here we check for that - var overwrittenReferrer = - overwriteOptions.referrer || attr(scriptElement, "referrer"); + var referrer = + overwriteOptions.referrer || + attr(scriptElement, "referrer") || + doc.referrer || + ""; + if (raw) return referrer; return ( - (overwrittenReferrer || doc.referrer || "") + referrer .replace(locationHostname, definedHostname) .replace(/^https?:\/\/((m|l|w{2,3}([0-9]+)?)\.)?([^?#]+)(.*)$/, "$4") .replace(/^([^/]+)$/, "$1") || undefinedVar @@ -800,11 +804,11 @@ currentReferrerHostname == locationHostname : falseVar; - // We set unique variable based on pushstate or back navigation, if no match we check the referrer + // Only the first pageview can use a Cloudflare referrer as a unique arrival. page.unique = - /__cf_/.test(getReferrer()) || isPushState || userNavigated + isPushState || userNavigated ? falseVar - : !sameSite; + : !sameSite || (!pages && /[?&]__cf_/.test(getReferrer(trueVar))); metadata = appendMetadata(metadata, { type: pageviewText, diff --git a/dist/latest/custom/latest.js b/dist/latest/custom/latest.js index f81adbaa..ae0db61d 100644 --- a/dist/latest/custom/latest.js +++ b/dist/latest/custom/latest.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-15; ddc9; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-15; be19; v12) */ -!function(v,t,e,n,m){try{var g=undefined,y=!0,_=!1,r="true",a="https:",b="pageview",l="event",i="error",o=v.console,c="doNotTrack",w=v.navigator,s=v.location,O=s.host,u=v.document,f=w.userAgent,p="Not sending request ",d=p+"when ",x=_,h=encodeURIComponent,E=decodeURIComponent,M=JSON.stringify,S=v.addEventListener,k="https://"+e,A=u.documentElement||{},q="language",C="Height",D="scroll",$=w.userAgentData,j=D+C,H="offset"+C,R="client"+C,L="pagehide",N="platform",P="platformVersion",T="https://docs.simpleanalytics.com",U=0,I=/(bot|spider|crawl)/i.test(f)&&!/(cubot)/i.test(f),V=v.screen,B=u.currentScript||u.querySelector('script[src*="'+e+'"]');m=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){m("Error in your "+t+" function:",e)},z=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},W=function(t){return"string"==typeof t},G=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},J=function(t,e){return t&&t.getAttribute("data-"+e)},X=function(t){return Array.isArray(t)?t:W(t)&&t.length?t.split(/, ?/):[]},Y=function(t){return t&&t.constructor===Object},Z=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},it=function(t){return"function"==typeof t},ot="namespace",ct=t[ot]||J(B,ot)||"sa",st=function(t,e){var n=v[ct+"_metadata"];Y(n)&&(t=Z(t,n));var r=v[kt];if(!it(r))return kt&&m(kt+" not found, set window."+kt),t;try{return Z(t,r.call(v,Z(t,e)))}catch(a){F("metadata",a)}},ut=t.strictUtm||J(B,"strict-utm")==r,lt=function(i,t){tt=!i&&nt("q")?"":_;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");tt!==_&&0"); +!function(v,n,e,r,m){try{var g=undefined,y=!0,_=!1,t="true",a="https:",b="pageview",l="event",i="error",o=v.console,c="doNotTrack",w=v.navigator,s=v.location,O=s.host,u=v.document,f=w.userAgent,p="Not sending request ",d=p+"when ",x=_,h=encodeURIComponent,E=decodeURIComponent,M=JSON.stringify,S=v.addEventListener,k="https://"+e,A=u.documentElement||{},q="language",C="Height",D="scroll",$=w.userAgentData,j=D+C,H="offset"+C,R="client"+C,L="pagehide",N="platform",P="platformVersion",T="https://docs.simpleanalytics.com",U=0,I=/(bot|spider|crawl)/i.test(f)&&!/(cubot)/i.test(f),V=v.screen,B=u.currentScript||u.querySelector('script[src*="'+e+'"]');m=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){m("Error in your "+t+" function:",e)},z=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},W=function(t){return"string"==typeof t},G=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},J=function(t,e){return t&&t.getAttribute("data-"+e)},X=function(t){return Array.isArray(t)?t:W(t)&&t.length?t.split(/, ?/):[]},Y=function(t){return t&&t.constructor===Object},Z=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},it=function(t){return"function"==typeof t},ot="namespace",ct=n[ot]||J(B,ot)||"sa",st=function(t,e){var n=v[ct+"_metadata"];Y(n)&&(t=Z(t,n));var r=v[kt];if(!it(r))return kt&&m(kt+" not found, set window."+kt),t;try{return Z(t,r.call(v,Z(t,e)))}catch(a){F("metadata",a)}},ut=n.strictUtm||J(B,"strict-utm")==t,lt=function(i,t){tt=!i&&nt("q")?"":_;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");tt!==_&&0"); //# sourceMappingURL=latest.js.map \ No newline at end of file diff --git a/dist/latest/custom/latest.js.map b/dist/latest/custom/latest.js.map index 4cdee688..aa2a709d 100644 --- a/dist/latest/custom/latest.js.map +++ b/dist/latest/custom/latest.js.map @@ -1 +1 @@ -{"version":3,"file":"latest.source.js","sources":["latest.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData, keepalive) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n var imageUrl =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n\n // Events must survive navigation without taking over links or forms.\n if (keepalive && window.fetch) {\n try {\n window\n .fetch(imageUrl, {\n keepalive: trueVar,\n mode: \"no-cors\",\n credentials: \"omit\",\n })\n .catch(function () {\n image.src = imageUrl;\n });\n return;\n } catch (error) {}\n }\n image.src = imageUrl;\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch = \"\";\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n var pathKey = path + querySearch;\n if (!path || lastSendPath == pathKey) return;\n\n lastSendPath = pathKey;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n var manualPageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n window[namespace + \"_\" + pageviewText] = manualPageview;\n var defaultPageview = defaultNamespace + \"_\" + pageviewText;\n if (!window[defaultPageview]) window[defaultPageview] = manualPageview;\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw, keepalive) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback,\n undefinedVar,\n keepalive\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback, keepalive) {\n sendEvent(event, metadata, callback, keepalive);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n\n var inlineEvent = function (event) {\n var element = event.target;\n while (\n element &&\n element !== doc &&\n (!element.getAttribute || attr(element, \"simple-event\") === null)\n )\n element = element.parentNode;\n\n if (!element || element === doc) return;\n var isForm = element.tagName === \"FORM\";\n var name = attr(element, \"simple-event\");\n if (!name || isForm !== (event.type === \"submit\")) return;\n\n var metadata = { tag: element.tagName.toLowerCase() };\n var attributes = element.attributes;\n for (var i = 0; i < attributes.length; i++) {\n var attribute = attributes[i];\n if (attribute.name.indexOf(\"data-simple-event-\") === 0)\n metadata[attribute.name.slice(18).replace(/-/g, \"_\")] =\n attribute.value;\n }\n if (isForm) {\n var button = event.submitter;\n metadata.button_text = button\n ? (button.textContent || button.value || \"\")\n .replace(/\\s+/g, \" \")\n .trim()\n .slice(0, 200)\n : \"\";\n }\n sendEvent(name, metadata, undefinedVar, trueVar);\n };\n\n doc.addEventListener(\"click\", inlineEvent, falseVar);\n doc.addEventListener(\"submit\", inlineEvent, falseVar);\n\n // 404 confirmation adds a request, so existing installs must opt in.\n if (\n overwriteOptions.detect404 === trueVar ||\n attr(scriptElement, \"detect-404\") == trueText\n ) {\n var detect404 = function () {\n if (\n !/\\b404\\b/.test(doc.title + \" \" + (doc.body && doc.body.textContent))\n )\n return;\n try {\n var request = new window.XMLHttpRequest();\n request.open(\"HEAD\", loc.href, trueVar);\n request.onload = function () {\n if (request.status === 404)\n sendEvent(\"page_404\", {\n url: loc.protocol + \"//\" + definedHostname + loc.pathname,\n status: 404,\n });\n };\n request.send();\n } catch (error) {}\n };\n if (doc.readyState === \"loading\")\n doc.addEventListener(\"DOMContentLoaded\", detect404, falseVar);\n else detect404();\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_latest_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","keepalive","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","imageUrl","key","fetch","mode","credentials","catch","src","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","protocol","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","parts","querySearch","shift","pathKey","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","manualPageview","defaultPageview","defaultNamespace","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue","detect404","inlineEvent","element","target","parentNode","isForm","tagName","button","tag","toLowerCase","attributes","submitter","button_text","textContent","trim","title","request","XMLHttpRequest","open","href","status","url","send","readyState"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"latest.source.js","sources":["latest.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData, keepalive) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n var imageUrl =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n\n // Events must survive navigation without taking over links or forms.\n if (keepalive && window.fetch) {\n try {\n window\n .fetch(imageUrl, {\n keepalive: trueVar,\n mode: \"no-cors\",\n credentials: \"omit\",\n })\n .catch(function () {\n image.src = imageUrl;\n });\n return;\n } catch (error) {}\n }\n image.src = imageUrl;\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function (raw) {\n // Customers can overwrite their referrer, here we check for that\n var referrer =\n overwriteOptions.referrer ||\n attr(scriptElement, \"referrer\") ||\n doc.referrer ||\n \"\";\n\n if (raw) return referrer;\n return (\n referrer\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch = \"\";\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n var pathKey = path + querySearch;\n if (!path || lastSendPath == pathKey) return;\n\n lastSendPath = pathKey;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // Only the first pageview can use a Cloudflare referrer as a unique arrival.\n page.unique =\n isPushState || userNavigated\n ? falseVar\n : !sameSite || (!pages && /[?&]__cf_/.test(getReferrer(trueVar)));\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n var manualPageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n window[namespace + \"_\" + pageviewText] = manualPageview;\n var defaultPageview = defaultNamespace + \"_\" + pageviewText;\n if (!window[defaultPageview]) window[defaultPageview] = manualPageview;\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw, keepalive) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback,\n undefinedVar,\n keepalive\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback, keepalive) {\n sendEvent(event, metadata, callback, keepalive);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n\n var inlineEvent = function (event) {\n var element = event.target;\n while (\n element &&\n element !== doc &&\n (!element.getAttribute || attr(element, \"simple-event\") === null)\n )\n element = element.parentNode;\n\n if (!element || element === doc) return;\n var isForm = element.tagName === \"FORM\";\n var name = attr(element, \"simple-event\");\n if (!name || isForm !== (event.type === \"submit\")) return;\n\n var metadata = { tag: element.tagName.toLowerCase() };\n var attributes = element.attributes;\n for (var i = 0; i < attributes.length; i++) {\n var attribute = attributes[i];\n if (attribute.name.indexOf(\"data-simple-event-\") === 0)\n metadata[attribute.name.slice(18).replace(/-/g, \"_\")] =\n attribute.value;\n }\n if (isForm) {\n var button = event.submitter;\n metadata.button_text = button\n ? (button.textContent || button.value || \"\")\n .replace(/\\s+/g, \" \")\n .trim()\n .slice(0, 200)\n : \"\";\n }\n sendEvent(name, metadata, undefinedVar, trueVar);\n };\n\n doc.addEventListener(\"click\", inlineEvent, falseVar);\n doc.addEventListener(\"submit\", inlineEvent, falseVar);\n\n // 404 confirmation adds a request, so existing installs must opt in.\n if (\n overwriteOptions.detect404 === trueVar ||\n attr(scriptElement, \"detect-404\") == trueText\n ) {\n var detect404 = function () {\n if (\n !/\\b404\\b/.test(doc.title + \" \" + (doc.body && doc.body.textContent))\n )\n return;\n try {\n var request = new window.XMLHttpRequest();\n request.open(\"HEAD\", loc.href, trueVar);\n request.onload = function () {\n if (request.status === 404)\n sendEvent(\"page_404\", {\n url: loc.protocol + \"//\" + definedHostname + loc.pathname,\n status: 404,\n });\n };\n request.send();\n } catch (error) {}\n };\n if (doc.readyState === \"loading\")\n doc.addEventListener(\"DOMContentLoaded\", detect404, falseVar);\n else detect404();\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_latest_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","keepalive","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","imageUrl","key","fetch","mode","credentials","catch","src","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","protocol","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","raw","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","parts","querySearch","shift","pathKey","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","manualPageview","defaultPageview","defaultNamespace","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue","detect404","inlineEvent","element","target","parentNode","isForm","tagName","button","tag","toLowerCase","attributes","submitter","button_text","textContent","trim","title","request","XMLHttpRequest","open","href","status","url","send","readyState"],"mappings":"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"} \ No newline at end of file diff --git a/dist/latest/custom/light.js b/dist/latest/custom/light.js index cd5a49b2..9aba4df4 100644 --- a/dist/latest/custom/light.js +++ b/dist/latest/custom/light.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-15; 72af; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-15; 40ea; v12) */ !function(f,e,t,m){try{var u=undefined,n="https:",r=f.console,a="doNotTrack",g=f.navigator,p=f.location,h=p.host,i=f.document,o=g.userAgent,c="Not sending request ",v=!1,s=encodeURIComponent,d=decodeURIComponent,l=JSON.stringify,y=f.addEventListener,_="https://"+t,b=(i.documentElement,"language"),w=g.userAgentData,O="platform",S="platformVersion",j="https://docs.simpleanalytics.com",k=/(bot|spider|crawl)/i.test(o)&&!/(cubot)/i.test(o),x=i.currentScript||i.querySelector('script[src*="'+t+'"]');m=function(){var e=[].slice.call(arguments);return e.unshift("Simple Analytics:"),Function.prototype.apply.call(r.warn,r,e)};var E=function(e){return"string"==typeof e},A=function(e,t){return e&&e.getAttribute("data-"+t)},$=function(){for(var e,t,n,r={},a=arguments,i=0;i>e/4).toString(16)})}catch(r){return e.replace(n,function(e){var t=16*Math.random()|0;return(e<2?t:3&t|8).toString(16)})}},N=function(e){return"function"==typeof e},R="namespace",U=e[R]||A(x,R)||"sa",V=e.strictUtm||"true"==A(x,"strict-utm"),B=U+"_loaded";if(1==f[B])return m(c+"twice");f.sa_event_loaded=!0,f[B]=!0;var C,H=function(t,e,n,r){t=n?t:$(J,M,t),g.brave&&!n&&(t.brave=!0),g._duckduckgoloader_&&!n&&(t.duck=!0);var a=new Image,i=_+"/simple.gif?"+Object.keys(t).filter(function(e){return t[e]!=u}).map(function(e){return s(e)+"="+s(t[e])}).join("&")+"&time="+Date.now();a.src=i},T=e.hostname||A(x,"hostname"),F=T||h,z={version:"custom_light_12",hostname:F};e.mode||A(x,"mode");try{C=Intl.DateTimeFormat().resolvedOptions().timeZone}catch(X){m(X)}k&&(z.bot=!0);var J=$(z,{ua:o,https:p.protocol==n,timezone:C,page_id:I(),session_id:I()});if(J.sri=!1,w&&(J.mobile=w.mobile,J.brands=l(w.brands)),F!==h&&(J.hostname_original=h),a in g&&"1"==g[a])return m("Not sending request when "+a+" is enabled. See "+j+"/dnt");-1!=h.indexOf(".")&&!/^[0-9.:]+$/.test(h)||T||m("Set hostname on "+h+". See "+j+"/overwrite-domain-name");var L,M={},P=(e.referrer||A(x,"referrer")||i.referrer||"").replace(h,F).replace(/^https?:\/\/((m|l|w{2,3}([0-9]+)?)\.)?([^?#]+)(.*)$/,"$4").replace(/^([^/]+)$/,"$1")||u,Z=function(e,t){var n=$(z,{type:"append",original_id:t?e:J.page_id});if(t||!g.sendBeacon)H(n,0,!0);else try{g.sendBeacon.bind(g)(_+"/append",l(n))}catch(r){H(n,0,!0)}};y("pagehide",Z,!1);var G,K,Q=function(e){var t="";try{t=e||d(p.pathname)}catch(X){m(X)}return t},W=function(e,t,n,r,a,i){e&&Z(""+J.page_id,!0),J.page_id=I();var o,c=F+Q(),s=(o=t,(r||p.search).slice(1).split("&").filter(function(e){return!o&&new RegExp("^((utm_)"+(V?"":"?")+"(source|medium|content|term|campaign)"+(V?"":"|ref")+")=","i").test(e)}).join("&")||u);H({id:J.page_id,type:"pageview",referrer:!t||n?P:null,query:s}),P=c,0};!function(e,t,n,r){!r&&N(n)&&(r=n);N(r);var a,i="";E(t)&&-1"); //# sourceMappingURL=light.js.map \ No newline at end of file diff --git a/dist/latest/custom/light.js.map b/dist/latest/custom/light.js.map index 8d2613a2..0a3a27da 100644 --- a/dist/latest/custom/light.js.map +++ b/dist/latest/custom/light.js.map @@ -1 +1 @@ -{"version":3,"file":"light.source.js","sources":["light.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n\n var collectMetricByString = function (metricAbbreviation) {\n // eslint-disable-next-line no-unreachable\n return true;\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n if (ignore) return falseVar;\n // eslint-disable-next-line no-redeclare\n var regex =\n \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \")=\";\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n return q || undefinedVar;\n };\n\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData, keepalive) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n var imageUrl =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n\n image.src = imageUrl;\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n\n\n\n\n\n\n\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n // eslint-disable-next-line no-redeclare\n var bot = isBotAgent;\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n\n\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch = \"\";\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n var pathKey = path + querySearch;\n if (!path || lastSendPath == pathKey) return;\n\n lastSendPath = pathKey;\n page.path = path;\n\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n sameSite = referrer\n ? referrer.split(slash)[0] == locationHostname\n : falseVar;\n\n\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n\n\n pageview();\n\n } catch (e) {\n warn(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_light_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","warn","undefinedVar","undefined","https","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","language","documentElement","uaData","userAgentData","platformText","platformVersionText","docsUrl","isBotAgent","test","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","isString","string","attr","attribute","getAttribute","assign","obj","prop","object","to","arg","index","length","nextSource","constructor","Object","nextKey","hasOwnProperty","settings","sa_settings","logSettings","keys","Date","now","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","replace","c","getRandomValues","Uint8Array","toString","error","r","Math","random","isFunction","func","namespaceText","namespace","strictUtm","loadedVariable","sa_event_loaded","timezone","sendData","data","callback","onlyThisData","keepalive","payload","page","brave","_duckduckgoloader_","duck","image","Image","imageUrl","filter","key","map","join","src","overwrittenHostname","hostname","definedHostname","basePayload","version","mode","Intl","DateTimeFormat","resolvedOptions","timeZone","bot","ua","protocol","page_id","session_id","sri","mobile","brands","hostname_original","indexOf","lastSendPath","referrer","sendOnLeave","id","push","append","type","original_id","sendBeacon","bind","e","sameSite","userNavigated","getPath","overwrite","path","pathname","sendPageView","isPushState","deleteSourceInfo","search","metadata","ignoreSource","currentPage","query","split","keyValue","RegExp","pages","pathOverwrite","callbackRaw","parts","querySearch","shift","pathKey","performaceEntryType","perf","performance","navigationText","getEntriesByType","triggerSendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","pageview"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"light.source.js","sources":["light.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n\n var collectMetricByString = function (metricAbbreviation) {\n // eslint-disable-next-line no-unreachable\n return true;\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n if (ignore) return falseVar;\n // eslint-disable-next-line no-redeclare\n var regex =\n \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \")=\";\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n return q || undefinedVar;\n };\n\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData, keepalive) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n var imageUrl =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n\n image.src = imageUrl;\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n\n\n\n\n\n\n\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n // eslint-disable-next-line no-redeclare\n var bot = isBotAgent;\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function (raw) {\n // Customers can overwrite their referrer, here we check for that\n var referrer =\n overwriteOptions.referrer ||\n attr(scriptElement, \"referrer\") ||\n doc.referrer ||\n \"\";\n\n return (\n referrer\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n\n\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch = \"\";\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n var pathKey = path + querySearch;\n if (!path || lastSendPath == pathKey) return;\n\n lastSendPath = pathKey;\n page.path = path;\n\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n sameSite = referrer\n ? referrer.split(slash)[0] == locationHostname\n : falseVar;\n\n\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n\n\n pageview();\n\n } catch (e) {\n warn(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_light_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","warn","undefinedVar","undefined","https","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","language","documentElement","uaData","userAgentData","platformText","platformVersionText","docsUrl","isBotAgent","test","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","isString","string","attr","attribute","getAttribute","assign","obj","prop","object","to","arg","index","length","nextSource","constructor","Object","nextKey","hasOwnProperty","settings","sa_settings","logSettings","keys","Date","now","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","replace","c","getRandomValues","Uint8Array","toString","error","r","Math","random","isFunction","func","namespaceText","namespace","strictUtm","loadedVariable","sa_event_loaded","timezone","sendData","data","callback","onlyThisData","keepalive","payload","page","brave","_duckduckgoloader_","duck","image","Image","imageUrl","filter","key","map","join","src","overwrittenHostname","hostname","definedHostname","basePayload","version","mode","Intl","DateTimeFormat","resolvedOptions","timeZone","bot","ua","protocol","page_id","session_id","sri","mobile","brands","hostname_original","indexOf","lastSendPath","referrer","sendOnLeave","id","push","append","type","original_id","sendBeacon","bind","e","sameSite","userNavigated","getPath","overwrite","path","pathname","sendPageView","isPushState","deleteSourceInfo","search","metadata","ignoreSource","currentPage","query","split","keyValue","RegExp","pages","pathOverwrite","callbackRaw","parts","querySearch","shift","pathKey","performaceEntryType","perf","performance","navigationText","getEntriesByType","triggerSendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","pageview"],"mappings":"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"} \ No newline at end of file diff --git a/dist/latest/custom/proxy.js b/dist/latest/custom/proxy.js index 1eef4705..6a7b7e19 100644 --- a/dist/latest/custom/proxy.js +++ b/dist/latest/custom/proxy.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-15; b4e1; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-15; b3bb; v12) */ -!function(v,t,e,n,m){try{var g=undefined,y=!0,_=!1,r="true",a="https:",b="pageview",l="event",i="error",o=v.console,c="doNotTrack",w=v.navigator,s=v.location,x=s.host,u=v.document,f=w.userAgent,p="Not sending request ",d=p+"when ",O=_,h=encodeURIComponent,E=decodeURIComponent,M=JSON.stringify,S=v.addEventListener,k="https://"+e,A=u.documentElement||{},q="language",C="Height",D="scroll",$=w.userAgentData,j=D+C,H="offset"+C,R="client"+C,L="pagehide",N="platform",P="platformVersion",T="https://docs.simpleanalytics.com",U=0,I=/(bot|spider|crawl)/i.test(f)&&!/(cubot)/i.test(f),V=v.screen,B=u.currentScript||u.querySelector('script[src*="'+e+'"]');m=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){m("Error in your "+t+" function:",e)},z=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},W=function(t){return"string"==typeof t},G=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},J=function(t,e){return t&&t.getAttribute("data-"+e)},X=function(t){return Array.isArray(t)?t:W(t)&&t.length?t.split(/, ?/):[]},Y=function(t){return t&&t.constructor===Object},Z=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},it=function(t){return"function"==typeof t},ot="namespace",ct=t[ot]||J(B,ot)||"sa",st=function(t,e){var n=v[ct+"_metadata"];Y(n)&&(t=Z(t,n));var r=v[kt];if(!it(r))return kt&&m(kt+" not found, set window."+kt),t;try{return Z(t,r.call(v,Z(t,e)))}catch(a){F("metadata",a)}},ut=t.strictUtm||J(B,"strict-utm")==r,lt=function(i,t){tt=!i&&nt("q")?"":_;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");tt!==_&&0"); +!function(v,n,e,r,m){try{var g=undefined,y=!0,_=!1,t="true",a="https:",b="pageview",l="event",i="error",o=v.console,c="doNotTrack",w=v.navigator,s=v.location,x=s.host,u=v.document,f=w.userAgent,p="Not sending request ",d=p+"when ",O=_,h=encodeURIComponent,E=decodeURIComponent,M=JSON.stringify,S=v.addEventListener,k="https://"+e,A=u.documentElement||{},q="language",C="Height",D="scroll",$=w.userAgentData,j=D+C,H="offset"+C,R="client"+C,L="pagehide",N="platform",P="platformVersion",T="https://docs.simpleanalytics.com",U=0,I=/(bot|spider|crawl)/i.test(f)&&!/(cubot)/i.test(f),V=v.screen,B=u.currentScript||u.querySelector('script[src*="'+e+'"]');m=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){m("Error in your "+t+" function:",e)},z=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},W=function(t){return"string"==typeof t},G=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},J=function(t,e){return t&&t.getAttribute("data-"+e)},X=function(t){return Array.isArray(t)?t:W(t)&&t.length?t.split(/, ?/):[]},Y=function(t){return t&&t.constructor===Object},Z=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},it=function(t){return"function"==typeof t},ot="namespace",ct=n[ot]||J(B,ot)||"sa",st=function(t,e){var n=v[ct+"_metadata"];Y(n)&&(t=Z(t,n));var r=v[kt];if(!it(r))return kt&&m(kt+" not found, set window."+kt),t;try{return Z(t,r.call(v,Z(t,e)))}catch(a){F("metadata",a)}},ut=n.strictUtm||J(B,"strict-utm")==t,lt=function(i,t){tt=!i&&nt("q")?"":_;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");tt!==_&&0"); //# sourceMappingURL=proxy.js.map \ No newline at end of file diff --git a/dist/latest/custom/proxy.js.map b/dist/latest/custom/proxy.js.map index 1a4174ca..99a2a133 100644 --- a/dist/latest/custom/proxy.js.map +++ b/dist/latest/custom/proxy.js.map @@ -1 +1 @@ -{"version":3,"file":"proxy.source.js","sources":["proxy.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData, keepalive) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n var imageUrl =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n\n // Events must survive navigation without taking over links or forms.\n if (keepalive && window.fetch) {\n try {\n window\n .fetch(imageUrl, {\n keepalive: trueVar,\n mode: \"no-cors\",\n credentials: \"omit\",\n })\n .catch(function () {\n image.src = imageUrl;\n });\n return;\n } catch (error) {}\n }\n image.src = imageUrl;\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch = \"\";\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n var pathKey = path + querySearch;\n if (!path || lastSendPath == pathKey) return;\n\n lastSendPath = pathKey;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n var manualPageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n window[namespace + \"_\" + pageviewText] = manualPageview;\n var defaultPageview = defaultNamespace + \"_\" + pageviewText;\n if (!window[defaultPageview]) window[defaultPageview] = manualPageview;\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw, keepalive) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback,\n undefinedVar,\n keepalive\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback, keepalive) {\n sendEvent(event, metadata, callback, keepalive);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n\n var inlineEvent = function (event) {\n var element = event.target;\n while (\n element &&\n element !== doc &&\n (!element.getAttribute || attr(element, \"simple-event\") === null)\n )\n element = element.parentNode;\n\n if (!element || element === doc) return;\n var isForm = element.tagName === \"FORM\";\n var name = attr(element, \"simple-event\");\n if (!name || isForm !== (event.type === \"submit\")) return;\n\n var metadata = { tag: element.tagName.toLowerCase() };\n var attributes = element.attributes;\n for (var i = 0; i < attributes.length; i++) {\n var attribute = attributes[i];\n if (attribute.name.indexOf(\"data-simple-event-\") === 0)\n metadata[attribute.name.slice(18).replace(/-/g, \"_\")] =\n attribute.value;\n }\n if (isForm) {\n var button = event.submitter;\n metadata.button_text = button\n ? (button.textContent || button.value || \"\")\n .replace(/\\s+/g, \" \")\n .trim()\n .slice(0, 200)\n : \"\";\n }\n sendEvent(name, metadata, undefinedVar, trueVar);\n };\n\n doc.addEventListener(\"click\", inlineEvent, falseVar);\n doc.addEventListener(\"submit\", inlineEvent, falseVar);\n\n // 404 confirmation adds a request, so existing installs must opt in.\n if (\n overwriteOptions.detect404 === trueVar ||\n attr(scriptElement, \"detect-404\") == trueText\n ) {\n var detect404 = function () {\n if (\n !/\\b404\\b/.test(doc.title + \" \" + (doc.body && doc.body.textContent))\n )\n return;\n try {\n var request = new window.XMLHttpRequest();\n request.open(\"HEAD\", loc.href, trueVar);\n request.onload = function () {\n if (request.status === 404)\n sendEvent(\"page_404\", {\n url: loc.protocol + \"//\" + definedHostname + loc.pathname,\n status: 404,\n });\n };\n request.send();\n } catch (error) {}\n };\n if (doc.readyState === \"loading\")\n doc.addEventListener(\"DOMContentLoaded\", detect404, falseVar);\n else detect404();\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_proxy_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","keepalive","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","imageUrl","key","fetch","mode","credentials","catch","src","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","protocol","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","parts","querySearch","shift","pathKey","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","manualPageview","defaultPageview","defaultNamespace","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue","detect404","inlineEvent","element","target","parentNode","isForm","tagName","button","tag","toLowerCase","attributes","submitter","button_text","textContent","trim","title","request","XMLHttpRequest","open","href","status","url","send","readyState"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"proxy.source.js","sources":["proxy.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData, keepalive) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n var imageUrl =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n\n // Events must survive navigation without taking over links or forms.\n if (keepalive && window.fetch) {\n try {\n window\n .fetch(imageUrl, {\n keepalive: trueVar,\n mode: \"no-cors\",\n credentials: \"omit\",\n })\n .catch(function () {\n image.src = imageUrl;\n });\n return;\n } catch (error) {}\n }\n image.src = imageUrl;\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function (raw) {\n // Customers can overwrite their referrer, here we check for that\n var referrer =\n overwriteOptions.referrer ||\n attr(scriptElement, \"referrer\") ||\n doc.referrer ||\n \"\";\n\n if (raw) return referrer;\n return (\n referrer\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch = \"\";\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n var pathKey = path + querySearch;\n if (!path || lastSendPath == pathKey) return;\n\n lastSendPath = pathKey;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // Only the first pageview can use a Cloudflare referrer as a unique arrival.\n page.unique =\n isPushState || userNavigated\n ? falseVar\n : !sameSite || (!pages && /[?&]__cf_/.test(getReferrer(trueVar)));\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n var manualPageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n window[namespace + \"_\" + pageviewText] = manualPageview;\n var defaultPageview = defaultNamespace + \"_\" + pageviewText;\n if (!window[defaultPageview]) window[defaultPageview] = manualPageview;\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw, keepalive) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback,\n undefinedVar,\n keepalive\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback, keepalive) {\n sendEvent(event, metadata, callback, keepalive);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n\n var inlineEvent = function (event) {\n var element = event.target;\n while (\n element &&\n element !== doc &&\n (!element.getAttribute || attr(element, \"simple-event\") === null)\n )\n element = element.parentNode;\n\n if (!element || element === doc) return;\n var isForm = element.tagName === \"FORM\";\n var name = attr(element, \"simple-event\");\n if (!name || isForm !== (event.type === \"submit\")) return;\n\n var metadata = { tag: element.tagName.toLowerCase() };\n var attributes = element.attributes;\n for (var i = 0; i < attributes.length; i++) {\n var attribute = attributes[i];\n if (attribute.name.indexOf(\"data-simple-event-\") === 0)\n metadata[attribute.name.slice(18).replace(/-/g, \"_\")] =\n attribute.value;\n }\n if (isForm) {\n var button = event.submitter;\n metadata.button_text = button\n ? (button.textContent || button.value || \"\")\n .replace(/\\s+/g, \" \")\n .trim()\n .slice(0, 200)\n : \"\";\n }\n sendEvent(name, metadata, undefinedVar, trueVar);\n };\n\n doc.addEventListener(\"click\", inlineEvent, falseVar);\n doc.addEventListener(\"submit\", inlineEvent, falseVar);\n\n // 404 confirmation adds a request, so existing installs must opt in.\n if (\n overwriteOptions.detect404 === trueVar ||\n attr(scriptElement, \"detect-404\") == trueText\n ) {\n var detect404 = function () {\n if (\n !/\\b404\\b/.test(doc.title + \" \" + (doc.body && doc.body.textContent))\n )\n return;\n try {\n var request = new window.XMLHttpRequest();\n request.open(\"HEAD\", loc.href, trueVar);\n request.onload = function () {\n if (request.status === 404)\n sendEvent(\"page_404\", {\n url: loc.protocol + \"//\" + definedHostname + loc.pathname,\n status: 404,\n });\n };\n request.send();\n } catch (error) {}\n };\n if (doc.readyState === \"loading\")\n doc.addEventListener(\"DOMContentLoaded\", detect404, falseVar);\n else detect404();\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_proxy_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","keepalive","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","imageUrl","key","fetch","mode","credentials","catch","src","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","protocol","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","raw","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","parts","querySearch","shift","pathKey","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","manualPageview","defaultPageview","defaultNamespace","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue","detect404","inlineEvent","element","target","parentNode","isForm","tagName","button","tag","toLowerCase","attributes","submitter","button_text","textContent","trim","title","request","XMLHttpRequest","open","href","status","url","send","readyState"],"mappings":"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"} \ No newline at end of file diff --git a/dist/latest/hello.js b/dist/latest/hello.js index 737e36e2..e0577574 100644 --- a/dist/latest/hello.js +++ b/dist/latest/hello.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-15; 8a81) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-15; 62ae) */ -!function(m,t,e,n,v){try{var g=undefined,y=!0,_=!1,r="true",a="https:",b="pageview",l="event",i="error",o=m.console,c="doNotTrack",w=m.navigator,s=m.location,O=s.host,u=m.document,f=w.userAgent,p="Not sending request ",d=p+"when ",E=_,h=encodeURIComponent,x=decodeURIComponent,M=JSON.stringify,S=m.addEventListener,k="https://queue."+e,q=u.documentElement||{},A="language",C="Height",D="scroll",$=w.userAgentData,j=D+C,R="offset"+C,H="client"+C,L="pagehide",N="platform",P="platformVersion",T="https://docs.simpleanalytics.com",U=0,I=/(bot|spider|crawl)/i.test(f)&&!/(cubot)/i.test(f),V=m.screen,B=u.currentScript||u.querySelector('script[src*="'+e+'"]');v=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){v("Error in your "+t+" function:",e)},z=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},W=function(t){return"string"==typeof t},G=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},J=function(t,e){return t&&t.getAttribute("data-"+e)},X=function(t){return Array.isArray(t)?t:W(t)&&t.length?t.split(/, ?/):[]},Y=function(t){return t&&t.constructor===Object},Z=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},it=function(t){return"function"==typeof t},ot="namespace",ct=t[ot]||J(B,ot)||"sa",st=function(t,e){var n=m[ct+"_metadata"];Y(n)&&(t=Z(t,n));var r=m[kt];if(!it(r))return kt&&v(kt+" not found, set window."+kt),t;try{return Z(t,r.call(m,Z(t,e)))}catch(a){F("metadata",a)}},ut=t.strictUtm||J(B,"strict-utm")==r,lt=function(i,t){tt=!i&&nt("q")?"":_;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");tt!==_&&0>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},it=function(t){return"function"==typeof t},ot="namespace",ct=n[ot]||J(B,ot)||"sa",st=function(t,e){var n=v[ct+"_metadata"];Y(n)&&(t=Z(t,n));var r=v[kt];if(!it(r))return kt&&m(kt+" not found, set window."+kt),t;try{return Z(t,r.call(v,Z(t,e)))}catch(a){F("metadata",a)}},ut=n.strictUtm||J(B,"strict-utm")==t,lt=function(i,t){tt=!i&&nt("q")?"":_;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");tt!==_&&0> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData, keepalive) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n var imageUrl =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n\n // Events must survive navigation without taking over links or forms.\n if (keepalive && window.fetch) {\n try {\n window\n .fetch(imageUrl, {\n keepalive: trueVar,\n mode: \"no-cors\",\n credentials: \"omit\",\n })\n .catch(function () {\n image.src = imageUrl;\n });\n return;\n } catch (error) {}\n }\n image.src = imageUrl;\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch = \"\";\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n var pathKey = path + querySearch;\n if (!path || lastSendPath == pathKey) return;\n\n lastSendPath = pathKey;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n var manualPageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n window[namespace + \"_\" + pageviewText] = manualPageview;\n var defaultPageview = defaultNamespace + \"_\" + pageviewText;\n if (!window[defaultPageview]) window[defaultPageview] = manualPageview;\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw, keepalive) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback,\n undefinedVar,\n keepalive\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback, keepalive) {\n sendEvent(event, metadata, callback, keepalive);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n\n var inlineEvent = function (event) {\n var element = event.target;\n while (\n element &&\n element !== doc &&\n (!element.getAttribute || attr(element, \"simple-event\") === null)\n )\n element = element.parentNode;\n\n if (!element || element === doc) return;\n var isForm = element.tagName === \"FORM\";\n var name = attr(element, \"simple-event\");\n if (!name || isForm !== (event.type === \"submit\")) return;\n\n var metadata = { tag: element.tagName.toLowerCase() };\n var attributes = element.attributes;\n for (var i = 0; i < attributes.length; i++) {\n var attribute = attributes[i];\n if (attribute.name.indexOf(\"data-simple-event-\") === 0)\n metadata[attribute.name.slice(18).replace(/-/g, \"_\")] =\n attribute.value;\n }\n if (isForm) {\n var button = event.submitter;\n metadata.button_text = button\n ? (button.textContent || button.value || \"\")\n .replace(/\\s+/g, \" \")\n .trim()\n .slice(0, 200)\n : \"\";\n }\n sendEvent(name, metadata, undefinedVar, trueVar);\n };\n\n doc.addEventListener(\"click\", inlineEvent, falseVar);\n doc.addEventListener(\"submit\", inlineEvent, falseVar);\n\n // 404 confirmation adds a request, so existing installs must opt in.\n if (\n overwriteOptions.detect404 === trueVar ||\n attr(scriptElement, \"detect-404\") == trueText\n ) {\n var detect404 = function () {\n if (\n !/\\b404\\b/.test(doc.title + \" \" + (doc.body && doc.body.textContent))\n )\n return;\n try {\n var request = new window.XMLHttpRequest();\n request.open(\"HEAD\", loc.href, trueVar);\n request.onload = function () {\n if (request.status === 404)\n sendEvent(\"page_404\", {\n url: loc.protocol + \"//\" + definedHostname + loc.pathname,\n status: 404,\n });\n };\n request.send();\n } catch (error) {}\n };\n if (doc.readyState === \"loading\")\n doc.addEventListener(\"DOMContentLoaded\", detect404, falseVar);\n else detect404();\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"simpleanalyticscdn.com\",\n \"queue.\",\n \"cdn_hello_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","protocol","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","keepalive","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","imageUrl","key","fetch","mode","credentials","catch","src","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","parts","querySearch","shift","pathKey","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","manualPageview","defaultPageview","defaultNamespace","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue","detect404","inlineEvent","element","target","parentNode","isForm","tagName","button","tag","toLowerCase","attributes","submitter","button_text","textContent","trim","title","request","XMLHttpRequest","open","href","status","url","send","readyState"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"hello.source.js","sources":["hello.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData, keepalive) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n var imageUrl =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n\n // Events must survive navigation without taking over links or forms.\n if (keepalive && window.fetch) {\n try {\n window\n .fetch(imageUrl, {\n keepalive: trueVar,\n mode: \"no-cors\",\n credentials: \"omit\",\n })\n .catch(function () {\n image.src = imageUrl;\n });\n return;\n } catch (error) {}\n }\n image.src = imageUrl;\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function (raw) {\n // Customers can overwrite their referrer, here we check for that\n var referrer =\n overwriteOptions.referrer ||\n attr(scriptElement, \"referrer\") ||\n doc.referrer ||\n \"\";\n\n if (raw) return referrer;\n return (\n referrer\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch = \"\";\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n var pathKey = path + querySearch;\n if (!path || lastSendPath == pathKey) return;\n\n lastSendPath = pathKey;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // Only the first pageview can use a Cloudflare referrer as a unique arrival.\n page.unique =\n isPushState || userNavigated\n ? falseVar\n : !sameSite || (!pages && /[?&]__cf_/.test(getReferrer(trueVar)));\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n var manualPageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n window[namespace + \"_\" + pageviewText] = manualPageview;\n var defaultPageview = defaultNamespace + \"_\" + pageviewText;\n if (!window[defaultPageview]) window[defaultPageview] = manualPageview;\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw, keepalive) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback,\n undefinedVar,\n keepalive\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback, keepalive) {\n sendEvent(event, metadata, callback, keepalive);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n\n var inlineEvent = function (event) {\n var element = event.target;\n while (\n element &&\n element !== doc &&\n (!element.getAttribute || attr(element, \"simple-event\") === null)\n )\n element = element.parentNode;\n\n if (!element || element === doc) return;\n var isForm = element.tagName === \"FORM\";\n var name = attr(element, \"simple-event\");\n if (!name || isForm !== (event.type === \"submit\")) return;\n\n var metadata = { tag: element.tagName.toLowerCase() };\n var attributes = element.attributes;\n for (var i = 0; i < attributes.length; i++) {\n var attribute = attributes[i];\n if (attribute.name.indexOf(\"data-simple-event-\") === 0)\n metadata[attribute.name.slice(18).replace(/-/g, \"_\")] =\n attribute.value;\n }\n if (isForm) {\n var button = event.submitter;\n metadata.button_text = button\n ? (button.textContent || button.value || \"\")\n .replace(/\\s+/g, \" \")\n .trim()\n .slice(0, 200)\n : \"\";\n }\n sendEvent(name, metadata, undefinedVar, trueVar);\n };\n\n doc.addEventListener(\"click\", inlineEvent, falseVar);\n doc.addEventListener(\"submit\", inlineEvent, falseVar);\n\n // 404 confirmation adds a request, so existing installs must opt in.\n if (\n overwriteOptions.detect404 === trueVar ||\n attr(scriptElement, \"detect-404\") == trueText\n ) {\n var detect404 = function () {\n if (\n !/\\b404\\b/.test(doc.title + \" \" + (doc.body && doc.body.textContent))\n )\n return;\n try {\n var request = new window.XMLHttpRequest();\n request.open(\"HEAD\", loc.href, trueVar);\n request.onload = function () {\n if (request.status === 404)\n sendEvent(\"page_404\", {\n url: loc.protocol + \"//\" + definedHostname + loc.pathname,\n status: 404,\n });\n };\n request.send();\n } catch (error) {}\n };\n if (doc.readyState === \"loading\")\n doc.addEventListener(\"DOMContentLoaded\", detect404, falseVar);\n else detect404();\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"simpleanalyticscdn.com\",\n \"queue.\",\n \"cdn_hello_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","protocol","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","keepalive","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","imageUrl","key","fetch","mode","credentials","catch","src","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","raw","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","parts","querySearch","shift","pathKey","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","manualPageview","defaultPageview","defaultNamespace","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue","detect404","inlineEvent","element","target","parentNode","isForm","tagName","button","tag","toLowerCase","attributes","submitter","button_text","textContent","trim","title","request","XMLHttpRequest","open","href","status","url","send","readyState"],"mappings":"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"} \ No newline at end of file diff --git a/dist/latest/latest.dev.js b/dist/latest/latest.dev.js index a756fd62..b6b05092 100644 --- a/dist/latest/latest.dev.js +++ b/dist/latest/latest.dev.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-15; 0e2c; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-15; 233d; v12) */ /* eslint-env browser */ (function ( @@ -543,13 +543,17 @@ var page = {}; var lastSendPath; - var getReferrer = function () { + var getReferrer = function (raw) { // Customers can overwrite their referrer, here we check for that - var overwrittenReferrer = - overwriteOptions.referrer || attr(scriptElement, "referrer"); + var referrer = + overwriteOptions.referrer || + attr(scriptElement, "referrer") || + doc.referrer || + ""; + if (raw) return referrer; return ( - (overwrittenReferrer || doc.referrer || "") + referrer .replace(locationHostname, definedHostname) .replace(/^https?:\/\/((m|l|w{2,3}([0-9]+)?)\.)?([^?#]+)(.*)$/, "$4") .replace(/^([^/]+)$/, "$1") || undefinedVar @@ -800,11 +804,11 @@ currentReferrerHostname == locationHostname : falseVar; - // We set unique variable based on pushstate or back navigation, if no match we check the referrer + // Only the first pageview can use a Cloudflare referrer as a unique arrival. page.unique = - /__cf_/.test(getReferrer()) || isPushState || userNavigated + isPushState || userNavigated ? falseVar - : !sameSite; + : !sameSite || (!pages && /[?&]__cf_/.test(getReferrer(trueVar))); metadata = appendMetadata(metadata, { type: pageviewText, diff --git a/dist/latest/latest.js b/dist/latest/latest.js index fb7ceaa1..1b88b8d2 100644 --- a/dist/latest/latest.js +++ b/dist/latest/latest.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-15; dfc8; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-15; 462b; v12) */ -!function(m,t,e,n,v){try{var g=undefined,y=!0,_=!1,r="true",a="https:",b="pageview",l="event",i="error",o=m.console,c="doNotTrack",w=m.navigator,s=m.location,O=s.host,u=m.document,f=w.userAgent,p="Not sending request ",d=p+"when ",E=_,h=encodeURIComponent,x=decodeURIComponent,M=JSON.stringify,S=m.addEventListener,k="https://queue."+e,q=u.documentElement||{},A="language",C="Height",D="scroll",$=w.userAgentData,j=D+C,R="offset"+C,H="client"+C,L="pagehide",N="platform",P="platformVersion",T="https://docs.simpleanalytics.com",U=0,I=/(bot|spider|crawl)/i.test(f)&&!/(cubot)/i.test(f),V=m.screen,B=u.currentScript||u.querySelector('script[src*="'+e+'"]');v=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){v("Error in your "+t+" function:",e)},z=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},W=function(t){return"string"==typeof t},G=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},J=function(t,e){return t&&t.getAttribute("data-"+e)},X=function(t){return Array.isArray(t)?t:W(t)&&t.length?t.split(/, ?/):[]},Y=function(t){return t&&t.constructor===Object},Z=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},it=function(t){return"function"==typeof t},ot="namespace",ct=t[ot]||J(B,ot)||"sa",st=function(t,e){var n=m[ct+"_metadata"];Y(n)&&(t=Z(t,n));var r=m[kt];if(!it(r))return kt&&v(kt+" not found, set window."+kt),t;try{return Z(t,r.call(m,Z(t,e)))}catch(a){F("metadata",a)}},ut=t.strictUtm||J(B,"strict-utm")==r,lt=function(i,t){tt=!i&&nt("q")?"":_;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");tt!==_&&0>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},it=function(t){return"function"==typeof t},ot="namespace",ct=n[ot]||J(B,ot)||"sa",st=function(t,e){var n=v[ct+"_metadata"];Y(n)&&(t=Z(t,n));var r=v[kt];if(!it(r))return kt&&m(kt+" not found, set window."+kt),t;try{return Z(t,r.call(v,Z(t,e)))}catch(a){F("metadata",a)}},ut=n.strictUtm||J(B,"strict-utm")==t,lt=function(i,t){tt=!i&&nt("q")?"":_;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");tt!==_&&0> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData, keepalive) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n var imageUrl =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n\n // Events must survive navigation without taking over links or forms.\n if (keepalive && window.fetch) {\n try {\n window\n .fetch(imageUrl, {\n keepalive: trueVar,\n mode: \"no-cors\",\n credentials: \"omit\",\n })\n .catch(function () {\n image.src = imageUrl;\n });\n return;\n } catch (error) {}\n }\n image.src = imageUrl;\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch = \"\";\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n var pathKey = path + querySearch;\n if (!path || lastSendPath == pathKey) return;\n\n lastSendPath = pathKey;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n var manualPageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n window[namespace + \"_\" + pageviewText] = manualPageview;\n var defaultPageview = defaultNamespace + \"_\" + pageviewText;\n if (!window[defaultPageview]) window[defaultPageview] = manualPageview;\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw, keepalive) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback,\n undefinedVar,\n keepalive\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback, keepalive) {\n sendEvent(event, metadata, callback, keepalive);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n\n var inlineEvent = function (event) {\n var element = event.target;\n while (\n element &&\n element !== doc &&\n (!element.getAttribute || attr(element, \"simple-event\") === null)\n )\n element = element.parentNode;\n\n if (!element || element === doc) return;\n var isForm = element.tagName === \"FORM\";\n var name = attr(element, \"simple-event\");\n if (!name || isForm !== (event.type === \"submit\")) return;\n\n var metadata = { tag: element.tagName.toLowerCase() };\n var attributes = element.attributes;\n for (var i = 0; i < attributes.length; i++) {\n var attribute = attributes[i];\n if (attribute.name.indexOf(\"data-simple-event-\") === 0)\n metadata[attribute.name.slice(18).replace(/-/g, \"_\")] =\n attribute.value;\n }\n if (isForm) {\n var button = event.submitter;\n metadata.button_text = button\n ? (button.textContent || button.value || \"\")\n .replace(/\\s+/g, \" \")\n .trim()\n .slice(0, 200)\n : \"\";\n }\n sendEvent(name, metadata, undefinedVar, trueVar);\n };\n\n doc.addEventListener(\"click\", inlineEvent, falseVar);\n doc.addEventListener(\"submit\", inlineEvent, falseVar);\n\n // 404 confirmation adds a request, so existing installs must opt in.\n if (\n overwriteOptions.detect404 === trueVar ||\n attr(scriptElement, \"detect-404\") == trueText\n ) {\n var detect404 = function () {\n if (\n !/\\b404\\b/.test(doc.title + \" \" + (doc.body && doc.body.textContent))\n )\n return;\n try {\n var request = new window.XMLHttpRequest();\n request.open(\"HEAD\", loc.href, trueVar);\n request.onload = function () {\n if (request.status === 404)\n sendEvent(\"page_404\", {\n url: loc.protocol + \"//\" + definedHostname + loc.pathname,\n status: 404,\n });\n };\n request.send();\n } catch (error) {}\n };\n if (doc.readyState === \"loading\")\n doc.addEventListener(\"DOMContentLoaded\", detect404, falseVar);\n else detect404();\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"simpleanalyticscdn.com\",\n \"queue.\",\n \"cdn_latest_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","protocol","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","keepalive","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","imageUrl","key","fetch","mode","credentials","catch","src","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","parts","querySearch","shift","pathKey","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","manualPageview","defaultPageview","defaultNamespace","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue","detect404","inlineEvent","element","target","parentNode","isForm","tagName","button","tag","toLowerCase","attributes","submitter","button_text","textContent","trim","title","request","XMLHttpRequest","open","href","status","url","send","readyState"],"mappings":";;CAEA,SACEA,EACAC,EACAC,EAIAC,EACAC,GAEA,IAQE,IAAIC,EAAeC,UACfC,GAAU,EACVC,GAAW,EACXC,EAAW,OACXC,EAAQ,SACRC,EAAe,WACfC,EAAY,QACZC,EAAY,QAGZC,EAAMd,EAAOe,QACbC,EAAa,aACbC,EAAMjB,EAAOkB,UACbC,EAAMnB,EAAOoB,SACbC,EAAmBF,EAAIG,KACvBC,EAAMvB,EAAOwB,SACbC,EAAYR,EAAIQ,UAChBC,EAAa,uBACbC,EAAiBD,EAAa,QAC9BE,EAA2BpB,EAC3BqB,EAAyBC,mBACzBC,EAAyBC,mBACzBC,EAAYC,KAAKD,UAEjBE,EAAuBnC,EAAOoC,iBAC9BC,EAAaC,iBAA0BpC,EACvCqC,EAAkBhB,EAAIgB,iBAAmB,GACzCC,EAAW,WACXC,EAAS,SAETC,EAAS,SACTC,EAAS1B,EAAI2B,cACbC,EAAeH,EAASD,EACxBK,EAAe,SAAWL,EAC1BM,EAAe,SAAWN,EAE1BO,EAAW,WACXC,EAAe,WACfC,EAAsB,kBACtBC,EAAU,mCACVC,EAAQ,EACRC,EACF,sBAAsBC,KAAK7B,KAAe,WAAW6B,KAAK7B,GACxD8B,EAASvD,EAAOuD,OAIhBC,EACFjC,EAAIkC,eAAiBlC,EAAImC,cAAc,gBAAkBxD,EAAU,MAOrEE,EAAO,WAEL,IAAIuD,EAAO,GAAGC,MAAMC,KAAKC,WAOzB,OAJAH,EAAKI,QAAQ,qBAINC,SAASC,UAAUC,MAAML,KAAK/C,EAAIV,KAAMU,EAAK6C,IAGtD,IAAIQ,EAAiB,SAAUC,EAAMC,GACnCjE,EAAK,iBAAmBgE,EAAO,aAAcC,IAG3CC,EAAU,SAAUC,EAAKC,GAC3B,OAAOC,OAAOR,UAAUS,eAAeb,KAAKU,EAAKC,IAG/CG,EAAW,SAAUC,GACvB,MAAwB,iBAAVA,GAGZC,EAAc,SAAUC,GAC1B,OAAOA,EAAKC,QAAQ,sBAAuB,SAGzCC,EAAO,SAAUxB,EAAeyB,GAClC,OAAOzB,GAAiBA,EAAc0B,aAAa,QAAUD,IAG3DE,EAA+B,SAAUC,GAC3C,OAAOC,MAAMC,QAAQF,GACjBA,EACAT,EAASS,IAAQA,EAAIG,OACnBH,EAAII,MAAM,OACV,IAGJC,EAAW,SAAUC,GACvB,OAAOA,GAAUA,EAAOC,cAAgBlB,QAGtCmB,EAAS,WAGX,IAFA,IAAIC,EAAK,GACLC,EAAMhC,UACDiC,EAAQ,EAAGA,EAAQD,EAAIP,OAAQQ,IAAS,CAC/C,IAAIC,EAAaF,EAAIC,GACrB,GAAIN,EAASO,GACX,IAAK,IAAIC,KAAWD,EACd1B,EAAQ0B,EAAYC,KACtBJ,EAAGI,GAAWD,EAAWC,IAKjC,OAAOJ,GAGLK,EAAWlG,EAAOmG,YAClBC,EAAcF,GAAYzB,OAAO4B,KAAKpG,GAAkBsF,OAG5DtF,EAAmB2F,EAAO3F,EAAkBiG,GAExCE,GAAahG,EAAK,WAAYH,GAGlC,IA+EIqG,GA/EAC,GAAgBpB,EAClBlF,EAAiBsG,eAAiBvB,EAAKxB,EAAe,mBAGpDgD,GAAwB,SAAUC,GAEpC,OAGgB,IAFdF,GAAcG,OAAO,SAAU5B,GAC7B,OAAO,IAAI6B,OAAO,IAAMF,GAAoBnD,KAAKwB,KAChDS,QAIHqB,GAAMC,KAAKD,IAEXE,GAAO,WACT,IAAIC,EAAe/G,EAAOgH,QAAUhH,EAAOiH,SACvCC,EAAY,CAAC,MAAQ,KAAO,KAAO,KAAO,KAC1CC,EAAY,SAEhB,IACE,OAAOD,EAAUnC,QAAQoC,EAAW,SAAUC,GAC5C,OACEA,EACCL,EAAaM,gBAAgB,IAAIC,WAAW,IAAI,GAC9C,IAAOF,EAAI,GACdG,SAAS,MAEb,MAAOlD,GACP,OAAO6C,EAAUnC,QAAQoC,EAAW,SAAUC,GAC5C,IAAII,EAAqB,GAAhBC,KAAKC,SAAiB,EAE/B,OADMN,EAAI,EAAII,EAAS,EAAJA,EAAW,GACrBD,SAAS,QAKpBI,GAAa,SAAUC,GACzB,MAAsB,mBAARA,GAIZC,GAAgB,YAChBC,GACF7H,EAAiB4H,KACjB7C,EAAKxB,EAAeqE,KAy3BxB,KAt3BME,GAAiB,SAAUC,EAAUC,GACvC,IAAIC,EAAiBlI,EAAO8H,GAAY,aACpCrC,EAASyC,KAAiBF,EAAWpC,EAAOoC,EAAUE,IAC1D,IAAIC,EAA4BnI,EAAOoI,IACvC,IAAKT,GAAWQ,GAKd,OAJIC,IACFhI,EACEgI,GAAoB,0BAA4BA,IAE7CJ,EAET,IACE,OAAOpC,EACLoC,EACAG,EAA0BtE,KAAK7D,EAAQ4F,EAAOoC,EAAUC,KAE1D,MAAO5D,GACPF,EAAe,WAAYE,KAU3BgE,GACFpI,EAAiBoI,WACjBrD,EAAKxB,EAAe,eAAiB/C,EAInC6H,GAAiB,SAAUC,EAAcC,GAC3ClC,IAAKiC,GAAgB/B,GAAsB,KAAO,GAAKhG,EACvD,IAAIiI,GAAKD,GAAmBrH,EAAIuH,QAC7B9E,MAAM,GACN4B,MAAM,KACNkB,OAAO,SAAUiC,GAChB,IAAIC,EAAID,EAASE,QAAQ,KACrBvC,KAAM9F,GAAgB,EAAJoI,GAASD,EAAS/E,MAAMgF,EAAI,KAChDtC,KAAMA,GAAI,IAAM,IAAMqC,EAAS/E,MAAM,EAAGgF,IAE1C,IAAIE,EAASP,IAAiB/B,GAAsB,MAEhDuC,EAAkBC,GAAYC,IAAIpE,GAAaqE,KAAK,KACpDC,EAAQL,EACR,KAAOC,EAAkB,KACzB,YACCV,GAAY,GAAK,KAClB,yCACCA,GAAY,GAAK,QAClB,IACAU,EACA,KACJ,OAAID,IAAWE,GAAYzD,OAAe/E,EAInC,IAAImG,OAAOwC,EAAO,KAAK7F,KAAKqF,KAEpCO,KAAK,KAGR,OADA5C,GAAIA,IAAKjG,EACFoI,GAAKpI,GA+BV+I,GAAiBtB,GAAY,UACjC,GAAI9H,EAAOoJ,KAAmB7I,EAAS,OAAOH,EAAKsB,EAAa,SAChE1B,EAAOqJ,gBAAkB9I,EACzBP,EAAOoJ,IAAkB7I,EAOzB,IAAI+I,GAAW,SAAUrB,EAAMsB,EAAUC,EAAcC,GACrDxB,EAAOuB,EAAevB,EAAOrC,EAAO8D,GAASC,GAAM1B,GAE/ChH,EAAI2I,QAAUJ,IAAcvB,EAAK2B,MAAQrJ,GACzCU,EAAI4I,qBAAuBL,IAAcvB,EAAK6B,KAAOvJ,GAGzD,IAAIwJ,EAAQ,IAAIC,MACZT,IACFQ,EAAME,QAAUV,EAChBQ,EAAMG,OAASX,GAEjB,IAAIY,EACF9H,EACA,eACAoC,OAAO4B,KAAK4B,GACTvB,OAAO,SAAU0D,GAChB,OAAOnC,EAAKmC,IAAQ/J,IAErB4I,IAAI,SAAUmB,GACb,OACEvI,EAAuBuI,GACvB,IACAvI,EAAuBoG,EAAKmC,MAG/BlB,KAAK,KACR,SACArC,KAAKD,MAGP,GAAI6C,GAAazJ,EAAOqK,MACtB,IAUE,YATArK,EACGqK,MAAMF,EAAU,CACfV,UAAWlJ,EACX+J,KAAM,UACNC,YAAa,SAEdC,SAAM,WACLT,EAAMU,IAAMN,IAGhB,MAAO9F,IAEX0F,EAAMU,IAAMN,GAIVO,GACFzK,EAAiB0K,UAAY3F,EAAKxB,EAAe,YAC/CoH,GAAkBF,IAAuBrJ,EAEzCwJ,GAAc,CAChBC,QAstBJ,gBArtBIH,SAAUC,IASZzK,EAAY,SAAU4K,GACpBA,EAAiBA,EAAeC,MAC5BD,EAAiB,IAAMA,EAAeC,MACtCD,EACJ3K,EAAK2K,GACLzB,GACE1D,EAAOiF,GAAa,CAClBI,KAAMpK,EACNwD,MAAO0G,EACPG,KAAM/J,EAAIgK,WAEZ9K,EACAE,IAMJ4B,EACEtB,EACA,SAAUuK,GACJA,EAAMC,WAA+C,EAAnCD,EAAMC,SAASxC,QAAQ3I,IAC3CC,EAAUiL,EAAME,UAGpB9K,GAOF,IAwDI+K,GAxDAC,GAAQ5E,KAER6E,GAAW,EAOXnB,GAAOrK,EAAiBqK,MAAQtF,EAAKxB,EAAe,QAGpDkI,MAhMsBC,GAgMC1L,EAAiByL,cA/LvBC,GAgMjB1L,EAAiByL,WACjB1G,EAAKxB,EAAe,eAAiB/C,GACrCuE,EAAKxB,EAAe,aAAe/C,GACnCuE,EAAKxB,EAAe,gBAAkB/C,EAGtCmL,KACqC,SAAvC5G,EAAKxB,EAAe,iBACpBvD,EAAiB2L,cAAgBpL,GAI/BqL,GACF5L,EAAiB6L,UACjB9G,EAAKxB,EAAe,cACpBsE,GAAY,IAAMlH,EAGhBmL,GAAc5G,EAChBlF,EAAiB8L,aAAe/G,EAAKxB,EAAe,iBAIlDwF,GAAc7D,EAChBlF,EAAiB+I,aAAehE,EAAKxB,EAAe,iBAIlDwI,GAAqB7G,EACvBlF,EAAiB+L,oBACfhH,EAAKxB,EAAe,yBAIpByI,GACFhM,EAAiBgM,gBAAkBjH,EAAKxB,EAAe,mBAGrD4E,GACFnI,EAAiBmI,mBACjBpD,EAAKxB,EAAe,sBAItB,IAEE+H,GAAW/E,GAAsB,KAC7B0F,KAAKC,iBAAiBC,kBAAkBC,SACxChM,EACJ,MAAOgE,IACPjE,EAAKiE,IAOP,IAAIiI,GAAUtM,EAAOsM,QACjBC,GACFtL,EAAIuL,WACJxM,EAAOyM,aACPzM,EAAO0M,aACP1M,EAAO2M,UACNL,KAAYA,GAAQM,QACrB5M,EAAO6M,YACP7M,EAAO8M,MACPzJ,GACAoE,KAAKC,UAAYD,KAAKC,SAGpBqF,GACFvG,GAAsB,MAAQA,GAAsB,QAElD+F,KAAK1B,GAAY0B,IAAMhM,GAE3B,IAAImJ,GAAU9D,EAAOiF,GAAa,CAEhCmC,GAAIxG,GAAsB,MAAQ/E,EAAYpB,EAE9CK,MAAOS,EAAImB,UAAY5B,EACvB6K,SAAUA,GACV0B,QAASF,GAAqBjG,KAASzG,EAGvC6M,WAAY1G,GAAsB,MAAQM,KAASzG,IA0BrD,GAvBAqJ,GAAQyD,IAAM3M,EAIVmC,IACF+G,GAAQ0D,OAASzK,EAAOyK,OACxB1D,GAAQ2D,OAASpL,EAAUU,EAAO0K,SAS/B9L,EAAI+L,SAASlN,EAAK,4CAInBwK,KAAoBvJ,IACtBqI,GAAQ6D,kBAAoBlM,IAGzBqK,IAAc1K,KAAcC,GAA0B,KAAnBA,EAAID,GAC1C,OAAOZ,EACLuB,EAAiBX,EAAa,oBAAsBmC,EAAU,SAK7B,GAAlC9B,EAAiBwH,QAAQ,OACxB,aAAavF,KAAKjC,IACnBqJ,IAEDtK,EACE,mBACEiB,EACA,SACA8B,EACA,0BAON,IACIqK,GA0DAC,GA3DA9D,GAAO,GAGP+D,GAAc,WAKhB,OAFEzN,EAAiB0N,UAAY3I,EAAKxB,EAAe,aAGzBjC,EAAIoM,UAAY,IACrC5I,QAAQ1D,EAAkBuJ,IAC1B7F,QAAQ,sDAAuD,MAC/DA,QAAQ,YAAa,OAAS1E,GAKjCsN,GAAWD,KAOXE,GAAW,EAEXC,GAAc,SAAUC,EAAIC,GAC9B,GAAKhB,GAAL,CAEA,IAAIiB,EAASpI,EAAOiF,GAAa,CAC/BI,KAAM,SACNgD,YAAaF,EAAOD,EAAKpE,GAAQuD,UAenC,GAXIzG,GAAsB,OACxBwH,EAAOE,SAAWzG,KAAK0G,OAAOvH,KAAQ4E,GAAQoC,IAphBnC,MAshBbA,GAAW,EACXpC,GAAQ5E,KAGJJ,GAAsB,UACxBwH,EAAOvC,SAAWhE,KAAK2G,IAAI,EAAG3C,GAAU4C,OAGtCN,IAAS9M,EAAIqN,WAEfhF,GAAS0E,EAAQ3N,EAAcE,QAE/B,IACEU,EAAIqN,WAAWC,KAAKtN,EAApBA,CAAyBoB,EAAa,UAAWJ,EAAU+L,IAC3D,MAAOQ,GAEPlF,GAAS0E,EAAQ3N,EAAcE,MAMrC4B,EACE,mBACA,WACMZ,EAAIkN,QACA,KAAOzL,KAAYhD,GAAS6N,KAClCJ,GAAc7G,MACTgH,IAAYhH,KAAQ6G,IAE7BjN,GAGF2B,EAAqBa,EAAU6K,GAAarN,GAE5C,IAAIkO,GAAOnN,EAAImN,MAAQ,GACnBL,GAAW,WACb,IACE,IAAIM,EAAuBpM,EAAgBQ,IAAiB,EACxD6L,EAASnH,KAAK2G,IAChBM,GAAK7L,IAAiB,EACtB6L,GAAK5L,IAAiB,EACtBP,EAAgBQ,IAAiB,EACjCR,EAAgBM,IAAiB,EACjCN,EAAgBO,IAAiB,GAEnC,OAAO2E,KAAKoH,IACV,IAKI,EAJJpH,KAAK0G,MACF,MAAQ5L,EAAgBuM,WAAa,GAAKH,GACzCC,EACA,IAGN,MAAOvK,IAEP,OADAjE,EAAKiE,IACE,IAIXlC,EAAqB,OAAQ,WAC3BsJ,GAAW4C,KACXlM,EACEO,EACA,WACM+I,GAAW4C,OAAY5C,GAAW4C,OAExC7N,KAQJ,IAgCIuO,GAoCAC,GAAUC,GApEVC,GAAU,SAAUC,GACtB,IAAIjE,EAAO,GAIX,IACEA,EAAOiE,GAAapN,EAAuBZ,EAAIgK,UAC/C,MAAO9G,IACPjE,EAAKiE,IAGP,IAAI+K,EAAyBpP,EAAOiM,IACpC,GAAItE,GAAWyH,GACb,IACElE,EAAOkE,EAAuBvL,KAAK7D,EAAQ,CAAEkL,KAAMA,KAAWA,EAC9D,MAAO7G,IACPF,EAAe,OAAQE,IAK3B,IA7ZiB,SAAU6G,GAC3B,IAAK,IAAItC,KAAKmD,GAAa,CACzB,IAAIsD,EAAgBtD,GAAYnD,GAChC,GAAKyG,EAAL,CAGA,IAAIC,EA9OI,KA+OND,EAAc,GAAcA,EA/OtB,IA+O8CA,EAEtD,GACEC,IAAepE,GACf,IAAIvE,OACF,IAAM9B,EAAYyK,GAAYvK,QAAQ,SAAU,QAAU,IAC1D,KACAzB,KAAK4H,GAEP,OAAO3K,GAEX,OAAOC,EA2YH+O,CAAarE,GAQjB,MAFY,QAARZ,IAAkBnJ,EAAIqO,OAAMtE,GAAQ/J,EAAIqO,KAAKhK,MAAM,KAAK,IAErD0F,EAPL9K,EAAKuB,EAAiB,YAAcuJ,IAgDpCuE,GAAW,SACbC,EACAC,EACA3H,EACA4H,IAEKA,GAAejI,GAAWK,KAAW4H,EAAc5H,GACxD,IAIM6H,EAJFtG,EAAW5B,GAAWiI,GAAeA,EAAc,aACnDE,EAAc,GACdnL,EAASgL,KAAgD,EAA9BA,EAAc9G,QAAQ,OAGnD8G,GADIE,EAAQF,EAAcnK,MAAM,MACVuK,QACtBD,EAAc,IAAMD,EAAM3G,KAAK,MAGjC,IAAIgC,EAAOgE,GAAQS,GAGfK,EAAU9E,EAAO4E,EACrB,GAAK5E,GAAQsC,IAAgBwC,EAA7B,CAEAxC,GAAewC,EACfrG,GAAKuB,KAAOA,EAGR1E,GAAsB,OACxBmD,GAAKsG,eACHxI,KAAK2G,IAAI7L,EAA2B,aAAK,EAAGvC,EAAOkQ,YAAc,IACjE,KACFvG,GAAKwG,gBACH1I,KAAK2G,IACH7L,EAAgBQ,IAAiB,EACjC/C,EAAOoQ,aAAe,IACnB,MAIL5J,GAAsB,MACpBvF,EAAIuB,KAAWmH,GAAKnH,GAAYvB,EAAIuB,IAItCe,GAAUiD,GAAsB,QAClCmD,GAAK0G,aAAe9M,EAAO+M,MAC3B3G,GAAK4G,cAAgBhN,EAAOqL,QAI9B,IAII4B,EAJAC,EAAOzQ,EAAO0Q,YACdC,EAAiB,aAIrB,IACEH,EAAsBC,EAAKG,iBAAiBD,GAAgB,GAAG1F,KAC/D,MAAO5G,IACPjE,EAAKiE,IAGP4K,GAAgBuB,GAC+C,EAA3D,CAAC,SAAU,gBAAgB3H,QAAQ2H,GAGnCC,GACAA,EAAKE,KACwC,EAA7C,CAAC,EAAG,GAAG9H,QAAQ4H,EAAKE,GAAgB1F,MAGxC,IAAI4F,EAA0BlD,GAC1BA,GAASnI,MA5vBH,KA4vBgB,GACtBnF,EACJ2O,GAAWrB,IACgD,EAAvD3B,GAAmBnD,QAAQgI,IAC3BA,GAA2BxP,EAC3Bb,EAGJmJ,GAAKmH,OACH,QAAQxN,KAAKoK,OAAkBgC,GAAeT,GAC1CzO,GACCwO,GAEPhH,EAAWD,GAAeC,EAAU,CAClCiD,KAAMtK,EACNuK,KAAMvB,GAAKuB,OAGb,IAAI6F,EAAsB,WACxBnP,EAA2BrB,EAC3B,IAAIyQ,EACFtB,GAAeT,KAAkBzI,GAAsB,MA9H1C,SACjBkJ,EACAuB,EACAjC,EACAtG,EACAV,EACAuB,GAEImG,GAAa7B,GAAY,GAAKnE,GAAQuD,QAAS1M,GAC/CwM,KAAoBrD,GAAQuD,QAAUnG,MAE1C,IAAIoK,EAActG,GAAkBsE,KAChCiC,EAAQ7I,GAAe2I,EAAkBvI,GAE7CY,GACE,CACEwE,GAAIpE,GAAQuD,QACZhC,KAAMtK,EACNgN,UAAWsD,GAAoBjC,EAAWrB,GAAW,KACrDwD,MAAOA,EACP7K,EAAGA,GAEH0B,SAAU/F,EAAU+F,IAEtBuB,GAGFwF,GAAmBpB,GACnBA,GAAWuD,EAEX9N,IAiGEgO,CACE1B,EACAsB,EACAhC,GACAc,EACA9H,EACAuB,IAIJ,GAAK3H,EAmBHmP,SAjBA,IACMpO,GAAUgF,GAAWhF,EAAO0O,sBAC9B1O,EACG0O,qBAAqB,CAACpO,EAAcC,IACpCoO,KAAK,SAAUC,GACd7H,GAAQ8H,QAAUD,EAAkBtO,GACpCyG,GAAQ+H,WAAaF,EAAkBrO,GACvC6N,MAEDvG,SAAMuG,GAETA,IAEF,MAAOvC,GACPuC,OAWFW,GAAM1R,EAAO2R,QACbC,GAAeF,GAAMA,GAAIG,UAAYxR,EACrCyR,GAAM9R,EAAO+R,cACbC,GAAgB,YAIhBpG,IAAegG,IAAgBK,OAASH,KAqB1CJ,GAAIG,WAnBEK,GAAOR,GADiBzG,GAoBA+G,IAlBrB,WACL,IAEI5G,EAFAtF,EAAMhC,UACNqO,EAAKD,GAAKhO,MAAMkO,KAAMtM,GAY1B,OAVI6B,GAAWsK,OACb7G,EAAQ,IAAI6G,MAAMhH,KAIlBG,EAAQ7J,EAAI8Q,YAAY,UAClBC,UAAUrH,GAAM1K,EAASA,GAEjC6K,EAAMtH,UAAYgC,EAClBgM,GAAI1G,GACG+G,IAMXhQ,EACE6P,GACA,WACEvC,GAAS,IAEXjP,GAGF2B,EACE,WACA,WACEsN,GAAS,IAEXjP,IAKAoL,IAAuB,QAARtB,IAAkB,iBAAkBtK,GACrDmC,EACE,aACA,WACEsN,GAAS,IAEXjP,GAIAoL,IAAa6D,KAEjB,IAAI8C,GAAiB,SAAUrH,EAAMlD,EAAUuB,GAC7CkG,GAAS,EAAGvE,EAAMlD,EAAUuB,IAE9BvJ,EAAO8H,GAAY,IAAMnH,GAAgB4R,GACzC,IAAIC,GAAkBC,MAAyB9R,EAC1CX,EAAOwS,MAAkBxS,EAAOwS,IAAmBD,IAOxD,IAAIG,GAAa,CAAC,SAAU,UAExBC,GAAY,SAAUvH,EAAOpD,EAAU4H,EAAanG,IACjDmG,GAAejI,GAAWK,KAAW4H,EAAc5H,GAExD,IAAI4K,EAAkBjL,GAAWyD,GAC7B7B,EAAW5B,GAAWiI,GAAeA,EAAc,aACnDiD,SAAmBzH,EAEvB,GAAIsH,GAAW7J,QAAQgK,GAAa,IAAMD,EAExC,OADAzO,EAAe0H,GAAmBjL,EAAY,aAAeiS,GACtDtJ,IAGT,IACE,GAAIqJ,EAAiB,CACnB,IAAIE,EAAc1H,IAClB,GAAIsH,GAAW7J,eAAeiK,GAAe,EAK3C,OAJA3O,EACE0H,GACAT,EAAQ,uBAAyB0H,GAE5BvJ,IAET6B,EAAQ0H,GAEV,MAAOzO,IAEP,OADAF,EAAe0H,GAAmBxH,IAC3BkF,IAGT6B,GAAS,GAAKA,GAAOrG,QAAQ,eAAgB,KAAKA,QAAQ,WAAY,IAEtE,IAAIgO,EAAc,CAAE9H,KAAMrK,EAAWwK,MAAOA,GACxC4H,GAAa/D,IAAiB7L,EAAQ,EAE1C4E,EAAWD,GAAeC,EAAU+K,GAEhC3H,GACF9B,GACE1D,EAAOmN,EAAa,CAClBjF,GAAIhH,KACJqK,MAAO7I,IAAgB0K,GACvBrF,UACGqF,GAAahE,KAAaxI,GAAsB,KAC7CuI,GACA,KAEN/G,SAAU/F,EAAU+F,KAEtBuB,EACAlJ,EACAoJ,IAKFwJ,GAAmB,SAAU7H,EAAOpD,EAAUuB,EAAUE,GAC1DkJ,GAAUvH,EAAOpD,EAAUuB,EAAUE,IAIlCzJ,EAAO6L,MACV7L,EAAO6L,IAAqBoH,IAE9B,IAAIC,GAAYlT,EAAO6L,IAGnBsH,GAAQD,IAAaA,GAAUzK,EAAIyK,GAAUzK,EAAI,GAMrD,IAAK,IAAI2C,MAHTpL,EAAO6L,IAAqBoH,GAGVE,GACZ7O,EAAQ6O,GAAO/H,MACjB/F,MAAMC,QAAQ6N,GAAM/H,KAChBuH,GAAUzO,MAAM,KAAMiP,GAAM/H,KAC5BuH,GAAUQ,GAAM/H,MAIxB,IA0CMgI,GA1CFC,GAAc,SAAUjI,GAE1B,IADA,IAAIkI,EAAUlI,EAAMmI,OAElBD,GACAA,IAAY/R,KACV+R,EAAQpO,cAAkD,OAAlCF,EAAKsO,EAAS,kBAExCA,EAAUA,EAAQE,WAEpB,GAAKF,GAAWA,IAAY/R,EAA5B,CACA,IAAIkS,EAA6B,SAApBH,EAAQI,QACjBtP,EAAOY,EAAKsO,EAAS,gBACzB,GAAKlP,GAAQqP,IAA2B,WAAfrI,EAAMH,MAA/B,CAIA,IAFA,IASM0I,EATF3L,EAAW,CAAE4L,IAAKN,EAAQI,QAAQG,eAClCC,EAAaR,EAAQQ,WAChBlL,EAAI,EAAGA,EAAIkL,EAAWvO,OAAQqD,IAAK,CAC1C,IAAI3D,EAAY6O,EAAWlL,GAC0B,IAAjD3D,EAAUb,KAAKyE,QAAQ,wBACzBb,EAAS/C,EAAUb,KAAKR,MAAM,IAAImB,QAAQ,KAAM,MAC9CE,EAAU0G,OAEZ8H,IACEE,EAASvI,EAAM2I,UACnB/L,EAASgM,YAAcL,GAClBA,EAAOM,aAAeN,EAAOhI,OAAS,IACpC5G,QAAQ,OAAQ,KAChBmP,OACAtQ,MAAM,EAAG,KACZ,IAEN+O,GAAUvO,EAAM4D,EAAU3H,EAAcE,MAG1CgB,EAAIa,iBAAiB,QAASiR,GAAa7S,GAC3Ce,EAAIa,iBAAiB,SAAUiR,GAAa7S,GAI1CP,EAAiBmT,YAAc7S,GAC/ByE,EAAKxB,EAAe,eAAiB/C,IAEjC2S,GAAY,WACd,GACG,UAAU9P,KAAK/B,EAAI4S,MAAQ,KAAO5S,EAAImN,MAAQnN,EAAImN,KAAKuF,cAG1D,IACE,IAAIG,EAAU,IAAIpU,EAAOqU,eACzBD,EAAQE,KAAK,OAAQnT,EAAIoT,KAAMhU,GAC/B6T,EAAQlK,OAAS,WACQ,MAAnBkK,EAAQI,QACV7B,GAAU,WAAY,CACpB8B,IAAKtT,EAAImB,SAAW,KAAOsI,GAAkBzJ,EAAIgK,SACjDqJ,OAAQ,OAGdJ,EAAQM,OACR,MAAOrQ,OAEY,YAAnB9C,EAAIoT,WACNpT,EAAIa,iBAAiB,mBAAoBgR,GAAW5S,GACjD4S,MAEP,MAAO5E,IACPrO,EAAUqO,IAnNY,IAAUvD,GACxBiH,GAvoBkBvG,GAnN9B,CA+iCE3L,OACA,uBACA"} \ No newline at end of file +{"version":3,"file":"latest.source.js","sources":["latest.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData, keepalive) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n var imageUrl =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n\n // Events must survive navigation without taking over links or forms.\n if (keepalive && window.fetch) {\n try {\n window\n .fetch(imageUrl, {\n keepalive: trueVar,\n mode: \"no-cors\",\n credentials: \"omit\",\n })\n .catch(function () {\n image.src = imageUrl;\n });\n return;\n } catch (error) {}\n }\n image.src = imageUrl;\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function (raw) {\n // Customers can overwrite their referrer, here we check for that\n var referrer =\n overwriteOptions.referrer ||\n attr(scriptElement, \"referrer\") ||\n doc.referrer ||\n \"\";\n\n if (raw) return referrer;\n return (\n referrer\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch = \"\";\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n var pathKey = path + querySearch;\n if (!path || lastSendPath == pathKey) return;\n\n lastSendPath = pathKey;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // Only the first pageview can use a Cloudflare referrer as a unique arrival.\n page.unique =\n isPushState || userNavigated\n ? falseVar\n : !sameSite || (!pages && /[?&]__cf_/.test(getReferrer(trueVar)));\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n var manualPageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n window[namespace + \"_\" + pageviewText] = manualPageview;\n var defaultPageview = defaultNamespace + \"_\" + pageviewText;\n if (!window[defaultPageview]) window[defaultPageview] = manualPageview;\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw, keepalive) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback,\n undefinedVar,\n keepalive\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback, keepalive) {\n sendEvent(event, metadata, callback, keepalive);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n\n var inlineEvent = function (event) {\n var element = event.target;\n while (\n element &&\n element !== doc &&\n (!element.getAttribute || attr(element, \"simple-event\") === null)\n )\n element = element.parentNode;\n\n if (!element || element === doc) return;\n var isForm = element.tagName === \"FORM\";\n var name = attr(element, \"simple-event\");\n if (!name || isForm !== (event.type === \"submit\")) return;\n\n var metadata = { tag: element.tagName.toLowerCase() };\n var attributes = element.attributes;\n for (var i = 0; i < attributes.length; i++) {\n var attribute = attributes[i];\n if (attribute.name.indexOf(\"data-simple-event-\") === 0)\n metadata[attribute.name.slice(18).replace(/-/g, \"_\")] =\n attribute.value;\n }\n if (isForm) {\n var button = event.submitter;\n metadata.button_text = button\n ? (button.textContent || button.value || \"\")\n .replace(/\\s+/g, \" \")\n .trim()\n .slice(0, 200)\n : \"\";\n }\n sendEvent(name, metadata, undefinedVar, trueVar);\n };\n\n doc.addEventListener(\"click\", inlineEvent, falseVar);\n doc.addEventListener(\"submit\", inlineEvent, falseVar);\n\n // 404 confirmation adds a request, so existing installs must opt in.\n if (\n overwriteOptions.detect404 === trueVar ||\n attr(scriptElement, \"detect-404\") == trueText\n ) {\n var detect404 = function () {\n if (\n !/\\b404\\b/.test(doc.title + \" \" + (doc.body && doc.body.textContent))\n )\n return;\n try {\n var request = new window.XMLHttpRequest();\n request.open(\"HEAD\", loc.href, trueVar);\n request.onload = function () {\n if (request.status === 404)\n sendEvent(\"page_404\", {\n url: loc.protocol + \"//\" + definedHostname + loc.pathname,\n status: 404,\n });\n };\n request.send();\n } catch (error) {}\n };\n if (doc.readyState === \"loading\")\n doc.addEventListener(\"DOMContentLoaded\", detect404, falseVar);\n else detect404();\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"simpleanalyticscdn.com\",\n \"queue.\",\n \"cdn_latest_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","protocol","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","keepalive","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","imageUrl","key","fetch","mode","credentials","catch","src","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","raw","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","parts","querySearch","shift","pathKey","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","manualPageview","defaultPageview","defaultNamespace","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue","detect404","inlineEvent","element","target","parentNode","isForm","tagName","button","tag","toLowerCase","attributes","submitter","button_text","textContent","trim","title","request","XMLHttpRequest","open","href","status","url","send","readyState"],"mappings":"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"} \ No newline at end of file diff --git a/dist/latest/light.js b/dist/latest/light.js index 7855aaf2..a6a58a63 100644 --- a/dist/latest/light.js +++ b/dist/latest/light.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-15; 57e5; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-15; e3ad; v12) */ !function(f,e,t,m){try{var u=undefined,n="https:",r=f.console,a="doNotTrack",g=f.navigator,p=f.location,h=p.host,i=f.document,o=g.userAgent,c="Not sending request ",v=!1,s=encodeURIComponent,d=decodeURIComponent,l=JSON.stringify,y=f.addEventListener,_="https://queue."+t,b=(i.documentElement,"language"),w=g.userAgentData,O="platform",S="platformVersion",j="https://docs.simpleanalytics.com",k=/(bot|spider|crawl)/i.test(o)&&!/(cubot)/i.test(o),E=i.currentScript||i.querySelector('script[src*="'+t+'"]');m=function(){var e=[].slice.call(arguments);return e.unshift("Simple Analytics:"),Function.prototype.apply.call(r.warn,r,e)};var q=function(e){return"string"==typeof e},x=function(e,t){return e&&e.getAttribute("data-"+t)},A=function(){for(var e,t,n,r={},a=arguments,i=0;i>e/4).toString(16)})}catch(r){return e.replace(n,function(e){var t=16*Math.random()|0;return(e<2?t:3&t|8).toString(16)})}},N=function(e){return"function"==typeof e},R="namespace",U=e[R]||x(E,R)||"sa",V=e.strictUtm||"true"==x(E,"strict-utm"),B=U+"_loaded";if(1==f[B])return m(c+"twice");f.sa_event_loaded=!0,f[B]=!0;var C,T=function(t,e,n,r){t=n?t:A(J,M,t),g.brave&&!n&&(t.brave=!0),g._duckduckgoloader_&&!n&&(t.duck=!0);var a=new Image,i=_+"/simple.gif?"+Object.keys(t).filter(function(e){return t[e]!=u}).map(function(e){return s(e)+"="+s(t[e])}).join("&")+"&time="+Date.now();a.src=i},F=e.hostname||x(E,"hostname"),H=F||h,z={version:"cdn_light_12",hostname:H};e.mode||x(E,"mode");try{C=Intl.DateTimeFormat().resolvedOptions().timeZone}catch(X){m(X)}k&&(z.bot=!0);var J=A(z,{ua:o,https:p.protocol==n,timezone:C,page_id:I(),session_id:I()});if(J.sri=!1,w&&(J.mobile=w.mobile,J.brands=l(w.brands)),H!==h&&(J.hostname_original=h),a in g&&"1"==g[a])return m("Not sending request when "+a+" is enabled. See "+j+"/dnt");-1!=h.indexOf(".")&&!/^[0-9.:]+$/.test(h)||F||m("Set hostname on "+h+". See "+j+"/overwrite-domain-name");var L,M={},P=(e.referrer||x(E,"referrer")||i.referrer||"").replace(h,H).replace(/^https?:\/\/((m|l|w{2,3}([0-9]+)?)\.)?([^?#]+)(.*)$/,"$4").replace(/^([^/]+)$/,"$1")||u,Z=function(e,t){var n=A(z,{type:"append",original_id:t?e:J.page_id});if(t||!g.sendBeacon)T(n,0,!0);else try{g.sendBeacon.bind(g)(_+"/append",l(n))}catch(r){T(n,0,!0)}};y("pagehide",Z,!1);var G,K,Q=function(e){var t="";try{t=e||d(p.pathname)}catch(X){m(X)}return t},W=function(e,t,n,r,a,i){e&&Z(""+J.page_id,!0),J.page_id=I();var o,c=H+Q(),s=(o=t,(r||p.search).slice(1).split("&").filter(function(e){return!o&&new RegExp("^((utm_)"+(V?"":"?")+"(source|medium|content|term|campaign)"+(V?"":"|ref")+")=","i").test(e)}).join("&")||u);T({id:J.page_id,type:"pageview",referrer:!t||n?P:null,query:s}),P=c,0};!function(e,t,n,r){!r&&N(n)&&(r=n);N(r);var a,i="";q(t)&&-1> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n if (ignore) return falseVar;\n // eslint-disable-next-line no-redeclare\n var regex =\n \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \")=\";\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n return q || undefinedVar;\n };\n\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData, keepalive) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n var imageUrl =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n\n image.src = imageUrl;\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n\n\n\n\n\n\n\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n // eslint-disable-next-line no-redeclare\n var bot = isBotAgent;\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n\n\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch = \"\";\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n var pathKey = path + querySearch;\n if (!path || lastSendPath == pathKey) return;\n\n lastSendPath = pathKey;\n page.path = path;\n\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n sameSite = referrer\n ? referrer.split(slash)[0] == locationHostname\n : falseVar;\n\n\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n\n\n pageview();\n\n } catch (e) {\n warn(e);\n }\n})(\n window,\n {},\n \"simpleanalyticscdn.com\",\n \"queue.\",\n \"cdn_light_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","warn","undefinedVar","undefined","https","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","protocol","language","documentElement","uaData","userAgentData","platformText","platformVersionText","docsUrl","isBotAgent","test","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","isString","string","attr","attribute","getAttribute","assign","obj","prop","object","to","arg","index","length","nextSource","constructor","Object","nextKey","hasOwnProperty","settings","sa_settings","logSettings","keys","Date","now","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","replace","c","getRandomValues","Uint8Array","toString","error","r","Math","random","isFunction","func","namespaceText","namespace","strictUtm","loadedVariable","sa_event_loaded","timezone","sendData","data","callback","onlyThisData","keepalive","payload","page","brave","_duckduckgoloader_","duck","image","Image","imageUrl","filter","key","map","join","src","overwrittenHostname","hostname","definedHostname","basePayload","version","mode","Intl","DateTimeFormat","resolvedOptions","timeZone","bot","ua","page_id","session_id","sri","mobile","brands","hostname_original","indexOf","lastSendPath","referrer","sendOnLeave","id","push","append","type","original_id","sendBeacon","bind","e","sameSite","userNavigated","getPath","overwrite","path","pathname","sendPageView","isPushState","deleteSourceInfo","search","metadata","ignoreSource","currentPage","query","split","keyValue","RegExp","pages","pathOverwrite","callbackRaw","parts","querySearch","shift","pathKey","performaceEntryType","perf","performance","navigationText","getEntriesByType","triggerSendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","pageview"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"light.source.js","sources":["light.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n\n var collectMetricByString = function (metricAbbreviation) {\n // eslint-disable-next-line no-unreachable\n return true;\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n if (ignore) return falseVar;\n // eslint-disable-next-line no-redeclare\n var regex =\n \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \")=\";\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n return q || undefinedVar;\n };\n\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData, keepalive) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n var imageUrl =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n\n image.src = imageUrl;\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n\n\n\n\n\n\n\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n // eslint-disable-next-line no-redeclare\n var bot = isBotAgent;\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function (raw) {\n // Customers can overwrite their referrer, here we check for that\n var referrer =\n overwriteOptions.referrer ||\n attr(scriptElement, \"referrer\") ||\n doc.referrer ||\n \"\";\n\n return (\n referrer\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n\n\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch = \"\";\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n var pathKey = path + querySearch;\n if (!path || lastSendPath == pathKey) return;\n\n lastSendPath = pathKey;\n page.path = path;\n\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n sameSite = referrer\n ? referrer.split(slash)[0] == locationHostname\n : falseVar;\n\n\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n\n\n pageview();\n\n } catch (e) {\n warn(e);\n }\n})(\n window,\n {},\n \"simpleanalyticscdn.com\",\n \"queue.\",\n \"cdn_light_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","warn","undefinedVar","undefined","https","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","protocol","language","documentElement","uaData","userAgentData","platformText","platformVersionText","docsUrl","isBotAgent","test","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","isString","string","attr","attribute","getAttribute","assign","obj","prop","object","to","arg","index","length","nextSource","constructor","Object","nextKey","hasOwnProperty","settings","sa_settings","logSettings","keys","Date","now","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","replace","c","getRandomValues","Uint8Array","toString","error","r","Math","random","isFunction","func","namespaceText","namespace","strictUtm","loadedVariable","sa_event_loaded","timezone","sendData","data","callback","onlyThisData","keepalive","payload","page","brave","_duckduckgoloader_","duck","image","Image","imageUrl","filter","key","map","join","src","overwrittenHostname","hostname","definedHostname","basePayload","version","mode","Intl","DateTimeFormat","resolvedOptions","timeZone","bot","ua","page_id","session_id","sri","mobile","brands","hostname_original","indexOf","lastSendPath","referrer","sendOnLeave","id","push","append","type","original_id","sendBeacon","bind","e","sameSite","userNavigated","getPath","overwrite","path","pathname","sendPageView","isPushState","deleteSourceInfo","search","metadata","ignoreSource","currentPage","query","split","keyValue","RegExp","pages","pathOverwrite","callbackRaw","parts","querySearch","shift","pathKey","performaceEntryType","perf","performance","navigationText","getEntriesByType","triggerSendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","pageview"],"mappings":";;CAEA,SACEA,EACAC,EACAC,EAKAC,GAEA,IAQE,IAAIC,EAAeC,UAIfC,EAAQ,SAKRC,EAAMP,EAAOQ,QACbC,EAAa,aACbC,EAAMV,EAAOW,UACbC,EAAMZ,EAAOa,SACbC,EAAmBF,EAAIG,KACvBC,EAAMhB,EAAOiB,SACbC,EAAYR,EAAIQ,UAChBC,EAAa,uBAEbC,GAhBW,EAiBXC,EAAyBC,mBACzBC,EAAyBC,mBACzBC,EAAYC,KAAKD,UAEjBE,EAAuB3B,EAAO4B,iBAC9BC,EAAaC,iBAA0B5B,EAEvC6B,GADkBf,EAAIgB,gBACX,YAIXC,EAASvB,EAAIwB,cAMbC,EAAe,WACfC,EAAsB,kBACtBC,EAAU,mCAEVC,EACF,sBAAsBC,KAAKrB,KAAe,WAAWqB,KAAKrB,GAIxDsB,EACFxB,EAAIyB,eAAiBzB,EAAI0B,cAAc,gBAAkBxC,EAAU,MAOrEC,EAAO,WAEL,IAAIwC,EAAO,GAAGC,MAAMC,KAAKC,WAOzB,OAJAH,EAAKI,QAAQ,qBAINC,SAASC,UAAUC,MAAML,KAAKtC,EAAIJ,KAAMI,EAAKoC,IAGtD,IAQIQ,EAAW,SAAUC,GACvB,MAAwB,iBAAVA,GAOZC,EAAO,SAAUb,EAAec,GAClC,OAAOd,GAAiBA,EAAce,aAAa,QAAUD,IAe3DE,EAAS,WAGX,IAFA,IA7BsBC,EAAKC,EAwBJC,EAKnBC,EAAK,GACLC,EAAMf,UACDgB,EAAQ,EAAGA,EAAQD,EAAIE,OAAQD,IAAS,CAC/C,IAAIE,EAAaH,EAAIC,GACrB,IATqBH,EASRK,IAREL,EAAOM,cAAgBC,OASpC,IAAK,IAAIC,KAAWH,EAlCFP,EAmCJO,EAnCSN,EAmCGS,EAlCvBD,OAAOjB,UAAUmB,eAAevB,KAAKY,EAAKC,KAmCzCE,EAAGO,GAAWH,EAAWG,IAKjC,OAAOP,GAGLS,EAAWrE,EAAOsE,YAClBC,EAAcF,GAAYH,OAAOM,KAAKvE,GAAkB8D,OAG5D9D,EAAmBuD,EAAOvD,EAAkBoE,GAExCE,GAAapE,EAAK,WAAYF,GAQxBwE,KAAKC,IALf,IAOIC,EAAO,WACT,IAAIC,EAAe5E,EAAO6E,QAAU7E,EAAO8E,SACvCC,EAAY,CAAC,MAAQ,KAAO,KAAO,KAAO,KAC1CC,EAAY,SAEhB,IACE,OAAOD,EAAUE,QAAQD,EAAW,SAAUE,GAC5C,OACEA,EACCN,EAAaO,gBAAgB,IAAIC,WAAW,IAAI,GAC9C,IAAOF,EAAI,GACdG,SAAS,MAEb,MAAOC,GACP,OAAOP,EAAUE,QAAQD,EAAW,SAAUE,GAC5C,IAAIK,EAAqB,GAAhBC,KAAKC,SAAiB,EAE/B,OADMP,EAAI,EAAIK,EAAS,EAAJA,EAAW,GACrBF,SAAS,QAKpBK,EAAa,SAAUC,GACzB,MAAsB,mBAARA,GAIZC,EAAgB,YAChBC,EACF5F,EAAiB2F,IACjBvC,EAAKb,EAAeoD,IAqaxB,KA3ZME,EACF7F,EAAiB6F,WAvKJ,QAwKbzC,EAAKb,EAAe,cAoClBuD,EAAiBF,EAAY,UACjC,GA/Mc,GA+MV7F,EAAO+F,GAA4B,OAAO5F,EAAKgB,EAAa,SAChEnB,EAAOgG,iBAhNO,EAiNdhG,EAAO+F,IAjNO,EAwNd,IA8DIE,EA9DAC,EAAW,SAAUC,EAAMC,EAAUC,EAAcC,GACrDH,EAAOE,EAAeF,EAAO3C,EAAO+C,EAASC,EAAML,GAE/CzF,EAAI+F,QAAUJ,IAAcF,EAAKM,OA3NzB,GA4NR/F,EAAIgG,qBAAuBL,IAAcF,EAAKQ,MA5NtC,GA+NZ,IAAIC,EAAQ,IAAIC,MACZC,EACFjF,EACA,eACAqC,OAAOM,KAAK2B,GACTY,OAAO,SAAUC,GAChB,OAAOb,EAAKa,IAAQ5G,IAErB6G,IAAI,SAAUD,GACb,OACE3F,EAAuB2F,GACvB,IACA3F,EAAuB8E,EAAKa,MAG/BE,KAAK,KACR,SACAzC,KAAKC,MAEPkC,EAAMO,IAAML,GAIVM,EACFnH,EAAiBoH,UAAYhE,EAAKb,EAAe,YAC/C8E,EAAkBF,GAAuBtG,EAEzCyG,EAAc,CAChBC,QAuUJ,eAtUIH,SAAUC,GAeDrH,EAAiBwH,MAAQpE,EAAKb,EAAe,QAYxD,IAEEyD,EACIyB,KAAKC,iBAAiBC,kBAAkBC,SAE5C,MAAOvC,GACPnF,EAAKmF,GAQGhD,IAMDiF,EAAYO,KA3SP,GA6Sd,IAAIvB,EAAU/C,EAAO+D,EAAa,CAEhCQ,GAAkC7G,EAElCZ,MAAOM,EAAIkB,UAAYxB,EACvB2F,SAAUA,EACV+B,QAA8BrD,IAG9BsD,WAA0CtD,MAwB5C,GArBA4B,EAAQ2B,KAxTO,EA4TXjG,IACFsE,EAAQ4B,OAASlG,EAAOkG,OACxB5B,EAAQ6B,OAAS3G,EAAUQ,EAAOmG,SAWhCd,IAAoBxG,IACtByF,EAAQ8B,kBAAoBvH,GAG1BL,KAAcC,GAA0B,KAAnBA,EAAID,GAC3B,OAAON,EA/TYgB,4BAgUAV,EAAa,oBAAsB4B,EAAU,SAK7B,GAAlCvB,EAAiBwH,QAAQ,OACxB,aAAa/F,KAAKzB,IACnBsG,GAEDjH,EACE,mBACEW,EACA,SACAuB,EACA,0BAON,IACIkG,EADA/B,EAAO,GAoBPgC,GAdAvI,EAAiBuI,UACjBnF,EAAKb,EAAe,aACpBxB,EAAIwH,UACJ,IAIGvD,QAAQnE,EAAkBwG,GAC1BrC,QAAQ,sDAAuD,MAC/DA,QAAQ,YAAa,OAAS7E,EAcjCqI,EAAc,SAAUC,EAAIC,GAG9B,IAAIC,EAASpF,EAAO+D,EAAa,CAC/BsB,KAAM,SACNC,YAAaH,EAAOD,EAAKnC,EAAQyB,UAKnC,GAAIW,IAASjI,EAAIqI,WAEf7C,EAAS0C,EAAQxI,GA9YP,QAgZV,IACEM,EAAIqI,WAAWC,KAAKtI,EAApBA,CAAyBmB,EAAa,UAAWJ,EAAUmH,IAC3D,MAAOK,GAEP/C,EAAS0C,EAAQxI,GApZT,KA0ZduB,EAxXe,WAwXgB8G,GAzZhB,GAgaf,IAmDIS,EAAUC,EAnDVC,EAAU,SAAUC,GACtB,IAAIC,EAAO,GAIX,IACEA,EAAOD,GAAa9H,EAAuBX,EAAI2I,UAC/C,MAAOjE,GACPnF,EAAKmF,GAMP,OAAOgE,GAMLE,EAAe,SACjBC,EACAC,EACAR,EACAS,EACAC,EACAxD,GAEIqD,GAAahB,EAAY,GAAKlC,EAAQyB,SA7b9B,GA8bYzB,EAAQyB,QAAUrD,IAE1C,IAnR6BkF,EAmRzBC,EAAcxC,EAAkB8B,IAChCW,GApRyBF,EAoRFH,GAAkBC,GAnRjB/I,EAAI+I,QAC7B/G,MAAM,GACNoH,MAAM,KACNjD,OAAO,SAAUkD,GAIhB,OAFaJ,GAaN,IAAIK,OART,YACCpE,EAAY,GAAK,KAClB,yCACCA,EAAY,GAAK,QAClB,KAIuB,KAAKvD,KAAK0H,KAEpC/C,KAAK,MAEI9G,GA+PZ8F,EACE,CACEwC,GAAInC,EAAQyB,QACZa,KAlca,WAmcbL,UAAWkB,GAAoBR,EAAWV,EAAW,KACrDuB,MAAOA,IAOXvB,EAAWsB,EAEXK,IAKa,SACbV,EACAW,EACAR,EACAS,IAEKA,GAAe3E,EAAWkE,KAAWS,EAAcT,GACzClE,EAAW2E,GAA1B,IAIMC,EAHFC,EAAc,GACdpH,EAASiH,KAAgD,EAA9BA,EAAc9B,QAAQ,OAGnD8B,GADIE,EAAQF,EAAcJ,MAAM,MACVQ,QACtBD,EAAc,IAAMD,EAAMpD,KAAK,MAGjC,IAAIoC,EAAOF,EAAQgB,GAGfK,EAAUnB,EAAOiB,EACrB,GAAKjB,GAAQf,GAAgBkC,EAA7B,CAEAlC,EAAekC,EACfjE,EAAK8C,KAAOA,EAKN5I,EAAIqB,KAAWyE,EAAKzE,GAAYrB,EAAIqB,IAK1C,IAII2I,EAJAC,EAAO3K,EAAO4K,YACdC,EAAiB,aAIrB,IACEH,EAAsBC,EAAKG,iBAAiBD,GAAgB,GAAGhC,KAC/D,MAAOvD,GACPnF,EAAKmF,GAGP6D,EAAgBuB,GAC+C,EAA3D,CAAC,SAAU,gBAAgBpC,QAAQoC,GAGnCC,GACAA,EAAKE,KACwC,EAA7C,CAAC,EAAG,GAAGvC,QAAQqC,EAAKE,GAAgBhC,MAGxCK,IAAWV,GACPA,EAASwB,MAtgBH,KAsgBgB,IAAMlJ,EAKhC,IAAIiK,EAAsB,WACxB3J,GAlhBU,EAqhBVoI,EACEC,EAFAA,GAAeN,IAAiB,EAIhCD,EACAqB,IAMJ,GAAKnJ,EAmBH2J,SAjBA,IACM9I,GAAUyD,EAAWzD,EAAO+I,sBAC9B/I,EACG+I,qBAAqB,CAAC7I,EAAcC,IACpC6I,KAAK,SAAUC,GACd3E,EAAQ4E,QAAUD,EAAkB/I,GACpCoE,EAAQ6E,WAAaF,EAAkB9I,GACvC2I,MAEDM,SAAMN,GAETA,IAEF,MAAO9B,GACP8B,MASNO,GAEA,MAAOrC,GACP9I,EAAK8I,IA9kBT,CAilBEjJ,OACA,uBACA"} \ No newline at end of file diff --git a/dist/v12/app.js b/dist/v12/app.js index b79ebe3b..dba496c9 100644 --- a/dist/v12/app.js +++ b/dist/v12/app.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-15; cd24; SRI-version; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-15; c622; SRI-version; v12) */ -!function(m,t,e,n,v){try{var g=undefined,y=!0,_=!1,r="true",a="https:",b="pageview",l="event",i="error",o=m.console,c="doNotTrack",w=m.navigator,s=m.location,O=s.host,u=m.document,f=w.userAgent,p="Not sending request ",d=p+"when ",E=_,h=encodeURIComponent,x=decodeURIComponent,M=JSON.stringify,S=m.addEventListener,k="https://queue."+e,q=u.documentElement||{},A="language",C="Height",D="scroll",$=w.userAgentData,j=D+C,R="offset"+C,H="client"+C,L="pagehide",N="platform",P="platformVersion",T="https://docs.simpleanalytics.com",U=0,I=/(bot|spider|crawl)/i.test(f)&&!/(cubot)/i.test(f),V=m.screen,B=u.currentScript||u.querySelector('script[src*="'+e+'"]');v=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){v("Error in your "+t+" function:",e)},z=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},W=function(t){return"string"==typeof t},G=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},J=function(t,e){return t&&t.getAttribute("data-"+e)},X=function(t){return Array.isArray(t)?t:W(t)&&t.length?t.split(/, ?/):[]},Y=function(t){return t&&t.constructor===Object},Z=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},it=function(t){return"function"==typeof t},ot="namespace",ct=t[ot]||J(B,ot)||"sa",st=function(t,e){var n=m[ct+"_metadata"];Y(n)&&(t=Z(t,n));var r=m[kt];if(!it(r))return kt&&v(kt+" not found, set window."+kt),t;try{return Z(t,r.call(m,Z(t,e)))}catch(a){F("metadata",a)}},ut=t.strictUtm||J(B,"strict-utm")==r,lt=function(i,t){tt=!i&&nt("q")?"":_;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");tt!==_&&0>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},it=function(t){return"function"==typeof t},ot="namespace",ct=n[ot]||J(B,ot)||"sa",st=function(t,e){var n=v[ct+"_metadata"];Y(n)&&(t=Z(t,n));var r=v[kt];if(!it(r))return kt&&m(kt+" not found, set window."+kt),t;try{return Z(t,r.call(v,Z(t,e)))}catch(a){F("metadata",a)}},ut=n.strictUtm||J(B,"strict-utm")==t,lt=function(i,t){tt=!i&&nt("q")?"":_;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");tt!==_&&0> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData, keepalive) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n var imageUrl =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n\n // Inline events must survive navigation without taking over links or forms.\n if (keepalive && window.fetch) {\n try {\n window\n .fetch(imageUrl, {\n keepalive: trueVar,\n mode: \"no-cors\",\n credentials: \"omit\",\n })\n .catch(function () {\n image.src = imageUrl;\n });\n return;\n } catch (error) {}\n }\n image.src = imageUrl;\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = trueVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch = \"\";\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n var pathKey = path + querySearch;\n if (!path || lastSendPath == pathKey) return;\n\n lastSendPath = pathKey;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n var manualPageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n window[namespace + \"_\" + pageviewText] = manualPageview;\n var defaultPageview = defaultNamespace + \"_\" + pageviewText;\n if (!window[defaultPageview]) window[defaultPageview] = manualPageview;\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw, keepalive) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback,\n undefinedVar,\n keepalive\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n\n var inlineEvent = function (event) {\n var element = event.target;\n while (\n element &&\n element !== doc &&\n (!element.getAttribute || attr(element, \"simple-event\") === null)\n )\n element = element.parentNode;\n\n if (!element || element === doc) return;\n var isForm = element.tagName === \"FORM\";\n var name = attr(element, \"simple-event\");\n if (!name || isForm !== (event.type === \"submit\")) return;\n\n var metadata = { tag: element.tagName.toLowerCase() };\n var attributes = element.attributes;\n for (var i = 0; i < attributes.length; i++) {\n var attribute = attributes[i];\n if (attribute.name.indexOf(\"data-simple-event-\") === 0)\n metadata[attribute.name.slice(18).replace(/-/g, \"_\")] =\n attribute.value;\n }\n if (isForm) {\n var button = event.submitter;\n metadata.button_text = button\n ? (button.textContent || button.value || \"\")\n .replace(/\\s+/g, \" \")\n .trim()\n .slice(0, 200)\n : \"\";\n }\n sendEvent(name, metadata, undefinedVar, trueVar);\n };\n\n doc.addEventListener(\"click\", inlineEvent, falseVar);\n doc.addEventListener(\"submit\", inlineEvent, falseVar);\n\n // 404 confirmation adds a request, so existing installs must opt in.\n if (\n overwriteOptions.detect404 === trueVar ||\n attr(scriptElement, \"detect-404\") == trueText\n ) {\n var detect404 = function () {\n if (\n !/\\b404\\b/.test(doc.title + \" \" + (doc.body && doc.body.textContent))\n )\n return;\n try {\n var request = new window.XMLHttpRequest();\n request.open(\"HEAD\", loc.href, trueVar);\n request.onload = function () {\n if (request.status === 404)\n sendEvent(\"page_404\", {\n url: loc.protocol + \"//\" + definedHostname + loc.pathname,\n status: 404,\n });\n };\n request.send();\n } catch (error) {}\n };\n if (doc.readyState === \"loading\")\n doc.addEventListener(\"DOMContentLoaded\", detect404, falseVar);\n else detect404();\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"simpleanalyticscdn.com\",\n \"queue.\",\n \"cdn_latest_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","protocol","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","keepalive","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","imageUrl","key","fetch","mode","credentials","catch","src","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","parts","querySearch","shift","pathKey","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","manualPageview","defaultPageview","defaultNamespace","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue","detect404","inlineEvent","element","target","parentNode","isForm","tagName","button","tag","toLowerCase","attributes","submitter","button_text","textContent","trim","title","request","XMLHttpRequest","open","href","status","url","send","readyState"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"app.js","sources":["app.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData, keepalive) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n var imageUrl =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n\n // Events must survive navigation without taking over links or forms.\n if (keepalive && window.fetch) {\n try {\n window\n .fetch(imageUrl, {\n keepalive: trueVar,\n mode: \"no-cors\",\n credentials: \"omit\",\n })\n .catch(function () {\n image.src = imageUrl;\n });\n return;\n } catch (error) {}\n }\n image.src = imageUrl;\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = trueVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function (raw) {\n // Customers can overwrite their referrer, here we check for that\n var referrer =\n overwriteOptions.referrer ||\n attr(scriptElement, \"referrer\") ||\n doc.referrer ||\n \"\";\n\n if (raw) return referrer;\n return (\n referrer\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch = \"\";\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n var pathKey = path + querySearch;\n if (!path || lastSendPath == pathKey) return;\n\n lastSendPath = pathKey;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // Only the first pageview can use a Cloudflare referrer as a unique arrival.\n page.unique =\n isPushState || userNavigated\n ? falseVar\n : !sameSite || (!pages && /[?&]__cf_/.test(getReferrer(trueVar)));\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n var manualPageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n window[namespace + \"_\" + pageviewText] = manualPageview;\n var defaultPageview = defaultNamespace + \"_\" + pageviewText;\n if (!window[defaultPageview]) window[defaultPageview] = manualPageview;\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw, keepalive) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback,\n undefinedVar,\n keepalive\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback, keepalive) {\n sendEvent(event, metadata, callback, keepalive);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n\n var inlineEvent = function (event) {\n var element = event.target;\n while (\n element &&\n element !== doc &&\n (!element.getAttribute || attr(element, \"simple-event\") === null)\n )\n element = element.parentNode;\n\n if (!element || element === doc) return;\n var isForm = element.tagName === \"FORM\";\n var name = attr(element, \"simple-event\");\n if (!name || isForm !== (event.type === \"submit\")) return;\n\n var metadata = { tag: element.tagName.toLowerCase() };\n var attributes = element.attributes;\n for (var i = 0; i < attributes.length; i++) {\n var attribute = attributes[i];\n if (attribute.name.indexOf(\"data-simple-event-\") === 0)\n metadata[attribute.name.slice(18).replace(/-/g, \"_\")] =\n attribute.value;\n }\n if (isForm) {\n var button = event.submitter;\n metadata.button_text = button\n ? (button.textContent || button.value || \"\")\n .replace(/\\s+/g, \" \")\n .trim()\n .slice(0, 200)\n : \"\";\n }\n sendEvent(name, metadata, undefinedVar, trueVar);\n };\n\n doc.addEventListener(\"click\", inlineEvent, falseVar);\n doc.addEventListener(\"submit\", inlineEvent, falseVar);\n\n // 404 confirmation adds a request, so existing installs must opt in.\n if (\n overwriteOptions.detect404 === trueVar ||\n attr(scriptElement, \"detect-404\") == trueText\n ) {\n var detect404 = function () {\n if (\n !/\\b404\\b/.test(doc.title + \" \" + (doc.body && doc.body.textContent))\n )\n return;\n try {\n var request = new window.XMLHttpRequest();\n request.open(\"HEAD\", loc.href, trueVar);\n request.onload = function () {\n if (request.status === 404)\n sendEvent(\"page_404\", {\n url: loc.protocol + \"//\" + definedHostname + loc.pathname,\n status: 404,\n });\n };\n request.send();\n } catch (error) {}\n };\n if (doc.readyState === \"loading\")\n doc.addEventListener(\"DOMContentLoaded\", detect404, falseVar);\n else detect404();\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"simpleanalyticscdn.com\",\n \"queue.\",\n \"cdn_latest_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","protocol","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","keepalive","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","imageUrl","key","fetch","mode","credentials","catch","src","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","raw","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","parts","querySearch","shift","pathKey","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","manualPageview","defaultPageview","defaultNamespace","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue","detect404","inlineEvent","element","target","parentNode","isForm","tagName","button","tag","toLowerCase","attributes","submitter","button_text","textContent","trim","title","request","XMLHttpRequest","open","href","status","url","send","readyState"],"mappings":"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"} \ No newline at end of file diff --git a/dist/v12/custom/app.js b/dist/v12/custom/app.js index e6eec07b..0564eba5 100644 --- a/dist/v12/custom/app.js +++ b/dist/v12/custom/app.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-15; 07e4; SRI-version; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-15; f311; SRI-version; v12) */ -!function(v,t,e,n,m){try{var g=undefined,y=!0,_=!1,r="true",a="https:",b="pageview",l="event",i="error",o=v.console,c="doNotTrack",w=v.navigator,s=v.location,O=s.host,u=v.document,p=w.userAgent,f="Not sending request ",d=f+"when ",x=_,h=encodeURIComponent,E=decodeURIComponent,M=JSON.stringify,S=v.addEventListener,k="https://"+e,A=u.documentElement||{},q="language",C="Height",D="scroll",$=w.userAgentData,j=D+C,H="offset"+C,R="client"+C,L="pagehide",N="platform",P="platformVersion",T="https://docs.simpleanalytics.com",U=0,I=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),V=v.screen,B=u.currentScript||u.querySelector('script[src*="'+e+'"]');m=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){m("Error in your "+t+" function:",e)},z=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},W=function(t){return"string"==typeof t},G=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},J=function(t,e){return t&&t.getAttribute("data-"+e)},X=function(t){return Array.isArray(t)?t:W(t)&&t.length?t.split(/, ?/):[]},Y=function(t){return t&&t.constructor===Object},Z=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},it=function(t){return"function"==typeof t},ot="namespace",ct=t[ot]||J(B,ot)||"sa",st=function(t,e){var n=v[ct+"_metadata"];Y(n)&&(t=Z(t,n));var r=v[kt];if(!it(r))return kt&&m(kt+" not found, set window."+kt),t;try{return Z(t,r.call(v,Z(t,e)))}catch(a){F("metadata",a)}},ut=t.strictUtm||J(B,"strict-utm")==r,lt=function(i,t){tt=!i&&nt("q")?"":_;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");tt!==_&&0"); +!function(v,n,e,r,m){try{var g=undefined,y=!0,_=!1,t="true",a="https:",b="pageview",l="event",i="error",o=v.console,c="doNotTrack",w=v.navigator,s=v.location,O=s.host,u=v.document,p=w.userAgent,f="Not sending request ",d=f+"when ",x=_,h=encodeURIComponent,E=decodeURIComponent,M=JSON.stringify,S=v.addEventListener,k="https://"+e,A=u.documentElement||{},q="language",C="Height",D="scroll",$=w.userAgentData,j=D+C,H="offset"+C,R="client"+C,L="pagehide",N="platform",P="platformVersion",T="https://docs.simpleanalytics.com",U=0,I=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),V=v.screen,B=u.currentScript||u.querySelector('script[src*="'+e+'"]');m=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){m("Error in your "+t+" function:",e)},z=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},W=function(t){return"string"==typeof t},G=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},J=function(t,e){return t&&t.getAttribute("data-"+e)},X=function(t){return Array.isArray(t)?t:W(t)&&t.length?t.split(/, ?/):[]},Y=function(t){return t&&t.constructor===Object},Z=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},it=function(t){return"function"==typeof t},ot="namespace",ct=n[ot]||J(B,ot)||"sa",st=function(t,e){var n=v[ct+"_metadata"];Y(n)&&(t=Z(t,n));var r=v[kt];if(!it(r))return kt&&m(kt+" not found, set window."+kt),t;try{return Z(t,r.call(v,Z(t,e)))}catch(a){F("metadata",a)}},ut=n.strictUtm||J(B,"strict-utm")==t,lt=function(i,t){tt=!i&&nt("q")?"":_;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");tt!==_&&0"); //# sourceMappingURL=app.js.map \ No newline at end of file diff --git a/dist/v12/custom/app.js.map b/dist/v12/custom/app.js.map index b300b9ef..16cdcd1c 100644 --- a/dist/v12/custom/app.js.map +++ b/dist/v12/custom/app.js.map @@ -1 +1 @@ -{"version":3,"file":"app.source.js","sources":["app.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData, keepalive) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n var imageUrl =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n\n // Inline events must survive navigation without taking over links or forms.\n if (keepalive && window.fetch) {\n try {\n window\n .fetch(imageUrl, {\n keepalive: trueVar,\n mode: \"no-cors\",\n credentials: \"omit\",\n })\n .catch(function () {\n image.src = imageUrl;\n });\n return;\n } catch (error) {}\n }\n image.src = imageUrl;\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = trueVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch = \"\";\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n var pathKey = path + querySearch;\n if (!path || lastSendPath == pathKey) return;\n\n lastSendPath = pathKey;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n var manualPageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n window[namespace + \"_\" + pageviewText] = manualPageview;\n var defaultPageview = defaultNamespace + \"_\" + pageviewText;\n if (!window[defaultPageview]) window[defaultPageview] = manualPageview;\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw, keepalive) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback,\n undefinedVar,\n keepalive\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n\n var inlineEvent = function (event) {\n var element = event.target;\n while (\n element &&\n element !== doc &&\n (!element.getAttribute || attr(element, \"simple-event\") === null)\n )\n element = element.parentNode;\n\n if (!element || element === doc) return;\n var isForm = element.tagName === \"FORM\";\n var name = attr(element, \"simple-event\");\n if (!name || isForm !== (event.type === \"submit\")) return;\n\n var metadata = { tag: element.tagName.toLowerCase() };\n var attributes = element.attributes;\n for (var i = 0; i < attributes.length; i++) {\n var attribute = attributes[i];\n if (attribute.name.indexOf(\"data-simple-event-\") === 0)\n metadata[attribute.name.slice(18).replace(/-/g, \"_\")] =\n attribute.value;\n }\n if (isForm) {\n var button = event.submitter;\n metadata.button_text = button\n ? (button.textContent || button.value || \"\")\n .replace(/\\s+/g, \" \")\n .trim()\n .slice(0, 200)\n : \"\";\n }\n sendEvent(name, metadata, undefinedVar, trueVar);\n };\n\n doc.addEventListener(\"click\", inlineEvent, falseVar);\n doc.addEventListener(\"submit\", inlineEvent, falseVar);\n\n // 404 confirmation adds a request, so existing installs must opt in.\n if (\n overwriteOptions.detect404 === trueVar ||\n attr(scriptElement, \"detect-404\") == trueText\n ) {\n var detect404 = function () {\n if (\n !/\\b404\\b/.test(doc.title + \" \" + (doc.body && doc.body.textContent))\n )\n return;\n try {\n var request = new window.XMLHttpRequest();\n request.open(\"HEAD\", loc.href, trueVar);\n request.onload = function () {\n if (request.status === 404)\n sendEvent(\"page_404\", {\n url: loc.protocol + \"//\" + definedHostname + loc.pathname,\n status: 404,\n });\n };\n request.send();\n } catch (error) {}\n };\n if (doc.readyState === \"loading\")\n doc.addEventListener(\"DOMContentLoaded\", detect404, falseVar);\n else detect404();\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_app_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","keepalive","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","imageUrl","key","fetch","mode","credentials","catch","src","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","protocol","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","parts","querySearch","shift","pathKey","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","manualPageview","defaultPageview","defaultNamespace","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue","detect404","inlineEvent","element","target","parentNode","isForm","tagName","button","tag","toLowerCase","attributes","submitter","button_text","textContent","trim","title","request","XMLHttpRequest","open","href","status","url","send","readyState"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"app.source.js","sources":["app.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData, keepalive) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n var imageUrl =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n\n // Events must survive navigation without taking over links or forms.\n if (keepalive && window.fetch) {\n try {\n window\n .fetch(imageUrl, {\n keepalive: trueVar,\n mode: \"no-cors\",\n credentials: \"omit\",\n })\n .catch(function () {\n image.src = imageUrl;\n });\n return;\n } catch (error) {}\n }\n image.src = imageUrl;\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = trueVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function (raw) {\n // Customers can overwrite their referrer, here we check for that\n var referrer =\n overwriteOptions.referrer ||\n attr(scriptElement, \"referrer\") ||\n doc.referrer ||\n \"\";\n\n if (raw) return referrer;\n return (\n referrer\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch = \"\";\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n var pathKey = path + querySearch;\n if (!path || lastSendPath == pathKey) return;\n\n lastSendPath = pathKey;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // Only the first pageview can use a Cloudflare referrer as a unique arrival.\n page.unique =\n isPushState || userNavigated\n ? falseVar\n : !sameSite || (!pages && /[?&]__cf_/.test(getReferrer(trueVar)));\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n var manualPageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n window[namespace + \"_\" + pageviewText] = manualPageview;\n var defaultPageview = defaultNamespace + \"_\" + pageviewText;\n if (!window[defaultPageview]) window[defaultPageview] = manualPageview;\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw, keepalive) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback,\n undefinedVar,\n keepalive\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback, keepalive) {\n sendEvent(event, metadata, callback, keepalive);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n\n var inlineEvent = function (event) {\n var element = event.target;\n while (\n element &&\n element !== doc &&\n (!element.getAttribute || attr(element, \"simple-event\") === null)\n )\n element = element.parentNode;\n\n if (!element || element === doc) return;\n var isForm = element.tagName === \"FORM\";\n var name = attr(element, \"simple-event\");\n if (!name || isForm !== (event.type === \"submit\")) return;\n\n var metadata = { tag: element.tagName.toLowerCase() };\n var attributes = element.attributes;\n for (var i = 0; i < attributes.length; i++) {\n var attribute = attributes[i];\n if (attribute.name.indexOf(\"data-simple-event-\") === 0)\n metadata[attribute.name.slice(18).replace(/-/g, \"_\")] =\n attribute.value;\n }\n if (isForm) {\n var button = event.submitter;\n metadata.button_text = button\n ? (button.textContent || button.value || \"\")\n .replace(/\\s+/g, \" \")\n .trim()\n .slice(0, 200)\n : \"\";\n }\n sendEvent(name, metadata, undefinedVar, trueVar);\n };\n\n doc.addEventListener(\"click\", inlineEvent, falseVar);\n doc.addEventListener(\"submit\", inlineEvent, falseVar);\n\n // 404 confirmation adds a request, so existing installs must opt in.\n if (\n overwriteOptions.detect404 === trueVar ||\n attr(scriptElement, \"detect-404\") == trueText\n ) {\n var detect404 = function () {\n if (\n !/\\b404\\b/.test(doc.title + \" \" + (doc.body && doc.body.textContent))\n )\n return;\n try {\n var request = new window.XMLHttpRequest();\n request.open(\"HEAD\", loc.href, trueVar);\n request.onload = function () {\n if (request.status === 404)\n sendEvent(\"page_404\", {\n url: loc.protocol + \"//\" + definedHostname + loc.pathname,\n status: 404,\n });\n };\n request.send();\n } catch (error) {}\n };\n if (doc.readyState === \"loading\")\n doc.addEventListener(\"DOMContentLoaded\", detect404, falseVar);\n else detect404();\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_app_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","keepalive","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","imageUrl","key","fetch","mode","credentials","catch","src","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","protocol","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","raw","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","parts","querySearch","shift","pathKey","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","manualPageview","defaultPageview","defaultNamespace","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue","detect404","inlineEvent","element","target","parentNode","isForm","tagName","button","tag","toLowerCase","attributes","submitter","button_text","textContent","trim","title","request","XMLHttpRequest","open","href","status","url","send","readyState"],"mappings":"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"} \ No newline at end of file diff --git a/dist/v12/custom/light.js b/dist/v12/custom/light.js index 69c46230..498b73a6 100644 --- a/dist/v12/custom/light.js +++ b/dist/v12/custom/light.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-15; b6bc; SRI-version; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-15; 72ea; SRI-version; v12) */ !function(f,e,t,m){try{var u=undefined,n="https:",r=f.console,a="doNotTrack",g=f.navigator,p=f.location,h=p.host,i=f.document,o=g.userAgent,c="Not sending request ",v=!1,s=encodeURIComponent,d=decodeURIComponent,l=JSON.stringify,y=f.addEventListener,_="https://"+t,b=(i.documentElement,"language"),w=g.userAgentData,O="platform",S="platformVersion",j="https://docs.simpleanalytics.com",k=/(bot|spider|crawl)/i.test(o)&&!/(cubot)/i.test(o),x=i.currentScript||i.querySelector('script[src*="'+t+'"]');m=function(){var e=[].slice.call(arguments);return e.unshift("Simple Analytics:"),Function.prototype.apply.call(r.warn,r,e)};var E=function(e){return"string"==typeof e},A=function(e,t){return e&&e.getAttribute("data-"+t)},$=function(){for(var e,t,n,r={},a=arguments,i=0;i>e/4).toString(16)})}catch(r){return e.replace(n,function(e){var t=16*Math.random()|0;return(e<2?t:3&t|8).toString(16)})}},N=function(e){return"function"==typeof e},R="namespace",U=e[R]||A(x,R)||"sa",V=e.strictUtm||"true"==A(x,"strict-utm"),B=U+"_loaded";if(1==f[B])return m(c+"twice");f.sa_event_loaded=!0,f[B]=!0;var C,H=function(t,e,n,r){t=n?t:$(J,M,t),g.brave&&!n&&(t.brave=!0),g._duckduckgoloader_&&!n&&(t.duck=!0);var a=new Image,i=_+"/simple.gif?"+Object.keys(t).filter(function(e){return t[e]!=u}).map(function(e){return s(e)+"="+s(t[e])}).join("&")+"&time="+Date.now();a.src=i},T=e.hostname||A(x,"hostname"),F=T||h,z={version:"custom_light_12",hostname:F};e.mode||A(x,"mode");try{C=Intl.DateTimeFormat().resolvedOptions().timeZone}catch(X){m(X)}k&&(z.bot=!0);var J=$(z,{ua:o,https:p.protocol==n,timezone:C,page_id:I(),session_id:I()});if(J.sri=!0,w&&(J.mobile=w.mobile,J.brands=l(w.brands)),F!==h&&(J.hostname_original=h),a in g&&"1"==g[a])return m("Not sending request when "+a+" is enabled. See "+j+"/dnt");-1!=h.indexOf(".")&&!/^[0-9.:]+$/.test(h)||T||m("Set hostname on "+h+". See "+j+"/overwrite-domain-name");var L,M={},P=(e.referrer||A(x,"referrer")||i.referrer||"").replace(h,F).replace(/^https?:\/\/((m|l|w{2,3}([0-9]+)?)\.)?([^?#]+)(.*)$/,"$4").replace(/^([^/]+)$/,"$1")||u,Z=function(e,t){var n=$(z,{type:"append",original_id:t?e:J.page_id});if(t||!g.sendBeacon)H(n,0,!0);else try{g.sendBeacon.bind(g)(_+"/append",l(n))}catch(r){H(n,0,!0)}};y("pagehide",Z,!1);var G,K,Q=function(e){var t="";try{t=e||d(p.pathname)}catch(X){m(X)}return t},W=function(e,t,n,r,a,i){e&&Z(""+J.page_id,!0),J.page_id=I();var o,c=F+Q(),s=(o=t,(r||p.search).slice(1).split("&").filter(function(e){return!o&&new RegExp("^((utm_)"+(V?"":"?")+"(source|medium|content|term|campaign)"+(V?"":"|ref")+")=","i").test(e)}).join("&")||u);H({id:J.page_id,type:"pageview",referrer:!t||n?P:null,query:s}),P=c,0};!function(e,t,n,r){!r&&N(n)&&(r=n);N(r);var a,i="";E(t)&&-1"); //# sourceMappingURL=light.js.map \ No newline at end of file diff --git a/dist/v12/custom/light.js.map b/dist/v12/custom/light.js.map index b728f58c..3cd75b0b 100644 --- a/dist/v12/custom/light.js.map +++ b/dist/v12/custom/light.js.map @@ -1 +1 @@ -{"version":3,"file":"light.source.js","sources":["light.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n\n var collectMetricByString = function (metricAbbreviation) {\n // eslint-disable-next-line no-unreachable\n return true;\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n if (ignore) return falseVar;\n // eslint-disable-next-line no-redeclare\n var regex =\n \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \")=\";\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n return q || undefinedVar;\n };\n\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData, keepalive) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n var imageUrl =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n\n image.src = imageUrl;\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n\n\n\n\n\n\n\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n // eslint-disable-next-line no-redeclare\n var bot = isBotAgent;\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = trueVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n\n\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch = \"\";\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n var pathKey = path + querySearch;\n if (!path || lastSendPath == pathKey) return;\n\n lastSendPath = pathKey;\n page.path = path;\n\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n sameSite = referrer\n ? referrer.split(slash)[0] == locationHostname\n : falseVar;\n\n\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n\n\n pageview();\n\n } catch (e) {\n warn(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_light_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","warn","undefinedVar","undefined","https","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","language","documentElement","uaData","userAgentData","platformText","platformVersionText","docsUrl","isBotAgent","test","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","isString","string","attr","attribute","getAttribute","assign","obj","prop","object","to","arg","index","length","nextSource","constructor","Object","nextKey","hasOwnProperty","settings","sa_settings","logSettings","keys","Date","now","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","replace","c","getRandomValues","Uint8Array","toString","error","r","Math","random","isFunction","func","namespaceText","namespace","strictUtm","loadedVariable","sa_event_loaded","timezone","sendData","data","callback","onlyThisData","keepalive","payload","page","brave","_duckduckgoloader_","duck","image","Image","imageUrl","filter","key","map","join","src","overwrittenHostname","hostname","definedHostname","basePayload","version","mode","Intl","DateTimeFormat","resolvedOptions","timeZone","bot","ua","protocol","page_id","session_id","sri","mobile","brands","hostname_original","indexOf","lastSendPath","referrer","sendOnLeave","id","push","append","type","original_id","sendBeacon","bind","e","sameSite","userNavigated","getPath","overwrite","path","pathname","sendPageView","isPushState","deleteSourceInfo","search","metadata","ignoreSource","currentPage","query","split","keyValue","RegExp","pages","pathOverwrite","callbackRaw","parts","querySearch","shift","pathKey","performaceEntryType","perf","performance","navigationText","getEntriesByType","triggerSendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","pageview"],"mappings":";;CAEA,SACEA,EACAC,EACAC,EAKAC,GAEA,IAQE,IAAIC,EAAeC,UAIfC,EAAQ,SAKRC,EAAMP,EAAOQ,QACbC,EAAa,aACbC,EAAMV,EAAOW,UACbC,EAAMZ,EAAOa,SACbC,EAAmBF,EAAIG,KACvBC,EAAMhB,EAAOiB,SACbC,EAAYR,EAAIQ,UAChBC,EAAa,uBAEbC,GAhBW,EAiBXC,EAAyBC,mBACzBC,EAAyBC,mBACzBC,EAAYC,KAAKD,UAEjBE,EAAuB3B,EAAO4B,iBAC9BC,EAhBWvB,WAgB4BJ,EAEvC4B,GADkBd,EAAIe,gBACX,YAIXC,EAAStB,EAAIuB,cAMbC,EAAe,WACfC,EAAsB,kBACtBC,EAAU,mCAEVC,EACF,sBAAsBC,KAAKpB,KAAe,WAAWoB,KAAKpB,GAIxDqB,EACFvB,EAAIwB,eAAiBxB,EAAIyB,cAAc,gBAAkBvC,EAAU,MAOrEC,EAAO,WAEL,IAAIuC,EAAO,GAAGC,MAAMC,KAAKC,WAOzB,OAJAH,EAAKI,QAAQ,qBAINC,SAASC,UAAUC,MAAML,KAAKrC,EAAIJ,KAAMI,EAAKmC,IAGtD,IAQIQ,EAAW,SAAUC,GACvB,MAAwB,iBAAVA,GAOZC,EAAO,SAAUb,EAAec,GAClC,OAAOd,GAAiBA,EAAce,aAAa,QAAUD,IAe3DE,EAAS,WAGX,IAFA,IA7BsBC,EAAKC,EAwBJC,EAKnBC,EAAK,GACLC,EAAMf,UACDgB,EAAQ,EAAGA,EAAQD,EAAIE,OAAQD,IAAS,CAC/C,IAAIE,EAAaH,EAAIC,GACrB,IATqBH,EASRK,IAREL,EAAOM,cAAgBC,OASpC,IAAK,IAAIC,KAAWH,EAlCFP,EAmCJO,EAnCSN,EAmCGS,EAlCvBD,OAAOjB,UAAUmB,eAAevB,KAAKY,EAAKC,KAmCzCE,EAAGO,GAAWH,EAAWG,IAKjC,OAAOP,GAGLS,EAAWpE,EAAOqE,YAClBC,EAAcF,GAAYH,OAAOM,KAAKtE,GAAkB6D,OAG5D7D,EAAmBsD,EAAOtD,EAAkBmE,GAExCE,GAAanE,EAAK,WAAYF,GAQxBuE,KAAKC,IALf,IAOIC,EAAO,WACT,IAAIC,EAAe3E,EAAO4E,QAAU5E,EAAO6E,SACvCC,EAAY,CAAC,MAAQ,KAAO,KAAO,KAAO,KAC1CC,EAAY,SAEhB,IACE,OAAOD,EAAUE,QAAQD,EAAW,SAAUE,GAC5C,OACEA,EACCN,EAAaO,gBAAgB,IAAIC,WAAW,IAAI,GAC9C,IAAOF,EAAI,GACdG,SAAS,MAEb,MAAOC,GACP,OAAOP,EAAUE,QAAQD,EAAW,SAAUE,GAC5C,IAAIK,EAAqB,GAAhBC,KAAKC,SAAiB,EAE/B,OADMP,EAAI,EAAIK,EAAS,EAAJA,EAAW,GACrBF,SAAS,QAKpBK,EAAa,SAAUC,GACzB,MAAsB,mBAARA,GAIZC,EAAgB,YAChBC,EACF3F,EAAiB0F,IACjBvC,EAAKb,EAAeoD,IAkaxB,KAxZME,EACF5F,EAAiB4F,WAvKJ,QAwKbzC,EAAKb,EAAe,cAoClBuD,EAAiBF,EAAY,UACjC,GA/Mc,GA+MV5F,EAAO8F,GAA4B,OAAO3F,EAAKgB,EAAa,SAChEnB,EAAO+F,iBAhNO,EAiNd/F,EAAO8F,IAjNO,EAwNd,IA8DIE,EA9DAC,EAAW,SAAUC,EAAMC,EAAUC,EAAcC,GACrDH,EAAOE,EAAeF,EAAO3C,EAAO+C,EAASC,EAAML,GAE/CxF,EAAI8F,QAAUJ,IAAcF,EAAKM,OA3NzB,GA4NR9F,EAAI+F,qBAAuBL,IAAcF,EAAKQ,MA5NtC,GA+NZ,IAAIC,EAAQ,IAAIC,MACZC,EACFhF,EACA,eACAoC,OAAOM,KAAK2B,GACTY,OAAO,SAAUC,GAChB,OAAOb,EAAKa,IAAQ3G,IAErB4G,IAAI,SAAUD,GACb,OACE1F,EAAuB0F,GACvB,IACA1F,EAAuB6E,EAAKa,MAG/BE,KAAK,KACR,SACAzC,KAAKC,MAEPkC,EAAMO,IAAML,GAIVM,EACFlH,EAAiBmH,UAAYhE,EAAKb,EAAe,YAC/C8E,EAAkBF,GAAuBrG,EAEzCwG,EAAc,CAChBC,QAoUJ,kBAnUIH,SAAUC,GAeDpH,EAAiBuH,MAAQpE,EAAKb,EAAe,QAYxD,IAEEyD,EACIyB,KAAKC,iBAAiBC,kBAAkBC,SAE5C,MAAOvC,GACPlF,EAAKkF,GAQGhD,IAMDiF,EAAYO,KA3SP,GA6Sd,IAAIvB,EAAU/C,EAAO+D,EAAa,CAEhCQ,GAAkC5G,EAElCZ,MAAOM,EAAImH,UAAYzH,EACvB0F,SAAUA,EACVgC,QAA8BtD,IAG9BuD,WAA0CvD,MAwB5C,GArBA4B,EAAQ4B,KAzTM,EA6TVlG,IACFsE,EAAQ6B,OAASnG,EAAOmG,OACxB7B,EAAQ8B,OAAS3G,EAAUO,EAAOoG,SAWhCf,IAAoBvG,IACtBwF,EAAQ+B,kBAAoBvH,GAG1BL,KAAcC,GAA0B,KAAnBA,EAAID,GAC3B,OAAON,EA/TYgB,4BAgUAV,EAAa,oBAAsB2B,EAAU,SAK7B,GAAlCtB,EAAiBwH,QAAQ,OACxB,aAAahG,KAAKxB,IACnBqG,GAEDhH,EACE,mBACEW,EACA,SACAsB,EACA,0BAON,IACImG,EADAhC,EAAO,GAiBPiC,GAXAvI,EAAiBuI,UAAYpF,EAAKb,EAAe,aAGzBvB,EAAIwH,UAAY,IACrCxD,QAAQlE,EAAkBuG,GAC1BrC,QAAQ,sDAAuD,MAC/DA,QAAQ,YAAa,OAAS5E,EAcjCqI,EAAc,SAAUC,EAAIC,GAG9B,IAAIC,EAASrF,EAAO+D,EAAa,CAC/BuB,KAAM,SACNC,YAAaH,EAAOD,EAAKpC,EAAQ0B,UAKnC,GAAIW,IAASjI,EAAIqI,WAEf9C,EAAS2C,EAAQxI,GA3YP,QA6YV,IACEM,EAAIqI,WAAWC,KAAKtI,EAApBA,CAAyBmB,EAAa,UAAWJ,EAAUmH,IAC3D,MAAOK,GAEPhD,EAAS2C,EAAQxI,GAjZT,KAuZduB,EArXe,WAqXgB8G,GAtZhB,GA6Zf,IAmDIS,EAAUC,EAnDVC,EAAU,SAAUC,GACtB,IAAIC,EAAO,GAIX,IACEA,EAAOD,GAAa9H,EAAuBX,EAAI2I,UAC/C,MAAOlE,GACPlF,EAAKkF,GAMP,OAAOiE,GAMLE,EAAe,SACjBC,EACAC,EACAR,EACAS,EACAC,EACAzD,GAEIsD,GAAahB,EAAY,GAAKnC,EAAQ0B,SA1b9B,GA2bY1B,EAAQ0B,QAAUtD,IAE1C,IAhR6BmF,EAgRzBC,EAAczC,EAAkB+B,IAChCW,GAjRyBF,EAiRFH,GAAkBC,GAhRjB/I,EAAI+I,QAC7BhH,MAAM,GACNqH,MAAM,KACNlD,OAAO,SAAUmD,GAIhB,OAFaJ,GAaN,IAAIK,OART,YACCrE,EAAY,GAAK,KAClB,yCACCA,EAAY,GAAK,QAClB,KAIuB,KAAKvD,KAAK2H,KAEpChD,KAAK,MAEI7G,GA4PZ6F,EACE,CACEyC,GAAIpC,EAAQ0B,QACZa,KA/ba,WAgcbL,UAAWkB,GAAoBR,EAAWV,EAAW,KACrDuB,MAAOA,IAOXvB,EAAWsB,EAEXK,IAKa,SACbV,EACAW,EACAR,EACAS,IAEKA,GAAe5E,EAAWmE,KAAWS,EAAcT,GACzCnE,EAAW4E,GAA1B,IAIMC,EAHFC,EAAc,GACdrH,EAASkH,KAAgD,EAA9BA,EAAc9B,QAAQ,OAGnD8B,GADIE,EAAQF,EAAcJ,MAAM,MACVQ,QACtBD,EAAc,IAAMD,EAAMrD,KAAK,MAGjC,IAAIqC,EAAOF,EAAQgB,GAGfK,EAAUnB,EAAOiB,EACrB,GAAKjB,GAAQf,GAAgBkC,EAA7B,CAEAlC,EAAekC,EACflE,EAAK+C,KAAOA,EAKN5I,EAAIoB,KAAWyE,EAAKzE,GAAYpB,EAAIoB,IAK1C,IAII4I,EAJAC,EAAO3K,EAAO4K,YACdC,EAAiB,aAIrB,IACEH,EAAsBC,EAAKG,iBAAiBD,GAAgB,GAAGhC,KAC/D,MAAOxD,GACPlF,EAAKkF,GAGP8D,EAAgBuB,GAC+C,EAA3D,CAAC,SAAU,gBAAgBpC,QAAQoC,GAGnCC,GACAA,EAAKE,KACwC,EAA7C,CAAC,EAAG,GAAGvC,QAAQqC,EAAKE,GAAgBhC,MAGxCK,IAAWV,GACPA,EAASwB,MAngBH,KAmgBgB,IAAMlJ,EAKhC,IAAIiK,EAAsB,WACxB3J,GA/gBU,EAkhBVoI,EACEC,EAFAA,GAAeN,IAAiB,EAIhCD,EACAqB,IAMJ,GAAKnJ,EAmBH2J,SAjBA,IACM/I,GAAUyD,EAAWzD,EAAOgJ,sBAC9BhJ,EACGgJ,qBAAqB,CAAC9I,EAAcC,IACpC8I,KAAK,SAAUC,GACd5E,EAAQ6E,QAAUD,EAAkBhJ,GACpCoE,EAAQ8E,WAAaF,EAAkB/I,GACvC4I,MAEDM,SAAMN,GAETA,IAEF,MAAO9B,GACP8B,MASNO,GAEA,MAAOrC,GACP9I,EAAK8I,IA3kBT,CA8kBEjJ,OACA,uBACA"} \ No newline at end of file +{"version":3,"file":"light.source.js","sources":["light.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n\n var collectMetricByString = function (metricAbbreviation) {\n // eslint-disable-next-line no-unreachable\n return true;\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n if (ignore) return falseVar;\n // eslint-disable-next-line no-redeclare\n var regex =\n \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \")=\";\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n return q || undefinedVar;\n };\n\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData, keepalive) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n var imageUrl =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n\n image.src = imageUrl;\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n\n\n\n\n\n\n\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n // eslint-disable-next-line no-redeclare\n var bot = isBotAgent;\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = trueVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function (raw) {\n // Customers can overwrite their referrer, here we check for that\n var referrer =\n overwriteOptions.referrer ||\n attr(scriptElement, \"referrer\") ||\n doc.referrer ||\n \"\";\n\n return (\n referrer\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n\n\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch = \"\";\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n var pathKey = path + querySearch;\n if (!path || lastSendPath == pathKey) return;\n\n lastSendPath = pathKey;\n page.path = path;\n\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n sameSite = referrer\n ? referrer.split(slash)[0] == locationHostname\n : falseVar;\n\n\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n\n\n pageview();\n\n } catch (e) {\n warn(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_light_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","warn","undefinedVar","undefined","https","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","language","documentElement","uaData","userAgentData","platformText","platformVersionText","docsUrl","isBotAgent","test","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","isString","string","attr","attribute","getAttribute","assign","obj","prop","object","to","arg","index","length","nextSource","constructor","Object","nextKey","hasOwnProperty","settings","sa_settings","logSettings","keys","Date","now","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","replace","c","getRandomValues","Uint8Array","toString","error","r","Math","random","isFunction","func","namespaceText","namespace","strictUtm","loadedVariable","sa_event_loaded","timezone","sendData","data","callback","onlyThisData","keepalive","payload","page","brave","_duckduckgoloader_","duck","image","Image","imageUrl","filter","key","map","join","src","overwrittenHostname","hostname","definedHostname","basePayload","version","mode","Intl","DateTimeFormat","resolvedOptions","timeZone","bot","ua","protocol","page_id","session_id","sri","mobile","brands","hostname_original","indexOf","lastSendPath","referrer","sendOnLeave","id","push","append","type","original_id","sendBeacon","bind","e","sameSite","userNavigated","getPath","overwrite","path","pathname","sendPageView","isPushState","deleteSourceInfo","search","metadata","ignoreSource","currentPage","query","split","keyValue","RegExp","pages","pathOverwrite","callbackRaw","parts","querySearch","shift","pathKey","performaceEntryType","perf","performance","navigationText","getEntriesByType","triggerSendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","pageview"],"mappings":"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"} \ No newline at end of file diff --git a/dist/v12/custom/proxy.js b/dist/v12/custom/proxy.js index ddae4b88..ddeebf2b 100644 --- a/dist/v12/custom/proxy.js +++ b/dist/v12/custom/proxy.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-15; 5f54; SRI-version; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-15; 382b; SRI-version; v12) */ -!function(v,t,e,n,m){try{var g=undefined,y=!0,_=!1,r="true",a="https:",b="pageview",l="event",i="error",o=v.console,c="doNotTrack",w=v.navigator,s=v.location,x=s.host,u=v.document,f=w.userAgent,p="Not sending request ",d=p+"when ",O=_,h=encodeURIComponent,E=decodeURIComponent,M=JSON.stringify,S=v.addEventListener,k="https://"+e,A=u.documentElement||{},q="language",C="Height",D="scroll",$=w.userAgentData,j=D+C,H="offset"+C,R="client"+C,L="pagehide",N="platform",P="platformVersion",T="https://docs.simpleanalytics.com",U=0,I=/(bot|spider|crawl)/i.test(f)&&!/(cubot)/i.test(f),V=v.screen,B=u.currentScript||u.querySelector('script[src*="'+e+'"]');m=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){m("Error in your "+t+" function:",e)},z=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},W=function(t){return"string"==typeof t},G=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},J=function(t,e){return t&&t.getAttribute("data-"+e)},X=function(t){return Array.isArray(t)?t:W(t)&&t.length?t.split(/, ?/):[]},Y=function(t){return t&&t.constructor===Object},Z=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},it=function(t){return"function"==typeof t},ot="namespace",ct=t[ot]||J(B,ot)||"sa",st=function(t,e){var n=v[ct+"_metadata"];Y(n)&&(t=Z(t,n));var r=v[kt];if(!it(r))return kt&&m(kt+" not found, set window."+kt),t;try{return Z(t,r.call(v,Z(t,e)))}catch(a){F("metadata",a)}},ut=t.strictUtm||J(B,"strict-utm")==r,lt=function(i,t){tt=!i&&nt("q")?"":_;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");tt!==_&&0"); +!function(v,n,e,r,m){try{var g=undefined,y=!0,_=!1,t="true",a="https:",b="pageview",l="event",i="error",o=v.console,c="doNotTrack",w=v.navigator,s=v.location,x=s.host,u=v.document,f=w.userAgent,p="Not sending request ",d=p+"when ",O=_,h=encodeURIComponent,E=decodeURIComponent,M=JSON.stringify,S=v.addEventListener,k="https://"+e,A=u.documentElement||{},q="language",C="Height",D="scroll",$=w.userAgentData,j=D+C,H="offset"+C,R="client"+C,L="pagehide",N="platform",P="platformVersion",T="https://docs.simpleanalytics.com",U=0,I=/(bot|spider|crawl)/i.test(f)&&!/(cubot)/i.test(f),V=v.screen,B=u.currentScript||u.querySelector('script[src*="'+e+'"]');m=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){m("Error in your "+t+" function:",e)},z=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},W=function(t){return"string"==typeof t},G=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},J=function(t,e){return t&&t.getAttribute("data-"+e)},X=function(t){return Array.isArray(t)?t:W(t)&&t.length?t.split(/, ?/):[]},Y=function(t){return t&&t.constructor===Object},Z=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},it=function(t){return"function"==typeof t},ot="namespace",ct=n[ot]||J(B,ot)||"sa",st=function(t,e){var n=v[ct+"_metadata"];Y(n)&&(t=Z(t,n));var r=v[kt];if(!it(r))return kt&&m(kt+" not found, set window."+kt),t;try{return Z(t,r.call(v,Z(t,e)))}catch(a){F("metadata",a)}},ut=n.strictUtm||J(B,"strict-utm")==t,lt=function(i,t){tt=!i&&nt("q")?"":_;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");tt!==_&&0"); //# sourceMappingURL=proxy.js.map \ No newline at end of file diff --git a/dist/v12/custom/proxy.js.map b/dist/v12/custom/proxy.js.map index 638dbe5a..d846c28e 100644 --- a/dist/v12/custom/proxy.js.map +++ b/dist/v12/custom/proxy.js.map @@ -1 +1 @@ -{"version":3,"file":"proxy.source.js","sources":["proxy.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData, keepalive) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n var imageUrl =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n\n // Inline events must survive navigation without taking over links or forms.\n if (keepalive && window.fetch) {\n try {\n window\n .fetch(imageUrl, {\n keepalive: trueVar,\n mode: \"no-cors\",\n credentials: \"omit\",\n })\n .catch(function () {\n image.src = imageUrl;\n });\n return;\n } catch (error) {}\n }\n image.src = imageUrl;\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = trueVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch = \"\";\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n var pathKey = path + querySearch;\n if (!path || lastSendPath == pathKey) return;\n\n lastSendPath = pathKey;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n var manualPageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n window[namespace + \"_\" + pageviewText] = manualPageview;\n var defaultPageview = defaultNamespace + \"_\" + pageviewText;\n if (!window[defaultPageview]) window[defaultPageview] = manualPageview;\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw, keepalive) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback,\n undefinedVar,\n keepalive\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n\n var inlineEvent = function (event) {\n var element = event.target;\n while (\n element &&\n element !== doc &&\n (!element.getAttribute || attr(element, \"simple-event\") === null)\n )\n element = element.parentNode;\n\n if (!element || element === doc) return;\n var isForm = element.tagName === \"FORM\";\n var name = attr(element, \"simple-event\");\n if (!name || isForm !== (event.type === \"submit\")) return;\n\n var metadata = { tag: element.tagName.toLowerCase() };\n var attributes = element.attributes;\n for (var i = 0; i < attributes.length; i++) {\n var attribute = attributes[i];\n if (attribute.name.indexOf(\"data-simple-event-\") === 0)\n metadata[attribute.name.slice(18).replace(/-/g, \"_\")] =\n attribute.value;\n }\n if (isForm) {\n var button = event.submitter;\n metadata.button_text = button\n ? (button.textContent || button.value || \"\")\n .replace(/\\s+/g, \" \")\n .trim()\n .slice(0, 200)\n : \"\";\n }\n sendEvent(name, metadata, undefinedVar, trueVar);\n };\n\n doc.addEventListener(\"click\", inlineEvent, falseVar);\n doc.addEventListener(\"submit\", inlineEvent, falseVar);\n\n // 404 confirmation adds a request, so existing installs must opt in.\n if (\n overwriteOptions.detect404 === trueVar ||\n attr(scriptElement, \"detect-404\") == trueText\n ) {\n var detect404 = function () {\n if (\n !/\\b404\\b/.test(doc.title + \" \" + (doc.body && doc.body.textContent))\n )\n return;\n try {\n var request = new window.XMLHttpRequest();\n request.open(\"HEAD\", loc.href, trueVar);\n request.onload = function () {\n if (request.status === 404)\n sendEvent(\"page_404\", {\n url: loc.protocol + \"//\" + definedHostname + loc.pathname,\n status: 404,\n });\n };\n request.send();\n } catch (error) {}\n };\n if (doc.readyState === \"loading\")\n doc.addEventListener(\"DOMContentLoaded\", detect404, falseVar);\n else detect404();\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_proxy_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","keepalive","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","imageUrl","key","fetch","mode","credentials","catch","src","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","protocol","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","parts","querySearch","shift","pathKey","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","manualPageview","defaultPageview","defaultNamespace","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue","detect404","inlineEvent","element","target","parentNode","isForm","tagName","button","tag","toLowerCase","attributes","submitter","button_text","textContent","trim","title","request","XMLHttpRequest","open","href","status","url","send","readyState"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"proxy.source.js","sources":["proxy.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData, keepalive) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n var imageUrl =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n\n // Events must survive navigation without taking over links or forms.\n if (keepalive && window.fetch) {\n try {\n window\n .fetch(imageUrl, {\n keepalive: trueVar,\n mode: \"no-cors\",\n credentials: \"omit\",\n })\n .catch(function () {\n image.src = imageUrl;\n });\n return;\n } catch (error) {}\n }\n image.src = imageUrl;\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = trueVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function (raw) {\n // Customers can overwrite their referrer, here we check for that\n var referrer =\n overwriteOptions.referrer ||\n attr(scriptElement, \"referrer\") ||\n doc.referrer ||\n \"\";\n\n if (raw) return referrer;\n return (\n referrer\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch = \"\";\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n var pathKey = path + querySearch;\n if (!path || lastSendPath == pathKey) return;\n\n lastSendPath = pathKey;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // Only the first pageview can use a Cloudflare referrer as a unique arrival.\n page.unique =\n isPushState || userNavigated\n ? falseVar\n : !sameSite || (!pages && /[?&]__cf_/.test(getReferrer(trueVar)));\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n var manualPageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n window[namespace + \"_\" + pageviewText] = manualPageview;\n var defaultPageview = defaultNamespace + \"_\" + pageviewText;\n if (!window[defaultPageview]) window[defaultPageview] = manualPageview;\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw, keepalive) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback,\n undefinedVar,\n keepalive\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback, keepalive) {\n sendEvent(event, metadata, callback, keepalive);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n\n var inlineEvent = function (event) {\n var element = event.target;\n while (\n element &&\n element !== doc &&\n (!element.getAttribute || attr(element, \"simple-event\") === null)\n )\n element = element.parentNode;\n\n if (!element || element === doc) return;\n var isForm = element.tagName === \"FORM\";\n var name = attr(element, \"simple-event\");\n if (!name || isForm !== (event.type === \"submit\")) return;\n\n var metadata = { tag: element.tagName.toLowerCase() };\n var attributes = element.attributes;\n for (var i = 0; i < attributes.length; i++) {\n var attribute = attributes[i];\n if (attribute.name.indexOf(\"data-simple-event-\") === 0)\n metadata[attribute.name.slice(18).replace(/-/g, \"_\")] =\n attribute.value;\n }\n if (isForm) {\n var button = event.submitter;\n metadata.button_text = button\n ? (button.textContent || button.value || \"\")\n .replace(/\\s+/g, \" \")\n .trim()\n .slice(0, 200)\n : \"\";\n }\n sendEvent(name, metadata, undefinedVar, trueVar);\n };\n\n doc.addEventListener(\"click\", inlineEvent, falseVar);\n doc.addEventListener(\"submit\", inlineEvent, falseVar);\n\n // 404 confirmation adds a request, so existing installs must opt in.\n if (\n overwriteOptions.detect404 === trueVar ||\n attr(scriptElement, \"detect-404\") == trueText\n ) {\n var detect404 = function () {\n if (\n !/\\b404\\b/.test(doc.title + \" \" + (doc.body && doc.body.textContent))\n )\n return;\n try {\n var request = new window.XMLHttpRequest();\n request.open(\"HEAD\", loc.href, trueVar);\n request.onload = function () {\n if (request.status === 404)\n sendEvent(\"page_404\", {\n url: loc.protocol + \"//\" + definedHostname + loc.pathname,\n status: 404,\n });\n };\n request.send();\n } catch (error) {}\n };\n if (doc.readyState === \"loading\")\n doc.addEventListener(\"DOMContentLoaded\", detect404, falseVar);\n else detect404();\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_proxy_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","keepalive","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","imageUrl","key","fetch","mode","credentials","catch","src","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","protocol","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","raw","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","parts","querySearch","shift","pathKey","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","manualPageview","defaultPageview","defaultNamespace","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue","detect404","inlineEvent","element","target","parentNode","isForm","tagName","button","tag","toLowerCase","attributes","submitter","button_text","textContent","trim","title","request","XMLHttpRequest","open","href","status","url","send","readyState"],"mappings":"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"} \ No newline at end of file diff --git a/dist/v12/light.js b/dist/v12/light.js index 876211bb..9b3f624b 100644 --- a/dist/v12/light.js +++ b/dist/v12/light.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-15; 6cb2; SRI-version; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-15; df91; SRI-version; v12) */ !function(f,e,t,m){try{var u=undefined,n="https:",r=f.console,a="doNotTrack",g=f.navigator,p=f.location,h=p.host,i=f.document,o=g.userAgent,c="Not sending request ",v=!1,s=encodeURIComponent,d=decodeURIComponent,l=JSON.stringify,y=f.addEventListener,_="https://queue."+t,b=(i.documentElement,"language"),w=g.userAgentData,O="platform",S="platformVersion",j="https://docs.simpleanalytics.com",k=/(bot|spider|crawl)/i.test(o)&&!/(cubot)/i.test(o),E=i.currentScript||i.querySelector('script[src*="'+t+'"]');m=function(){var e=[].slice.call(arguments);return e.unshift("Simple Analytics:"),Function.prototype.apply.call(r.warn,r,e)};var q=function(e){return"string"==typeof e},x=function(e,t){return e&&e.getAttribute("data-"+t)},A=function(){for(var e,t,n,r={},a=arguments,i=0;i>e/4).toString(16)})}catch(r){return e.replace(n,function(e){var t=16*Math.random()|0;return(e<2?t:3&t|8).toString(16)})}},N=function(e){return"function"==typeof e},R="namespace",U=e[R]||x(E,R)||"sa",V=e.strictUtm||"true"==x(E,"strict-utm"),B=U+"_loaded";if(1==f[B])return m(c+"twice");f.sa_event_loaded=!0,f[B]=!0;var C,T=function(t,e,n,r){t=n?t:A(J,M,t),g.brave&&!n&&(t.brave=!0),g._duckduckgoloader_&&!n&&(t.duck=!0);var a=new Image,i=_+"/simple.gif?"+Object.keys(t).filter(function(e){return t[e]!=u}).map(function(e){return s(e)+"="+s(t[e])}).join("&")+"&time="+Date.now();a.src=i},F=e.hostname||x(E,"hostname"),H=F||h,z={version:"cdn_light_12",hostname:H};e.mode||x(E,"mode");try{C=Intl.DateTimeFormat().resolvedOptions().timeZone}catch(X){m(X)}k&&(z.bot=!0);var J=A(z,{ua:o,https:p.protocol==n,timezone:C,page_id:I(),session_id:I()});if(J.sri=!0,w&&(J.mobile=w.mobile,J.brands=l(w.brands)),H!==h&&(J.hostname_original=h),a in g&&"1"==g[a])return m("Not sending request when "+a+" is enabled. See "+j+"/dnt");-1!=h.indexOf(".")&&!/^[0-9.:]+$/.test(h)||F||m("Set hostname on "+h+". See "+j+"/overwrite-domain-name");var L,M={},P=(e.referrer||x(E,"referrer")||i.referrer||"").replace(h,H).replace(/^https?:\/\/((m|l|w{2,3}([0-9]+)?)\.)?([^?#]+)(.*)$/,"$4").replace(/^([^/]+)$/,"$1")||u,Z=function(e,t){var n=A(z,{type:"append",original_id:t?e:J.page_id});if(t||!g.sendBeacon)T(n,0,!0);else try{g.sendBeacon.bind(g)(_+"/append",l(n))}catch(r){T(n,0,!0)}};y("pagehide",Z,!1);var G,K,Q=function(e){var t="";try{t=e||d(p.pathname)}catch(X){m(X)}return t},W=function(e,t,n,r,a,i){e&&Z(""+J.page_id,!0),J.page_id=I();var o,c=H+Q(),s=(o=t,(r||p.search).slice(1).split("&").filter(function(e){return!o&&new RegExp("^((utm_)"+(V?"":"?")+"(source|medium|content|term|campaign)"+(V?"":"|ref")+")=","i").test(e)}).join("&")||u);T({id:J.page_id,type:"pageview",referrer:!t||n?P:null,query:s}),P=c,0};!function(e,t,n,r){!r&&N(n)&&(r=n);N(r);var a,i="";q(t)&&-1> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n if (ignore) return falseVar;\n // eslint-disable-next-line no-redeclare\n var regex =\n \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \")=\";\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n return q || undefinedVar;\n };\n\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData, keepalive) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n var imageUrl =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n\n image.src = imageUrl;\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n\n\n\n\n\n\n\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n // eslint-disable-next-line no-redeclare\n var bot = isBotAgent;\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = trueVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n\n\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch = \"\";\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n var pathKey = path + querySearch;\n if (!path || lastSendPath == pathKey) return;\n\n lastSendPath = pathKey;\n page.path = path;\n\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n sameSite = referrer\n ? referrer.split(slash)[0] == locationHostname\n : falseVar;\n\n\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n\n\n pageview();\n\n } catch (e) {\n warn(e);\n }\n})(\n window,\n {},\n \"simpleanalyticscdn.com\",\n \"queue.\",\n \"cdn_light_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","warn","undefinedVar","undefined","https","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","protocol","language","documentElement","uaData","userAgentData","platformText","platformVersionText","docsUrl","isBotAgent","test","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","isString","string","attr","attribute","getAttribute","assign","obj","prop","object","to","arg","index","length","nextSource","constructor","Object","nextKey","hasOwnProperty","settings","sa_settings","logSettings","keys","Date","now","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","replace","c","getRandomValues","Uint8Array","toString","error","r","Math","random","isFunction","func","namespaceText","namespace","strictUtm","loadedVariable","sa_event_loaded","timezone","sendData","data","callback","onlyThisData","keepalive","payload","page","brave","_duckduckgoloader_","duck","image","Image","imageUrl","filter","key","map","join","src","overwrittenHostname","hostname","definedHostname","basePayload","version","mode","Intl","DateTimeFormat","resolvedOptions","timeZone","bot","ua","page_id","session_id","sri","mobile","brands","hostname_original","indexOf","lastSendPath","referrer","sendOnLeave","id","push","append","type","original_id","sendBeacon","bind","e","sameSite","userNavigated","getPath","overwrite","path","pathname","sendPageView","isPushState","deleteSourceInfo","search","metadata","ignoreSource","currentPage","query","split","keyValue","RegExp","pages","pathOverwrite","callbackRaw","parts","querySearch","shift","pathKey","performaceEntryType","perf","performance","navigationText","getEntriesByType","triggerSendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","pageview"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"light.source.js","sources":["light.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n\n var collectMetricByString = function (metricAbbreviation) {\n // eslint-disable-next-line no-unreachable\n return true;\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n if (ignore) return falseVar;\n // eslint-disable-next-line no-redeclare\n var regex =\n \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \")=\";\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n return q || undefinedVar;\n };\n\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData, keepalive) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n var imageUrl =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n\n image.src = imageUrl;\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n\n\n\n\n\n\n\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n // eslint-disable-next-line no-redeclare\n var bot = isBotAgent;\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = trueVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function (raw) {\n // Customers can overwrite their referrer, here we check for that\n var referrer =\n overwriteOptions.referrer ||\n attr(scriptElement, \"referrer\") ||\n doc.referrer ||\n \"\";\n\n return (\n referrer\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n\n\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch = \"\";\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n var pathKey = path + querySearch;\n if (!path || lastSendPath == pathKey) return;\n\n lastSendPath = pathKey;\n page.path = path;\n\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n sameSite = referrer\n ? referrer.split(slash)[0] == locationHostname\n : falseVar;\n\n\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n\n\n pageview();\n\n } catch (e) {\n warn(e);\n }\n})(\n window,\n {},\n \"simpleanalyticscdn.com\",\n \"queue.\",\n \"cdn_light_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","warn","undefinedVar","undefined","https","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","protocol","language","documentElement","uaData","userAgentData","platformText","platformVersionText","docsUrl","isBotAgent","test","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","isString","string","attr","attribute","getAttribute","assign","obj","prop","object","to","arg","index","length","nextSource","constructor","Object","nextKey","hasOwnProperty","settings","sa_settings","logSettings","keys","Date","now","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","replace","c","getRandomValues","Uint8Array","toString","error","r","Math","random","isFunction","func","namespaceText","namespace","strictUtm","loadedVariable","sa_event_loaded","timezone","sendData","data","callback","onlyThisData","keepalive","payload","page","brave","_duckduckgoloader_","duck","image","Image","imageUrl","filter","key","map","join","src","overwrittenHostname","hostname","definedHostname","basePayload","version","mode","Intl","DateTimeFormat","resolvedOptions","timeZone","bot","ua","page_id","session_id","sri","mobile","brands","hostname_original","indexOf","lastSendPath","referrer","sendOnLeave","id","push","append","type","original_id","sendBeacon","bind","e","sameSite","userNavigated","getPath","overwrite","path","pathname","sendPageView","isPushState","deleteSourceInfo","search","metadata","ignoreSource","currentPage","query","split","keyValue","RegExp","pages","pathOverwrite","callbackRaw","parts","querySearch","shift","pathKey","performaceEntryType","perf","performance","navigationText","getEntriesByType","triggerSendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","pageview"],"mappings":";;CAEA,SACEA,EACAC,EACAC,EAKAC,GAEA,IAQE,IAAIC,EAAeC,UAIfC,EAAQ,SAKRC,EAAMP,EAAOQ,QACbC,EAAa,aACbC,EAAMV,EAAOW,UACbC,EAAMZ,EAAOa,SACbC,EAAmBF,EAAIG,KACvBC,EAAMhB,EAAOiB,SACbC,EAAYR,EAAIQ,UAChBC,EAAa,uBAEbC,GAhBW,EAiBXC,EAAyBC,mBACzBC,EAAyBC,mBACzBC,EAAYC,KAAKD,UAEjBE,EAAuB3B,EAAO4B,iBAC9BC,EAAaC,iBAA0B5B,EAEvC6B,GADkBf,EAAIgB,gBACX,YAIXC,EAASvB,EAAIwB,cAMbC,EAAe,WACfC,EAAsB,kBACtBC,EAAU,mCAEVC,EACF,sBAAsBC,KAAKrB,KAAe,WAAWqB,KAAKrB,GAIxDsB,EACFxB,EAAIyB,eAAiBzB,EAAI0B,cAAc,gBAAkBxC,EAAU,MAOrEC,EAAO,WAEL,IAAIwC,EAAO,GAAGC,MAAMC,KAAKC,WAOzB,OAJAH,EAAKI,QAAQ,qBAINC,SAASC,UAAUC,MAAML,KAAKtC,EAAIJ,KAAMI,EAAKoC,IAGtD,IAQIQ,EAAW,SAAUC,GACvB,MAAwB,iBAAVA,GAOZC,EAAO,SAAUb,EAAec,GAClC,OAAOd,GAAiBA,EAAce,aAAa,QAAUD,IAe3DE,EAAS,WAGX,IAFA,IA7BsBC,EAAKC,EAwBJC,EAKnBC,EAAK,GACLC,EAAMf,UACDgB,EAAQ,EAAGA,EAAQD,EAAIE,OAAQD,IAAS,CAC/C,IAAIE,EAAaH,EAAIC,GACrB,IATqBH,EASRK,IAREL,EAAOM,cAAgBC,OASpC,IAAK,IAAIC,KAAWH,EAlCFP,EAmCJO,EAnCSN,EAmCGS,EAlCvBD,OAAOjB,UAAUmB,eAAevB,KAAKY,EAAKC,KAmCzCE,EAAGO,GAAWH,EAAWG,IAKjC,OAAOP,GAGLS,EAAWrE,EAAOsE,YAClBC,EAAcF,GAAYH,OAAOM,KAAKvE,GAAkB8D,OAG5D9D,EAAmBuD,EAAOvD,EAAkBoE,GAExCE,GAAapE,EAAK,WAAYF,GAQxBwE,KAAKC,IALf,IAOIC,EAAO,WACT,IAAIC,EAAe5E,EAAO6E,QAAU7E,EAAO8E,SACvCC,EAAY,CAAC,MAAQ,KAAO,KAAO,KAAO,KAC1CC,EAAY,SAEhB,IACE,OAAOD,EAAUE,QAAQD,EAAW,SAAUE,GAC5C,OACEA,EACCN,EAAaO,gBAAgB,IAAIC,WAAW,IAAI,GAC9C,IAAOF,EAAI,GACdG,SAAS,MAEb,MAAOC,GACP,OAAOP,EAAUE,QAAQD,EAAW,SAAUE,GAC5C,IAAIK,EAAqB,GAAhBC,KAAKC,SAAiB,EAE/B,OADMP,EAAI,EAAIK,EAAS,EAAJA,EAAW,GACrBF,SAAS,QAKpBK,EAAa,SAAUC,GACzB,MAAsB,mBAARA,GAIZC,EAAgB,YAChBC,EACF5F,EAAiB2F,IACjBvC,EAAKb,EAAeoD,IAqaxB,KA3ZME,EACF7F,EAAiB6F,WAvKJ,QAwKbzC,EAAKb,EAAe,cAoClBuD,EAAiBF,EAAY,UACjC,GA/Mc,GA+MV7F,EAAO+F,GAA4B,OAAO5F,EAAKgB,EAAa,SAChEnB,EAAOgG,iBAhNO,EAiNdhG,EAAO+F,IAjNO,EAwNd,IA8DIE,EA9DAC,EAAW,SAAUC,EAAMC,EAAUC,EAAcC,GACrDH,EAAOE,EAAeF,EAAO3C,EAAO+C,EAASC,EAAML,GAE/CzF,EAAI+F,QAAUJ,IAAcF,EAAKM,OA3NzB,GA4NR/F,EAAIgG,qBAAuBL,IAAcF,EAAKQ,MA5NtC,GA+NZ,IAAIC,EAAQ,IAAIC,MACZC,EACFjF,EACA,eACAqC,OAAOM,KAAK2B,GACTY,OAAO,SAAUC,GAChB,OAAOb,EAAKa,IAAQ5G,IAErB6G,IAAI,SAAUD,GACb,OACE3F,EAAuB2F,GACvB,IACA3F,EAAuB8E,EAAKa,MAG/BE,KAAK,KACR,SACAzC,KAAKC,MAEPkC,EAAMO,IAAML,GAIVM,EACFnH,EAAiBoH,UAAYhE,EAAKb,EAAe,YAC/C8E,EAAkBF,GAAuBtG,EAEzCyG,EAAc,CAChBC,QAuUJ,eAtUIH,SAAUC,GAeDrH,EAAiBwH,MAAQpE,EAAKb,EAAe,QAYxD,IAEEyD,EACIyB,KAAKC,iBAAiBC,kBAAkBC,SAE5C,MAAOvC,GACPnF,EAAKmF,GAQGhD,IAMDiF,EAAYO,KA3SP,GA6Sd,IAAIvB,EAAU/C,EAAO+D,EAAa,CAEhCQ,GAAkC7G,EAElCZ,MAAOM,EAAIkB,UAAYxB,EACvB2F,SAAUA,EACV+B,QAA8BrD,IAG9BsD,WAA0CtD,MAwB5C,GArBA4B,EAAQ2B,KAzTM,EA6TVjG,IACFsE,EAAQ4B,OAASlG,EAAOkG,OACxB5B,EAAQ6B,OAAS3G,EAAUQ,EAAOmG,SAWhCd,IAAoBxG,IACtByF,EAAQ8B,kBAAoBvH,GAG1BL,KAAcC,GAA0B,KAAnBA,EAAID,GAC3B,OAAON,EA/TYgB,4BAgUAV,EAAa,oBAAsB4B,EAAU,SAK7B,GAAlCvB,EAAiBwH,QAAQ,OACxB,aAAa/F,KAAKzB,IACnBsG,GAEDjH,EACE,mBACEW,EACA,SACAuB,EACA,0BAON,IACIkG,EADA/B,EAAO,GAoBPgC,GAdAvI,EAAiBuI,UACjBnF,EAAKb,EAAe,aACpBxB,EAAIwH,UACJ,IAIGvD,QAAQnE,EAAkBwG,GAC1BrC,QAAQ,sDAAuD,MAC/DA,QAAQ,YAAa,OAAS7E,EAcjCqI,EAAc,SAAUC,EAAIC,GAG9B,IAAIC,EAASpF,EAAO+D,EAAa,CAC/BsB,KAAM,SACNC,YAAaH,EAAOD,EAAKnC,EAAQyB,UAKnC,GAAIW,IAASjI,EAAIqI,WAEf7C,EAAS0C,EAAQxI,GA9YP,QAgZV,IACEM,EAAIqI,WAAWC,KAAKtI,EAApBA,CAAyBmB,EAAa,UAAWJ,EAAUmH,IAC3D,MAAOK,GAEP/C,EAAS0C,EAAQxI,GApZT,KA0ZduB,EAxXe,WAwXgB8G,GAzZhB,GAgaf,IAmDIS,EAAUC,EAnDVC,EAAU,SAAUC,GACtB,IAAIC,EAAO,GAIX,IACEA,EAAOD,GAAa9H,EAAuBX,EAAI2I,UAC/C,MAAOjE,GACPnF,EAAKmF,GAMP,OAAOgE,GAMLE,EAAe,SACjBC,EACAC,EACAR,EACAS,EACAC,EACAxD,GAEIqD,GAAahB,EAAY,GAAKlC,EAAQyB,SA7b9B,GA8bYzB,EAAQyB,QAAUrD,IAE1C,IAnR6BkF,EAmRzBC,EAAcxC,EAAkB8B,IAChCW,GApRyBF,EAoRFH,GAAkBC,GAnRjB/I,EAAI+I,QAC7B/G,MAAM,GACNoH,MAAM,KACNjD,OAAO,SAAUkD,GAIhB,OAFaJ,GAaN,IAAIK,OART,YACCpE,EAAY,GAAK,KAClB,yCACCA,EAAY,GAAK,QAClB,KAIuB,KAAKvD,KAAK0H,KAEpC/C,KAAK,MAEI9G,GA+PZ8F,EACE,CACEwC,GAAInC,EAAQyB,QACZa,KAlca,WAmcbL,UAAWkB,GAAoBR,EAAWV,EAAW,KACrDuB,MAAOA,IAOXvB,EAAWsB,EAEXK,IAKa,SACbV,EACAW,EACAR,EACAS,IAEKA,GAAe3E,EAAWkE,KAAWS,EAAcT,GACzClE,EAAW2E,GAA1B,IAIMC,EAHFC,EAAc,GACdpH,EAASiH,KAAgD,EAA9BA,EAAc9B,QAAQ,OAGnD8B,GADIE,EAAQF,EAAcJ,MAAM,MACVQ,QACtBD,EAAc,IAAMD,EAAMpD,KAAK,MAGjC,IAAIoC,EAAOF,EAAQgB,GAGfK,EAAUnB,EAAOiB,EACrB,GAAKjB,GAAQf,GAAgBkC,EAA7B,CAEAlC,EAAekC,EACfjE,EAAK8C,KAAOA,EAKN5I,EAAIqB,KAAWyE,EAAKzE,GAAYrB,EAAIqB,IAK1C,IAII2I,EAJAC,EAAO3K,EAAO4K,YACdC,EAAiB,aAIrB,IACEH,EAAsBC,EAAKG,iBAAiBD,GAAgB,GAAGhC,KAC/D,MAAOvD,GACPnF,EAAKmF,GAGP6D,EAAgBuB,GAC+C,EAA3D,CAAC,SAAU,gBAAgBpC,QAAQoC,GAGnCC,GACAA,EAAKE,KACwC,EAA7C,CAAC,EAAG,GAAGvC,QAAQqC,EAAKE,GAAgBhC,MAGxCK,IAAWV,GACPA,EAASwB,MAtgBH,KAsgBgB,IAAMlJ,EAKhC,IAAIiK,EAAsB,WACxB3J,GAlhBU,EAqhBVoI,EACEC,EAFAA,GAAeN,IAAiB,EAIhCD,EACAqB,IAMJ,GAAKnJ,EAmBH2J,SAjBA,IACM9I,GAAUyD,EAAWzD,EAAO+I,sBAC9B/I,EACG+I,qBAAqB,CAAC7I,EAAcC,IACpC6I,KAAK,SAAUC,GACd3E,EAAQ4E,QAAUD,EAAkB/I,GACpCoE,EAAQ6E,WAAaF,EAAkB9I,GACvC2I,MAEDM,SAAMN,GAETA,IAEF,MAAO9B,GACP8B,MASNO,GAEA,MAAOrC,GACP9I,EAAK8I,IA9kBT,CAilBEjJ,OACA,uBACA"} \ No newline at end of file diff --git a/src/default.js b/src/default.js index cfd5b0be..28a938ff 100644 --- a/src/default.js +++ b/src/default.js @@ -628,13 +628,19 @@ var page = {}; var lastSendPath; - var getReferrer = function () { + var getReferrer = function (raw) { // Customers can overwrite their referrer, here we check for that - var overwrittenReferrer = - overwriteOptions.referrer || attr(scriptElement, "referrer"); + var referrer = + overwriteOptions.referrer || + attr(scriptElement, "referrer") || + doc.referrer || + ""; + /** if uniques **/ + if (raw) return referrer; + /** endif **/ return ( - (overwrittenReferrer || doc.referrer || "") + referrer .replace(locationHostname, definedHostname) .replace(/^https?:\/\/((m|l|w{2,3}([0-9]+)?)\.)?([^?#]+)(.*)$/, "$4") .replace(/^([^/]+)$/, "$1") || undefinedVar @@ -914,11 +920,11 @@ /** endif **/ /** if uniques **/ - // We set unique variable based on pushstate or back navigation, if no match we check the referrer + // Only the first pageview can use a Cloudflare referrer as a unique arrival. page.unique = - /__cf_/.test(getReferrer()) || isPushState || userNavigated + isPushState || userNavigated ? falseVar - : !sameSite; + : !sameSite || (!pages && /[?&]__cf_/.test(getReferrer(trueVar))); /** endif **/ /** if metadata **/ diff --git a/test/unit/pageview.test.js b/test/unit/pageview.test.js index fc692a5c..19efe50e 100644 --- a/test/unit/pageview.test.js +++ b/test/unit/pageview.test.js @@ -4,6 +4,70 @@ const { runInContext } = require("vm"); const { createDOM, SCRIPT_PATH } = require("./helpers/dom"); describe("pageview", function () { + for (const [referrer, unique] of [ + ["https://external.example/?__cf_chl_tk=challenge", true], + ["https://external.example/?source=mail&__cf_chl_rt_tk=challenge", true], + ["https://example.com/?__cf_chl_tk=challenge", true], + ["https://example.com/?source=mail&__cf_chl_rt_tk=challenge", true], + ["https://example.com/previous", false], + ["https://example.com/docs/__cf_workers", false], + ["https://example.com/?next=?__cf_chl_tk=challenge", true], + ["https://example.com/#?__cf_chl_tk=challenge", true], + ]) { + it(`uses the simple Cloudflare marker for ${referrer}`, function () { + const dom = createDOM({ + beforeRun(context) { + Object.defineProperty(context.document, "referrer", { + value: referrer, + }); + }, + }); + const url = new URL(dom.sent[0].url); + expect(url.searchParams.get("unique")).to.equal(String(unique)); + expect(url.searchParams.get("referrer")).not.to.include("challenge"); + dom.window.close(); + }); + } + + it("recognizes challenge arrivals in an overwritten referrer without sending its query", function () { + const dom = createDOM({ + settings: { referrer: "https://example.com/?__cf_chl_tk=challenge" }, + }); + const url = new URL(dom.sent[0].url); + expect(url.searchParams.get("unique")).to.equal("true"); + expect(url.searchParams.get("referrer")).to.equal("example.com/"); + dom.window.close(); + }); + + for (const navigationType of ["reload", "back_forward"]) { + it(`keeps ${navigationType} non-unique with a challenge referrer`, function () { + const dom = createDOM({ + navigationType, + settings: { referrer: "https://example.com/?__cf_chl_tk=challenge" }, + }); + const url = new URL(dom.sent[0].url); + expect(url.searchParams.get("unique")).to.equal("false"); + dom.window.close(); + }); + } + + it("counts only the first pageview as unique after a challenge", function () { + const dom = createDOM({ + settings: { referrer: "https://example.com/?__cf_chl_tk=challenge" }, + }); + dom.window.sa_pageview("/manual"); + dom.window.history.pushState({}, "", "/spa"); + const pageviews = dom.sent.filter( + (request) => new URL(request.url).searchParams.get("type") === "pageview" + ); + expect( + pageviews.map((request) => + new URL(request.url).searchParams.get("unique") + ) + ).to.deep.equal(["true", "false", "false"]); + dom.window.close(); + }); + it("exposes the pageview function under its configured namespace", function () { const dom = createDOM({ settings: { namespace: "ba", autoCollect: false }, From a3f1a4a17e0142d41c1e9253f21db691adccee9c Mon Sep 17 00:00:00 2001 From: "simple-analytics-ai[bot]" <313929673+simple-analytics-ai[bot]@users.noreply.github.com> Date: Fri, 16 Oct 2026 00:02:42 +0200 Subject: [PATCH 59/62] Accept current and legacy script deployment headers (#117) * Accept current and legacy script deployment headers Requested: make issue #107 ready to merge. Fix the proven mismatch between compile.js output and deployment header validation while retaining older pinned header support. Add tests against the real deployment manifest, legacy and malformed headers, and run the lightweight deployment suite in CI. All 15 deployment tests, type checking, and diff checks pass. Visitor-facing scripts are unchanged. Refs #107 * Check headers for the current SRI version in deployment tests Requested: make issue #107 mergeable and address review on #117. Reuse latestVersionFromNames with the dist directory so the manifest regression follows the current SRI version rather than only v12. All 15 deployment tests and type checking pass. Refs #107 --------- Co-authored-by: Simple Analytics Codex --- .github/workflows/browserstack.yml | 2 +- deploy.mts | 4 +-- test/deploy.test.mts | 41 ++++++++++++++++++++++++++++++ 3 files changed, 44 insertions(+), 3 deletions(-) diff --git a/.github/workflows/browserstack.yml b/.github/workflows/browserstack.yml index 5b0047cb..91651ce5 100644 --- a/.github/workflows/browserstack.yml +++ b/.github/workflows/browserstack.yml @@ -55,7 +55,7 @@ jobs: run: pnpm run test:matrix - name: Run unit tests - run: pnpm run build && pnpm run test:unit + run: pnpm run build && pnpm run test:unit && pnpm run test:deploy - name: Prettier check (report only, no writes or commits) if: always() diff --git a/deploy.mts b/deploy.mts index b5953272..956fb906 100644 --- a/deploy.mts +++ b/deploy.mts @@ -71,8 +71,8 @@ const CDN_PUBLIC_ROOT = "https://scripts.simpleanalyticscdn.com"; const CDN_STORAGE_ROOT = "https://storage.bunnycdn.com/sa-cdn"; const CDN_PURGE_URL = "https://api.bunny.net/purge?url=https://simpleanalyticscdn.b-cdn.net/*"; -const HEADER_PATTERN = - /^\/\* Simple Analytics - Privacy friendly analytics \(docs\.simpleanalytics\.com\/[^;]+; \d{4}-\d{2}-\d{2}; [0-9a-f]{4}(?:; SRI-version)?(?:; v\d+)?\) \*\/$/; +export const HEADER_PATTERN = + /^\/\* Simple Analytics - Privacy(?: friendly|-first) analytics \(docs\.simpleanalytics\.com\/[^;]+; \d{4}-\d{2}-\d{2}; [0-9a-f]{4}(?:; SRI-version)?(?:; v\d+)?\) \*\/$/; const ansi = { bold: (value: string) => color("1", value), diff --git a/test/deploy.test.mts b/test/deploy.test.mts index 3ae74086..5bf7727f 100644 --- a/test/deploy.test.mts +++ b/test/deploy.test.mts @@ -1,10 +1,12 @@ import assert from "node:assert/strict"; +import { readFile, readdir } from "node:fs/promises"; import { describe, it } from "node:test"; import { classifyContent, createManifest, firstLine, + HEADER_PATTERN, latestVersionFromNames, repositoryPolicy, summarize, @@ -13,6 +15,45 @@ import { type PreviewFile, } from "../deploy.mts"; +describe("deployment headers", () => { + it("accepts every generated JavaScript header in the current manifest", async () => { + const version = latestVersionFromNames( + await readdir(new URL("../dist", import.meta.url)) + ); + assert.ok(version !== undefined, "dist has no versioned SRI directory"); + const files = createManifest( + { + destinations: ["cdn", "custom"], + scripts: ["default", "auto-events"], + variants: ["latest", "sri", "light", "proxy"], + }, + version + ); + for (const file of files.filter((file) => file.kind === "javascript")) { + const content = await readFile( + new URL("../" + file.localPath, import.meta.url) + ); + assert.match(firstLine(content), HEADER_PATTERN, file.localPath); + } + }); + + it("keeps accepting legacy headers", () => { + assert.match( + "/* Simple Analytics - Privacy friendly analytics (docs.simpleanalytics.com/script; 2024-01-01; abcd; SRI-version; v11) */", + HEADER_PATTERN + ); + }); + + it("rejects malformed or unrelated headers", () => { + for (const header of [ + "/* unrelated script */", + "/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-15; not-a-hash; v12) */", + ]) { + assert.doesNotMatch(header, HEADER_PATTERN); + } + }); +}); + describe("deployment manifest", () => { it("maps latest and its legacy companions to both destinations", () => { const files = createManifest({ From 6b84d4251ea29a2d0744c615223fa3108649e081 Mon Sep 17 00:00:00 2001 From: "simple-analytics-ai[bot]" <313929673+simple-analytics-ai[bot]@users.noreply.github.com> Date: Fri, 16 Oct 2026 00:29:36 +0200 Subject: [PATCH 60/62] Remove retired Cloudflare app build from v12 (#121) Requested: open a PR into v12 removing Cloudflare app options while keeping GTM settings and a working client-side guard. Preserve sa_settings and data-attribute behavior, guard browser access, and rebuild current tracker artifacts. Co-authored-by: Simple Analytics Codex --- README.md | 2 +- compile.js | 52 +- dist/latest/cloudflare.js | 1087 ------------------------------ dist/latest/custom/app.js | 4 +- dist/latest/custom/app.js.map | 2 +- dist/latest/custom/e.js | 4 +- dist/latest/custom/e.js.map | 2 +- dist/latest/custom/latest.dev.js | 53 +- dist/latest/custom/latest.js | 4 +- dist/latest/custom/latest.js.map | 2 +- dist/latest/custom/light.js | 4 +- dist/latest/custom/light.js.map | 2 +- dist/latest/custom/proxy.js | 4 +- dist/latest/custom/proxy.js.map | 2 +- dist/latest/hello.js | 4 +- dist/latest/hello.js.map | 2 +- dist/latest/latest.dev.js | 53 +- dist/latest/latest.js | 4 +- dist/latest/latest.js.map | 2 +- dist/latest/light.js | 4 +- dist/latest/light.js.map | 2 +- dist/v12/app.js | 4 +- dist/v12/app.js.map | 2 +- dist/v12/custom/app.js | 4 +- dist/v12/custom/app.js.map | 2 +- dist/v12/custom/light.js | 4 +- dist/v12/custom/light.js.map | 2 +- dist/v12/custom/proxy.js | 4 +- dist/v12/custom/proxy.js.map | 2 +- dist/v12/light.js | 4 +- dist/v12/light.js.map | 2 +- src/default.js | 55 +- 32 files changed, 115 insertions(+), 1265 deletions(-) delete mode 100644 dist/latest/cloudflare.js diff --git a/README.md b/README.md index 1ca708c7..4151c02d 100644 --- a/README.md +++ b/README.md @@ -16,7 +16,7 @@ As our public scripts are very important in our mission to privacy we decided to ## Contribute -If you want to contribute, you probabaly want to contribute to our [`/src/default.js`](src/default.js) or [`/src/auto-events.js`](src/auto-events.js) files. These files compile into a few versions of our script by [`compile.js`](compile.js). They end up on [our CDN](https://scripts.simpleanalyticscdn.com/latest.js), custom domains, and [the Cloudflare app](https://www.cloudflare.com/apps/simpleanalytics). +If you want to contribute, you probabaly want to contribute to our [`/src/default.js`](src/default.js) or [`/src/auto-events.js`](src/auto-events.js) files. These files compile into a few versions of our script by [`compile.js`](compile.js). They end up on [our CDN](https://scripts.simpleanalyticscdn.com/latest.js) and custom domains. In `default.js` you see some weird syntax in the comments. For example, `/** if ignorepages **/` _\[some code\]_ `/** endif **/`. These comments are converted to handlebars like this: `{{#if ignorepages }}` _\[some code\]_ `{{/if}}`. In this case, [`ignorepages` is a variable](https://github.com/simpleanalytics/scripts/blob/3874b44ce5f1b0b8a7d50fb512fdcf5285a0138f/minify.js#L66) used in `minify.js` that takes care of what functionality to show in what script. Our main script is the `latest.js` script which includes all features. We also have a `light.js` script that obviously doesn't. diff --git a/compile.js b/compile.js index 1a8f2caf..27746278 100644 --- a/compile.js +++ b/compile.js @@ -25,7 +25,7 @@ const MINIFY_OPTIONS = { nameCache: null, }; -const fillTemplate = (template, { overwriteOptions = null } = {}) => { +const fillTemplate = (template) => { if (!template) throw new Error("Parsing of the JavaScript failed, please use ES5 only."); return template @@ -36,16 +36,6 @@ const fillTemplate = (template, { overwriteOptions = null } = {}) => { .replace( /\{\{\s?nginxProxyHost\s?\}\}/gi, '' - ) - .replace( - /\\?"\{\{\s?overwriteOptions\s?\}\}\\?"/gi, - overwriteOptions - ? JSON.stringify(overwriteOptions).replace(/:"([^"]+)"/gi, ":$1") - : "{}" - ) - .replace( - /"\{\{\s?cloudFlareCustomDomain\s?\}\}"/gi, - 'INSTALL_OPTIONS.custom_domain || "queue.simpleanalyticscdn.com"' ); }; @@ -78,7 +68,6 @@ const DEFAULTS = { nonuniquehostnames: true, ignoremetrics: true, dev: false, - skipnonwindow: false, }; const LIGHT = { @@ -157,36 +146,6 @@ const templates = [ apiUrlPrefix: "queue.", }, }, - { - type: "js", - input: `${__dirname}/src/default.js`, - output: `cloudflare.js`, - variables: { - ...DEFAULTS, - skipnonwindow: true, - minify: false, - version: VERSION, - scriptName: `cloudflare_${VERSION}`, - sri: false, - baseUrl: "{{cloudFlareCustomDomain}}", - overwriteOptions: { - hostname: "INSTALL_OPTIONS.hostname", - collectDnt: - "typeof INSTALL_OPTIONS.collect_dnt === 'boolean' ? INSTALL_OPTIONS.collect_dnt : null", - mode: "INSTALL_OPTIONS.hash_mode ? 'hash' : 'normal'", - strictUtm: - "INSTALL_OPTIONS.advanced_settings_toggle && INSTALL_OPTIONS.strict_utm", - allowParams: - "INSTALL_OPTIONS.advanced_settings_toggle && INSTALL_OPTIONS.allow_url_parameters", - nonUniqueHostnames: - "INSTALL_OPTIONS.advanced_settings_toggle && INSTALL_OPTIONS.non_unique_hostnames", - ignorePages: - "INSTALL_OPTIONS.advanced_settings_toggle && INSTALL_OPTIONS.ignore_pages", - namespace: - "INSTALL_OPTIONS.overwrite_namespace && INSTALL_OPTIONS.namespace", - }, - }, - }, { type: "js", input: `${__dirname}/src/default.js`, @@ -309,10 +268,7 @@ for (const file of files) { const finalFileName = output.split("/").pop(); const template = Handlebars.compile(contents); - const rawCode = template({ - ...variables, - overwriteOptions: "{{overwriteOptions}}", - }); + const rawCode = template(variables); const date = new Date().toISOString().slice(0, 10); const hash = require("crypto") @@ -384,7 +340,7 @@ for (const file of files) { `${error.message} at line ${sentence} position ${column}: ${codeSnippet}` ); } - const code = fillTemplate(codeTemplate, variables); + const code = fillTemplate(codeTemplate); const validate = template({ ...variables, @@ -411,7 +367,7 @@ for (const file of files) { fs.mkdirSync(path.dirname(latestFile), { recursive: true }); } - const compiledMap = map ? fillTemplate(map, variables) : null; + const compiledMap = map ? fillTemplate(map) : null; const isCustom = /^custom\//.test(output); if (variables.version && variables.sri) { diff --git a/dist/latest/cloudflare.js b/dist/latest/cloudflare.js deleted file mode 100644 index 6576d28e..00000000 --- a/dist/latest/cloudflare.js +++ /dev/null @@ -1,1087 +0,0 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-15; 5f31; v12) */ -/* eslint-env browser */ - -(function ( - window, - overwriteOptions, - baseUrl, - apiUrlPrefix, - version, - defaultNamespace, - sendError, - warn -) { - try { - ///////////////////// - // PREDEFINED VARIABLES FOR BETTER MINIFICATION - // - - // This seems like a lot of repetition, but it makes our script available for - // multple destination which prevents us to need multiple scripts. The minified - // version stays small. - var undefinedVar = undefined; - var trueVar = true; - var falseVar = false; - var trueText = "true"; - var https = "https:"; - var pageviewText = "pageview"; - var eventText = "event"; - var errorText = "error"; - var slash = "/"; - var protocol = https + "//"; - var con = window.console; - var doNotTrack = "doNotTrack"; - var nav = window.navigator; - var loc = window.location; - var locationHostname = loc.host; - var doc = window.document; - var userAgent = nav.userAgent; - var notSending = "Not sending request "; - var notSendingWhen = notSending + "when "; - var fetchedHighEntropyValues = falseVar; - var encodeURIComponentFunc = encodeURIComponent; - var decodeURIComponentFunc = decodeURIComponent; - var stringify = JSON.stringify; - var thousand = 1000; - var addEventListenerFunc = window.addEventListener; - var fullApiUrl = protocol + apiUrlPrefix + baseUrl; - var documentElement = doc.documentElement || {}; - var language = "language"; - var Height = "Height"; - var Width = "Width"; - var scroll = "scroll"; - var uaData = nav.userAgentData; - var scrollHeight = scroll + Height; - var offsetHeight = "offset" + Height; - var clientHeight = "client" + Height; - var clientWidth = "client" + Width; - var pagehide = "pagehide"; - var platformText = "platform"; - var platformVersionText = "platformVersion"; - var docsUrl = "https://docs.simpleanalytics.com"; - var pages = 0; - var isBotAgent = - /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent); - var screen = window.screen; - - // Skip server side rendered pages on Cloudflare - if (typeof window == "" + undefinedVar) return; - - // Find the script element where options can be set on - var scriptElement = - doc.currentScript || doc.querySelector('script[src*="' + baseUrl + '"]'); - - ///////////////////// - // HELPER FUNCTIONS - // - - // A simple log function so the user knows why a request is not being send - warn = function () { - // 1. Convert args to a normal array - var args = [].slice.call(arguments); - - // 2. Prepend log prefix - args.unshift("Simple Analytics:"); - - // 3. Pass along arguments to console.warn - // Function.prototype.apply.call is needed for Internet Explorer - return Function.prototype.apply.call(con.warn, con, args); - }; - - var warnInFunction = function (name, error) { - warn("Error in your " + name + " function:", error); - }; - - var hasProp = function (obj, prop) { - return Object.prototype.hasOwnProperty.call(obj, prop); - }; - - var isString = function (string) { - return typeof string == "string"; - }; - - var filterRegex = function (item) { - return item.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); - }; - - var attr = function (scriptElement, attribute) { - return scriptElement && scriptElement.getAttribute("data-" + attribute); - }; - - var convertCommaSeparatedToArray = function (csv) { - return Array.isArray(csv) - ? csv - : isString(csv) && csv.length - ? csv.split(/, ?/) - : []; - }; - - var isObject = function (object) { - return object && object.constructor === Object; - }; - - var assign = function () { - var to = {}; - var arg = arguments; - for (var index = 0; index < arg.length; index++) { - var nextSource = arg[index]; - if (isObject(nextSource)) { - for (var nextKey in nextSource) { - if (hasProp(nextSource, nextKey)) { - to[nextKey] = nextSource[nextKey]; - } - } - } - } - return to; - }; - - var settings = window.sa_settings; - var logSettings = settings || Object.keys(overwriteOptions).length; - - // Merge overwriteOptions with sa_settings - overwriteOptions = assign(overwriteOptions, settings); - - if (logSettings) warn("Settings", overwriteOptions); - - // Customers can skip data points - var ignoreMetrics = convertCommaSeparatedToArray( - overwriteOptions.ignoreMetrics || attr(scriptElement, "ignore-metrics") - ); - - var collectMetricByString = function (metricAbbreviation) { - // Can't use Array.find() here because we need to support IE9 - return ( - ignoreMetrics.filter(function (item) { - return new RegExp("^" + metricAbbreviation).test(item); - }).length === 0 - ); - }; - - var now = Date.now; - - var uuid = function () { - var cryptoObject = window.crypto || window.msCrypto; - var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11; - var uuidRegex = /[018]/g; - - try { - return emptyUUID.replace(uuidRegex, function (c) { - return ( - c ^ - (cryptoObject.getRandomValues(new Uint8Array(1))[0] & - (15 >> (c / 4))) - ).toString(16); - }); - } catch (error) { - return emptyUUID.replace(uuidRegex, function (c) { - var r = (Math.random() * 16) | 0, - v = c < 2 ? r : (r & 0x3) | 0x8; - return v.toString(16); - }); - } - }; - - var isFunction = function (func) { - return typeof func == "function"; - }; - - // Define namespace for the library - var namespaceText = "namespace"; - var namespace = - overwriteOptions[namespaceText] || - attr(scriptElement, namespaceText) || - defaultNamespace; - - var appendMetadata = function (metadata, data) { - var metadataObject = window[namespace + "_metadata"]; - if (isObject(metadataObject)) metadata = assign(metadata, metadataObject); - var metadataCollectorFunction = window[metadataCollector]; - if (!isFunction(metadataCollectorFunction)) { - if (metadataCollector) - warn( - metadataCollector + " not found, set window." + metadataCollector - ); - return metadata; - } - try { - return assign( - metadata, - metadataCollectorFunction.call(window, assign(metadata, data)) - ); - } catch (error) { - warnInFunction("metadata", error); - } - }; - - var isBoolean = function (value) { - return !!value === value; - }; - - // By default we allow source, medium in the URLs. With strictUtm enabled - // we only allow it with the utm_ prefix: utm_source, utm_medium, ... - var strictUtm = - overwriteOptions.strictUtm || - attr(scriptElement, "strict-utm") == trueText; - - var k; - - var getQueryParams = function (ignoreSource, overwriteSearch) { - k = !ignoreSource && collectMetricByString("q") ? "" : falseVar; - var q = (overwriteSearch || loc.search) - .slice(1) - .split("&") - .filter(function (keyValue) { - var i = keyValue.indexOf("="); - if (k !== falseVar && i > 0 && keyValue.slice(i + 1)) - k += (k ? "," : "") + keyValue.slice(0, i); - - var ignore = ignoreSource || !collectMetricByString("ut"); - - var paramsRegexList = allowParams.map(filterRegex).join("|"); - var regex = ignore - ? "^(" + paramsRegexList + ")=" - : "^((utm_)" + - (strictUtm ? "" : "?") + - "(source|medium|content|term|campaign)" + - (strictUtm ? "" : "|ref") + - "|" + - paramsRegexList + - ")="; - if (ignore && !allowParams.length) return falseVar; - - // The prefix "utm_" is optional with "strictUtm" disabled - // "ref" is only collected when "strictUtm" is disabled - return new RegExp(regex, "i").test(keyValue); - }) - .join("&"); - - k = k || undefinedVar; - return q || undefinedVar; - }; - - // Ignore pages specified in data-ignore-pages - var shouldIgnore = function (path) { - for (var i in ignorePages) { - var ignorePageRaw = ignorePages[i]; - if (!ignorePageRaw) continue; - - // Prepend a slash when it's missing - var ignorePage = - ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw; - - if ( - ignorePage === path || - new RegExp( - "^" + filterRegex(ignorePage).replace(/\\\*/gi, "(.*)") + "$", - "i" - ).test(path) - ) - return trueVar; - } - return falseVar; - }; - - ///////////////////// - // Warn when using script twice - // - - // Only load our script once, customers can still send multiple page views - // with the sa_pageview function if they turn off auto collect. - var loadedVariable = namespace + "_loaded"; - if (window[loadedVariable] == trueVar) return warn(notSending + "twice"); - window.sa_event_loaded = trueVar; - window[loadedVariable] = trueVar; - - ///////////////////// - // SEND DATA VIA OUR PIXEL - // - - // Send data via image - var sendData = function (data, callback, onlyThisData, keepalive) { - data = onlyThisData ? data : assign(payload, page, data); - - if (nav.brave && !onlyThisData) data.brave = trueVar; - if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar; - - - var image = new Image(); - if (callback) { - image.onerror = callback; - image.onload = callback; - } - var imageUrl = - fullApiUrl + - "/simple.gif?" + - Object.keys(data) - .filter(function (key) { - return data[key] != undefinedVar; - }) - .map(function (key) { - return ( - encodeURIComponentFunc(key) + - "=" + - encodeURIComponentFunc(data[key]) - ); - }) - .join("&") + - "&time=" + - Date.now(); - - // Events must survive navigation without taking over links or forms. - if (keepalive && window.fetch) { - try { - window - .fetch(imageUrl, { - keepalive: trueVar, - mode: "no-cors", - credentials: "omit", - }) - .catch(function () { - image.src = imageUrl; - }); - return; - } catch (error) {} - } - image.src = imageUrl; - }; - - // Customers can overwrite their hostname, here we check for that - var overwrittenHostname = - overwriteOptions.hostname || attr(scriptElement, "hostname"); - var definedHostname = overwrittenHostname || locationHostname; - - var basePayload = { - version: version, - hostname: definedHostname, - }; - - ///////////////////// - // ERROR FUNCTIONS - // - - // Send errors - // no var because it's scoped outside of the try/catch - sendError = function (errorOrMessage) { - errorOrMessage = errorOrMessage.stack - ? errorOrMessage + " " + errorOrMessage.stack - : errorOrMessage; - warn(errorOrMessage); - sendData( - assign(basePayload, { - type: errorText, - error: errorOrMessage, - path: loc.pathname, - }), - undefinedVar, - trueVar - ); - }; - - // We listen for the error events and only send errors that are - // from our script (checked by filename) to our server. - addEventListenerFunc( - errorText, - function (event) { - if (event.filename && event.filename.indexOf(baseUrl) > -1) { - sendError(event.message); - } - }, - falseVar - ); - - ///////////////////// - // INITIALIZE VALUES - // - - var start = now(); - - var scrolled = 0; - - ///////////////////// - // GET SETTINGS - // - - // Script mode, this can be hash mode for example - var mode = overwriteOptions.mode || attr(scriptElement, "mode"); - - // Should we record Do Not Track visits? - var collectDnt = isBoolean(overwriteOptions.collectDnt) - ? overwriteOptions.collectDnt - : attr(scriptElement, "ignore-dnt") == trueText || - attr(scriptElement, "skip-dnt") == trueText || - attr(scriptElement, "collect-dnt") == trueText; - - // Some customers want to collect page views manually - var autoCollect = !( - attr(scriptElement, "auto-collect") == "false" || - overwriteOptions.autoCollect === falseVar - ); - - // Event function name - var eventFunctionName = - overwriteOptions.saGlobal || - attr(scriptElement, "sa-global") || - namespace + "_" + eventText; - - // Customers can ignore certain pages - var ignorePages = convertCommaSeparatedToArray( - overwriteOptions.ignorePages || attr(scriptElement, "ignore-pages") - ); - - // Customers can allow params - var allowParams = convertCommaSeparatedToArray( - overwriteOptions.allowParams || attr(scriptElement, "allow-params") - ); - - // Customers can allow params - var nonUniqueHostnames = convertCommaSeparatedToArray( - overwriteOptions.nonUniqueHostnames || - attr(scriptElement, "non-unique-hostnames") - ); - - // Customers can overwrite certain values - var pathOverwriter = - overwriteOptions.pathOverwriter || attr(scriptElement, "path-overwriter"); - - // Customers can add metadata to events and pageviews via a function - var metadataCollector = - overwriteOptions.metadataCollector || - attr(scriptElement, "metadata-collector"); - - // This code could error on (incomplete) implementations, that's why we use try...catch - var timezone; - try { - // c = countries - timezone = collectMetricByString("c") - ? Intl.DateTimeFormat().resolvedOptions().timeZone - : undefinedVar; - } catch (error) { - warn(error); - } - - ///////////////////// - // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS - // - - var phantom = window.phantom; - var bot = - nav.webdriver || - window.__nightmare || - window.callPhantom || - window._phantom || - (phantom && !phantom.solana) || - window.__polypane || - window._bot || - isBotAgent || - Math.random() == Math.random(); - - // t = timeonpage, scro = scrolled - var collectDataOnLeave = - collectMetricByString("t") || collectMetricByString("scro"); - - if (bot) basePayload.bot = trueVar; - - var payload = assign(basePayload, { - // us = useragent - ua: collectMetricByString("us") ? userAgent : undefinedVar, - - https: loc.protocol == https, - timezone: timezone, - page_id: collectDataOnLeave ? uuid() : undefinedVar, - - // se = sessions - session_id: collectMetricByString("se") ? uuid() : undefinedVar, - }); - - payload.sri = falseVar; - - // Use User-Agent Client Hints for better privacy - // https://web.dev/user-agent-client-hints/ - if (uaData) { - payload.mobile = uaData.mobile; - payload.brands = stringify(uaData.brands); - } - - ///////////////////// - // ADD WARNINGS - // - - - // Warn when no document.doctype is defined (this breaks some documentElement dimensions) - if (!doc.doctype) warn("Add DOCTYPE html for accurate dimensions"); - - // When a customer overwrites the hostname, we need to know what the original - // hostname was to hide that domain from referrer traffic - if (definedHostname !== locationHostname) - payload.hostname_original = locationHostname; - - // Don't track when Do Not Track is set to true - if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == "1") - return warn( - notSendingWhen + doNotTrack + " is enabled. See " + docsUrl + "/dnt" - ); - - // Warn when sending from localhost and not having a hostname set - if ( - (locationHostname.indexOf(".") == -1 || - /^[0-9.:]+$/.test(locationHostname)) && - !overwrittenHostname - ) - warn( - "Set hostname on " + - locationHostname + - ". See " + - docsUrl + - "/overwrite-domain-name" - ); - - ///////////////////// - // SETUP INITIAL VARIABLES - // - - var page = {}; - var lastSendPath; - - var getReferrer = function (raw) { - // Customers can overwrite their referrer, here we check for that - var referrer = - overwriteOptions.referrer || - attr(scriptElement, "referrer") || - doc.referrer || - ""; - - if (raw) return referrer; - return ( - referrer - .replace(locationHostname, definedHostname) - .replace(/^https?:\/\/((m|l|w{2,3}([0-9]+)?)\.)?([^?#]+)(.*)$/, "$4") - .replace(/^([^/]+)$/, "$1") || undefinedVar - ); - }; - - // We don't want to end up with sensitive data so we clean the referrer URL - var referrer = getReferrer(); - - ///////////////////// - // TIME ON PAGE AND SCROLLED LOGIC - // - - // We don't put msHidden in if duration block, because it's used outside of that functionality - var msHidden = 0; - - var sendOnLeave = function (id, push) { - if (!collectDataOnLeave) return; - - var append = assign(basePayload, { - type: "append", - original_id: push ? id : payload.page_id, - }); - - // t = timeonpage - if (collectMetricByString("t")) { - append.duration = Math.round((now() - start - msHidden) / thousand); - } - msHidden = 0; - start = now(); - - // scro = scrolled - if (collectMetricByString("scro")) { - append.scrolled = Math.max(0, scrolled, position()); - } - - if (push || !nav.sendBeacon) { - // sendData will assign payload to request - sendData(append, undefinedVar, trueVar); - } else { - try { - nav.sendBeacon.bind(nav)(fullApiUrl + "/append", stringify(append)); - } catch (e) { - // Fallback for browsers throwing "Illegal invocation" when the URL is invalid - sendData(append, undefinedVar, trueVar); - } - } - }; - - var hiddenStart; - addEventListenerFunc( - "visibilitychange", - function () { - if (doc.hidden) { - if (!("on" + pagehide in window)) sendOnLeave(); - hiddenStart = now(); - } else msHidden += now() - hiddenStart; - }, - falseVar - ); - - addEventListenerFunc(pagehide, sendOnLeave, falseVar); - - var body = doc.body || {}; - var position = function () { - try { - var documentClientHeight = documentElement[clientHeight] || 0; - var height = Math.max( - body[scrollHeight] || 0, - body[offsetHeight] || 0, - documentElement[clientHeight] || 0, - documentElement[scrollHeight] || 0, - documentElement[offsetHeight] || 0 - ); - return Math.min( - 100, - Math.round( - (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) / - height / - 5 - ) * 5 - ); - } catch (error) { - warn(error); - return 0; - } - }; - - addEventListenerFunc("load", function () { - scrolled = position(); - addEventListenerFunc( - scroll, - function () { - if (scrolled < position()) scrolled = position(); - }, - falseVar - ); - }); - - ///////////////////// - // ACTUAL PAGE VIEW LOGIC - // - - var getPath = function (overwrite) { - var path = ""; - - // decodeURIComponent can fail when having invalid characters - // https://github.com/simpleanalytics/roadmap/issues/462 - try { - path = overwrite || decodeURIComponentFunc(loc.pathname); - } catch (error) { - warn(error); - } - - var pathOverwriterFunction = window[pathOverwriter]; - if (isFunction(pathOverwriterFunction)) { - try { - path = pathOverwriterFunction.call(window, { path: path }) || path; - } catch (error) { - warnInFunction("path", error); - } - } - - // Ignore pages specified in data-ignore-pages - if (shouldIgnore(path)) { - warn(notSendingWhen + "ignoring " + path); - return; - } - - // Add hash to path when script is put in to hash mode - if (mode == "hash" && loc.hash) path += loc.hash.split("?")[0]; - - return path; - }; - - var previousReferrer; - - // Send page view and append data to it - var sendPageView = function ( - isPushState, - deleteSourceInfo, - sameSite, - search, - metadata, - callback - ) { - if (isPushState) sendOnLeave("" + payload.page_id, trueVar); - if (collectDataOnLeave) payload.page_id = uuid(); - - var currentPage = definedHostname + getPath(); - var query = getQueryParams(deleteSourceInfo, search); - - sendData( - { - id: payload.page_id, - type: pageviewText, - referrer: !deleteSourceInfo || sameSite ? referrer : null, - query: query, - k: k, - - metadata: stringify(metadata), - }, - callback - ); - - previousReferrer = referrer; - referrer = currentPage; - - pages++; - }; - - var sameSite, userNavigated; - - var pageview = function ( - isPushState, - pathOverwrite, - metadata, - callbackRaw - ) { - if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata; - var callback = isFunction(callbackRaw) ? callbackRaw : function () {}; - var querySearch = ""; - if (isString(pathOverwrite) && pathOverwrite.indexOf("?") > -1) { - // keep query from manual path - var parts = pathOverwrite.split("?"); - pathOverwrite = parts.shift(); - querySearch = "?" + parts.join("?"); - } - // Obfuscate personal data in URL by dropping the search and hash - var path = getPath(pathOverwrite); - - // Don't send the last path again (this could happen when pushState is used to change the path hash or search) - var pathKey = path + querySearch; - if (!path || lastSendPath == pathKey) return; - - lastSendPath = pathKey; - page.path = path; - - // v = viewportsizes - if (collectMetricByString("v")) { - page.viewport_width = - Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) || - null; - page.viewport_height = - Math.max( - documentElement[clientHeight] || 0, - window.innerHeight || 0 - ) || null; - } - - // l = language - if (collectMetricByString("l")) { - if (nav[language]) page[language] = nav[language]; - } - - // sc = screensizes - if (screen && collectMetricByString("sc")) { - page.screen_width = screen.width; - page.screen_height = screen.height; - } - - // If a user does refresh we need to delete the referrer because otherwise it count double - var perf = window.performance; - var navigationText = "navigation"; - - // Check if back, forward or reload buttons are being used in modern browsers - var performaceEntryType; - try { - performaceEntryType = perf.getEntriesByType(navigationText)[0].type; - } catch (error) { - warn(error); - } - - userNavigated = performaceEntryType - ? ["reload", "back_forward"].indexOf(performaceEntryType) > -1 - : // Check if back, forward or reload buttons are being use in older browsers - // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD - perf && - perf[navigationText] && - [1, 2].indexOf(perf[navigationText].type) > -1; - - // Check if referrer is the same as current real hostname (not the defined hostname!) - var currentReferrerHostname = referrer - ? referrer.split(slash)[0] - : undefinedVar; - sameSite = referrer - ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 || - currentReferrerHostname == locationHostname - : falseVar; - - // Only the first pageview can use a Cloudflare referrer as a unique arrival. - page.unique = - isPushState || userNavigated - ? falseVar - : !sameSite || (!pages && /[?&]__cf_/.test(getReferrer(trueVar))); - - metadata = appendMetadata(metadata, { - type: pageviewText, - path: page.path, - }); - - var triggerSendPageView = function () { - fetchedHighEntropyValues = trueVar; - var delSrc = - isPushState || userNavigated || !collectMetricByString("r"); - sendPageView( - isPushState, - delSrc, // r = referrers - sameSite, - querySearch, - metadata, - callback - ); - }; - - if (!fetchedHighEntropyValues) { - // Request platform information if this is available - try { - if (uaData && isFunction(uaData.getHighEntropyValues)) { - uaData - .getHighEntropyValues([platformText, platformVersionText]) - .then(function (highEntropyValues) { - payload.os_name = highEntropyValues[platformText]; - payload.os_version = highEntropyValues[platformVersionText]; - triggerSendPageView(); - }) - .catch(triggerSendPageView); - } else { - triggerSendPageView(); - } - } catch (e) { - triggerSendPageView(); - } - } else { - triggerSendPageView(); - } - }; - - ///////////////////// - // AUTOMATED PAGE VIEW COLLECTION - // - - var his = window.history; - var hisPushState = his ? his.pushState : undefinedVar; - var dis = window.dispatchEvent; - var pushStateText = "pushState"; - - // Overwrite history pushState function to - // allow listening on the pushState event - if (autoCollect && hisPushState && Event && dis) { - var stateListener = function (type) { - var orig = his[type]; - return function () { - var arg = arguments; - var rv = orig.apply(this, arg); - var event; - if (isFunction(Event)) { - event = new Event(type); - } else { - // Fix for IE - // https://github.com/simpleanalytics/scripts/issues/8 - event = doc.createEvent("Event"); - event.initEvent(type, trueVar, trueVar); - } - event.arguments = arg; - dis(event); - return rv; - }; - }; - - his.pushState = stateListener(pushStateText); - - addEventListenerFunc( - pushStateText, - function () { - pageview(1); - }, - falseVar - ); - - addEventListenerFunc( - "popstate", - function () { - pageview(1); - }, - falseVar - ); - } - - // When in hash mode, we record a pageview based on the onhashchange function - if (autoCollect && mode == "hash" && "onhashchange" in window) { - addEventListenerFunc( - "hashchange", - function () { - pageview(1); - }, - falseVar - ); - } - - if (autoCollect) pageview(); - - var manualPageview = function (path, metadata, callback) { - pageview(0, path, metadata, callback); - }; - window[namespace + "_" + pageviewText] = manualPageview; - var defaultPageview = defaultNamespace + "_" + pageviewText; - if (!window[defaultPageview]) window[defaultPageview] = manualPageview; - - - ///////////////////// - // EVENTS - // - - var validTypes = ["string", "number"]; - - var sendEvent = function (event, metadata, callbackRaw, keepalive) { - if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata; - - var eventIsFunction = isFunction(event); - var callback = isFunction(callbackRaw) ? callbackRaw : function () {}; - var eventType = typeof event; - - if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) { - warnInFunction(eventFunctionName, eventText + " can't be " + eventType); - return callback(); - } - - try { - if (eventIsFunction) { - var eventOutput = event(); - if (validTypes.indexOf(typeof eventOutput) < 0) { - warnInFunction( - eventFunctionName, - event + " returns no string: " + eventOutput - ); - return callback(); - } - event = eventOutput; - } - } catch (error) { - warnInFunction(eventFunctionName, error); - return callback(); - } - - event = ("" + event).replace(/[^a-z0-9]+/gi, "_").replace(/(^_|_$)/g, ""); - - var eventParams = { type: eventText, event: event }; - var firstPage = !userNavigated && pages < 2; - - metadata = appendMetadata(metadata, eventParams); - - if (event) { - sendData( - assign(eventParams, { - id: uuid(), - query: getQueryParams(!firstPage), - referrer: - (firstPage || sameSite) && collectMetricByString("r") - ? previousReferrer - : null, - - metadata: stringify(metadata), - }), - callback, - undefinedVar, - keepalive - ); - } - }; - - var defaultEventFunc = function (event, metadata, callback, keepalive) { - sendEvent(event, metadata, callback, keepalive); - }; - - // Set default function if user didn't define a function - if (!window[eventFunctionName]) - window[eventFunctionName] = defaultEventFunc; - - var eventFunc = window[eventFunctionName]; - - // Read queue of the user defined function - var queue = eventFunc && eventFunc.q ? eventFunc.q : []; - - // Overwrite user defined function - window[eventFunctionName] = defaultEventFunc; - - // Post events from the queue of the user defined function - for (var event in queue) { - if (hasProp(queue, event)) { - Array.isArray(queue[event]) - ? sendEvent.apply(null, queue[event]) - : sendEvent(queue[event]); - } - } - - var inlineEvent = function (event) { - var element = event.target; - while ( - element && - element !== doc && - (!element.getAttribute || attr(element, "simple-event") === null) - ) - element = element.parentNode; - - if (!element || element === doc) return; - var isForm = element.tagName === "FORM"; - var name = attr(element, "simple-event"); - if (!name || isForm !== (event.type === "submit")) return; - - var metadata = { tag: element.tagName.toLowerCase() }; - var attributes = element.attributes; - for (var i = 0; i < attributes.length; i++) { - var attribute = attributes[i]; - if (attribute.name.indexOf("data-simple-event-") === 0) - metadata[attribute.name.slice(18).replace(/-/g, "_")] = - attribute.value; - } - if (isForm) { - var button = event.submitter; - metadata.button_text = button - ? (button.textContent || button.value || "") - .replace(/\s+/g, " ") - .trim() - .slice(0, 200) - : ""; - } - sendEvent(name, metadata, undefinedVar, trueVar); - }; - - doc.addEventListener("click", inlineEvent, falseVar); - doc.addEventListener("submit", inlineEvent, falseVar); - - // 404 confirmation adds a request, so existing installs must opt in. - if ( - overwriteOptions.detect404 === trueVar || - attr(scriptElement, "detect-404") == trueText - ) { - var detect404 = function () { - if ( - !/\b404\b/.test(doc.title + " " + (doc.body && doc.body.textContent)) - ) - return; - try { - var request = new window.XMLHttpRequest(); - request.open("HEAD", loc.href, trueVar); - request.onload = function () { - if (request.status === 404) - sendEvent("page_404", { - url: loc.protocol + "//" + definedHostname + loc.pathname, - status: 404, - }); - }; - request.send(); - } catch (error) {} - }; - if (doc.readyState === "loading") - doc.addEventListener("DOMContentLoaded", detect404, falseVar); - else detect404(); - } - } catch (e) { - sendError(e); - } -})( - window, - {"hostname":INSTALL_OPTIONS.hostname,"collectDnt":typeof INSTALL_OPTIONS.collect_dnt === 'boolean' ? INSTALL_OPTIONS.collect_dnt : null,"mode":INSTALL_OPTIONS.hash_mode ? 'hash' : 'normal',"strictUtm":INSTALL_OPTIONS.advanced_settings_toggle && INSTALL_OPTIONS.strict_utm,"allowParams":INSTALL_OPTIONS.advanced_settings_toggle && INSTALL_OPTIONS.allow_url_parameters,"nonUniqueHostnames":INSTALL_OPTIONS.advanced_settings_toggle && INSTALL_OPTIONS.non_unique_hostnames,"ignorePages":INSTALL_OPTIONS.advanced_settings_toggle && INSTALL_OPTIONS.ignore_pages,"namespace":INSTALL_OPTIONS.overwrite_namespace && INSTALL_OPTIONS.namespace}, - INSTALL_OPTIONS.custom_domain || "queue.simpleanalyticscdn.com", - "", - "cloudflare_12", - "sa" -); diff --git a/dist/latest/custom/app.js b/dist/latest/custom/app.js index 541e6121..1f3a204d 100644 --- a/dist/latest/custom/app.js +++ b/dist/latest/custom/app.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-15; f441; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-15; 65b4; v12) */ -!function(v,n,e,r,m){try{var g=undefined,y=!0,_=!1,t="true",a="https:",b="pageview",l="event",i="error",o=v.console,c="doNotTrack",w=v.navigator,s=v.location,O=s.host,u=v.document,p=w.userAgent,f="Not sending request ",d=f+"when ",x=_,h=encodeURIComponent,E=decodeURIComponent,M=JSON.stringify,S=v.addEventListener,k="https://"+e,A=u.documentElement||{},q="language",C="Height",D="scroll",$=w.userAgentData,j=D+C,H="offset"+C,R="client"+C,L="pagehide",N="platform",P="platformVersion",T="https://docs.simpleanalytics.com",U=0,I=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),V=v.screen,B=u.currentScript||u.querySelector('script[src*="'+e+'"]');m=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){m("Error in your "+t+" function:",e)},z=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},W=function(t){return"string"==typeof t},G=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},J=function(t,e){return t&&t.getAttribute("data-"+e)},X=function(t){return Array.isArray(t)?t:W(t)&&t.length?t.split(/, ?/):[]},Y=function(t){return t&&t.constructor===Object},Z=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},it=function(t){return"function"==typeof t},ot="namespace",ct=n[ot]||J(B,ot)||"sa",st=function(t,e){var n=v[ct+"_metadata"];Y(n)&&(t=Z(t,n));var r=v[kt];if(!it(r))return kt&&m(kt+" not found, set window."+kt),t;try{return Z(t,r.call(v,Z(t,e)))}catch(a){F("metadata",a)}},ut=n.strictUtm||J(B,"strict-utm")==t,lt=function(i,t){tt=!i&&nt("q")?"":_;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");tt!==_&&0"); +!function(v,e,n,m){var r,a,t;if(v)try{var g=undefined,y=!0,_=!1,i="true",o="https:",w="pageview",l="event",c="error",s=v.console,u="doNotTrack",b=v.navigator,f=v.location,x=f.host,p=v.document,d=b.userAgent,h="Not sending request ",E=h+"when ",O=_,M=encodeURIComponent,S=decodeURIComponent,k=JSON.stringify,A=v.addEventListener,q="https://"+e,C=p.documentElement||{},D="language",$="Height",H="scroll",R=b.userAgentData,j=H+$,L="offset"+$,N="client"+$,P="pagehide",T="platform",U="platformVersion",I="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(d)&&!/(cubot)/i.test(d),F=v.screen,z=p.currentScript||p.querySelector('script[src*="'+e+'"]');m=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(s.warn,s,t)};var W=function(t,e){m("Error in your "+t+" function:",e)},G=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},J=function(t){return"string"==typeof t},X=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},Y=function(t,e){return t&&t.getAttribute("data-"+e)},Z=function(t){return Array.isArray(t)?t:J(t)&&t.length?t.split(/, ?/):[]},K=function(t){return t&&t.constructor===Object},Q=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},ct=function(t){return"function"==typeof t},st="namespace",ut=et[st]||Y(z,st)||"sa",lt=function(t,e){var n=v[ut+"_metadata"];K(n)&&(t=Q(t,n));var r=v[qt];if(!ct(r))return qt&&m(qt+" not found, set window."+qt),t;try{return Q(t,r.call(v,Q(t,e)))}catch(a){W("metadata",a)}},ft=et.strictUtm||Y(z,"strict-utm")==i,pt=function(i,t){nt=!i&&at("q")?"":_;var e=(t||f.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");nt!==_&&0"); //# sourceMappingURL=app.js.map \ No newline at end of file diff --git a/dist/latest/custom/app.js.map b/dist/latest/custom/app.js.map index a83e8755..a8d82427 100644 --- a/dist/latest/custom/app.js.map +++ b/dist/latest/custom/app.js.map @@ -1 +1 @@ -{"version":3,"file":"app.source.js","sources":["app.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData, keepalive) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n var imageUrl =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n\n // Events must survive navigation without taking over links or forms.\n if (keepalive && window.fetch) {\n try {\n window\n .fetch(imageUrl, {\n keepalive: trueVar,\n mode: \"no-cors\",\n credentials: \"omit\",\n })\n .catch(function () {\n image.src = imageUrl;\n });\n return;\n } catch (error) {}\n }\n image.src = imageUrl;\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function (raw) {\n // Customers can overwrite their referrer, here we check for that\n var referrer =\n overwriteOptions.referrer ||\n attr(scriptElement, \"referrer\") ||\n doc.referrer ||\n \"\";\n\n if (raw) return referrer;\n return (\n referrer\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch = \"\";\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n var pathKey = path + querySearch;\n if (!path || lastSendPath == pathKey) return;\n\n lastSendPath = pathKey;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // Only the first pageview can use a Cloudflare referrer as a unique arrival.\n page.unique =\n isPushState || userNavigated\n ? falseVar\n : !sameSite || (!pages && /[?&]__cf_/.test(getReferrer(trueVar)));\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n var manualPageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n window[namespace + \"_\" + pageviewText] = manualPageview;\n var defaultPageview = defaultNamespace + \"_\" + pageviewText;\n if (!window[defaultPageview]) window[defaultPageview] = manualPageview;\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw, keepalive) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback,\n undefinedVar,\n keepalive\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback, keepalive) {\n sendEvent(event, metadata, callback, keepalive);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n\n var inlineEvent = function (event) {\n var element = event.target;\n while (\n element &&\n element !== doc &&\n (!element.getAttribute || attr(element, \"simple-event\") === null)\n )\n element = element.parentNode;\n\n if (!element || element === doc) return;\n var isForm = element.tagName === \"FORM\";\n var name = attr(element, \"simple-event\");\n if (!name || isForm !== (event.type === \"submit\")) return;\n\n var metadata = { tag: element.tagName.toLowerCase() };\n var attributes = element.attributes;\n for (var i = 0; i < attributes.length; i++) {\n var attribute = attributes[i];\n if (attribute.name.indexOf(\"data-simple-event-\") === 0)\n metadata[attribute.name.slice(18).replace(/-/g, \"_\")] =\n attribute.value;\n }\n if (isForm) {\n var button = event.submitter;\n metadata.button_text = button\n ? (button.textContent || button.value || \"\")\n .replace(/\\s+/g, \" \")\n .trim()\n .slice(0, 200)\n : \"\";\n }\n sendEvent(name, metadata, undefinedVar, trueVar);\n };\n\n doc.addEventListener(\"click\", inlineEvent, falseVar);\n doc.addEventListener(\"submit\", inlineEvent, falseVar);\n\n // 404 confirmation adds a request, so existing installs must opt in.\n if (\n overwriteOptions.detect404 === trueVar ||\n attr(scriptElement, \"detect-404\") == trueText\n ) {\n var detect404 = function () {\n if (\n !/\\b404\\b/.test(doc.title + \" \" + (doc.body && doc.body.textContent))\n )\n return;\n try {\n var request = new window.XMLHttpRequest();\n request.open(\"HEAD\", loc.href, trueVar);\n request.onload = function () {\n if (request.status === 404)\n sendEvent(\"page_404\", {\n url: loc.protocol + \"//\" + definedHostname + loc.pathname,\n status: 404,\n });\n };\n request.send();\n } catch (error) {}\n };\n if (doc.readyState === \"loading\")\n doc.addEventListener(\"DOMContentLoaded\", detect404, falseVar);\n else detect404();\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_app_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","keepalive","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","imageUrl","key","fetch","mode","credentials","catch","src","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","protocol","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","raw","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","parts","querySearch","shift","pathKey","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","manualPageview","defaultPageview","defaultNamespace","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue","detect404","inlineEvent","element","target","parentNode","isForm","tagName","button","tag","toLowerCase","attributes","submitter","button_text","textContent","trim","title","request","XMLHttpRequest","open","href","status","url","send","readyState"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"app.source.js","sources":["app.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n // Only initialize in a browser.\n if (!window) return;\n\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings;\n settings = assign(settings);\n\n if (logSettings) warn(\"Settings\", settings);\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n settings.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n settings[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n settings.strictUtm || attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData, keepalive) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n var imageUrl =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n\n // Events must survive navigation without taking over links or forms.\n if (keepalive && window.fetch) {\n try {\n window\n .fetch(imageUrl, {\n keepalive: trueVar,\n mode: \"no-cors\",\n credentials: \"omit\",\n })\n .catch(function () {\n image.src = imageUrl;\n });\n return;\n } catch (error) {}\n }\n image.src = imageUrl;\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n settings.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = settings.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(settings.collectDnt)\n ? settings.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n settings.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n settings.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n settings.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n settings.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n settings.nonUniqueHostnames || attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n settings.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n settings.metadataCollector || attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function (raw) {\n // Customers can overwrite their referrer, here we check for that\n var referrer =\n settings.referrer ||\n attr(scriptElement, \"referrer\") ||\n doc.referrer ||\n \"\";\n\n if (raw) return referrer;\n return (\n referrer\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch = \"\";\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n var pathKey = path + querySearch;\n if (!path || lastSendPath == pathKey) return;\n\n lastSendPath = pathKey;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // Only the first pageview can use a Cloudflare referrer as a unique arrival.\n page.unique =\n isPushState || userNavigated\n ? falseVar\n : !sameSite || (!pages && /[?&]__cf_/.test(getReferrer(trueVar)));\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n var manualPageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n window[namespace + \"_\" + pageviewText] = manualPageview;\n var defaultPageview = defaultNamespace + \"_\" + pageviewText;\n if (!window[defaultPageview]) window[defaultPageview] = manualPageview;\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw, keepalive) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback,\n undefinedVar,\n keepalive\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback, keepalive) {\n sendEvent(event, metadata, callback, keepalive);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n\n var inlineEvent = function (event) {\n var element = event.target;\n while (\n element &&\n element !== doc &&\n (!element.getAttribute || attr(element, \"simple-event\") === null)\n )\n element = element.parentNode;\n\n if (!element || element === doc) return;\n var isForm = element.tagName === \"FORM\";\n var name = attr(element, \"simple-event\");\n if (!name || isForm !== (event.type === \"submit\")) return;\n\n var metadata = { tag: element.tagName.toLowerCase() };\n var attributes = element.attributes;\n for (var i = 0; i < attributes.length; i++) {\n var attribute = attributes[i];\n if (attribute.name.indexOf(\"data-simple-event-\") === 0)\n metadata[attribute.name.slice(18).replace(/-/g, \"_\")] =\n attribute.value;\n }\n if (isForm) {\n var button = event.submitter;\n metadata.button_text = button\n ? (button.textContent || button.value || \"\")\n .replace(/\\s+/g, \" \")\n .trim()\n .slice(0, 200)\n : \"\";\n }\n sendEvent(name, metadata, undefinedVar, trueVar);\n };\n\n doc.addEventListener(\"click\", inlineEvent, falseVar);\n doc.addEventListener(\"submit\", inlineEvent, falseVar);\n\n // 404 confirmation adds a request, so existing installs must opt in.\n if (\n settings.detect404 === trueVar ||\n attr(scriptElement, \"detect-404\") == trueText\n ) {\n var detect404 = function () {\n if (\n !/\\b404\\b/.test(doc.title + \" \" + (doc.body && doc.body.textContent))\n )\n return;\n try {\n var request = new window.XMLHttpRequest();\n request.open(\"HEAD\", loc.href, trueVar);\n request.onload = function () {\n if (request.status === 404)\n sendEvent(\"page_404\", {\n url: loc.protocol + \"//\" + definedHostname + loc.pathname,\n status: 404,\n });\n };\n request.send();\n } catch (error) {}\n };\n if (doc.readyState === \"loading\")\n doc.addEventListener(\"DOMContentLoaded\", detect404, falseVar);\n else detect404();\n }\n } catch (e) {\n sendError(e);\n }\n})(\n typeof window != \"undefined\" && window,\n \"\",\n \"\",\n \"custom_app_12\",\n \"sa\"\n);\n"],"names":["window","baseUrl","sendError","warn","type","orig","value","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","logSettings","settings","sa_settings","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","keepalive","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","imageUrl","keys","key","fetch","mode","credentials","catch","src","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","path","pathname","event","filename","message","timezone","start","scrolled","collectDnt","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","protocol","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","raw","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","parts","querySearch","shift","pathKey","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","rv","this","createEvent","initEvent","manualPageview","defaultPageview","defaultNamespace","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue","detect404","inlineEvent","element","target","parentNode","isForm","tagName","button","tag","toLowerCase","attributes","submitter","button_text","textContent","trim","title","request","XMLHttpRequest","open","href","status","url","send","readyState"],"mappings":"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"} \ No newline at end of file diff --git a/dist/latest/custom/e.js b/dist/latest/custom/e.js index 9b9a681b..692d04a5 100644 --- a/dist/latest/custom/e.js +++ b/dist/latest/custom/e.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-15; 04c5; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-15; 1c39; v12) */ -!function(v,n,e,r,m){try{var g=undefined,y=!0,_=!1,t="true",a="https:",b="pageview",l="event",i="error",o=v.console,c="doNotTrack",w=v.navigator,s=v.location,O=s.host,u=v.document,f=w.userAgent,p="Not sending request ",d=p+"when ",x=_,h=encodeURIComponent,E=decodeURIComponent,M=JSON.stringify,S=v.addEventListener,k="https://"+e,A=u.documentElement||{},q="language",C="Height",D="scroll",$=w.userAgentData,j=D+C,H="offset"+C,R="client"+C,L="pagehide",N="platform",P="platformVersion",T="https://docs.simpleanalytics.com",U=0,I=/(bot|spider|crawl)/i.test(f)&&!/(cubot)/i.test(f),V=v.screen,B=u.currentScript||u.querySelector('script[src*="'+e+'"]');m=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){m("Error in your "+t+" function:",e)},z=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},W=function(t){return"string"==typeof t},G=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},J=function(t,e){return t&&t.getAttribute("data-"+e)},X=function(t){return Array.isArray(t)?t:W(t)&&t.length?t.split(/, ?/):[]},Y=function(t){return t&&t.constructor===Object},Z=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},it=function(t){return"function"==typeof t},ot="namespace",ct=n[ot]||J(B,ot)||"sa",st=function(t,e){var n=v[ct+"_metadata"];Y(n)&&(t=Z(t,n));var r=v[kt];if(!it(r))return kt&&m(kt+" not found, set window."+kt),t;try{return Z(t,r.call(v,Z(t,e)))}catch(a){F("metadata",a)}},ut=n.strictUtm||J(B,"strict-utm")==t,lt=function(i,t){tt=!i&&nt("q")?"":_;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");tt!==_&&0"); +!function(v,e,n,m){var r,a,t;if(v)try{var g=undefined,y=!0,_=!1,i="true",o="https:",w="pageview",l="event",c="error",s=v.console,u="doNotTrack",b=v.navigator,f=v.location,x=f.host,d=v.document,p=b.userAgent,h="Not sending request ",E=h+"when ",O=_,M=encodeURIComponent,S=decodeURIComponent,k=JSON.stringify,A=v.addEventListener,q="https://"+e,C=d.documentElement||{},D="language",$="Height",H="scroll",R=b.userAgentData,j=H+$,L="offset"+$,N="client"+$,P="pagehide",T="platform",U="platformVersion",I="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),F=v.screen,z=d.currentScript||d.querySelector('script[src*="'+e+'"]');m=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(s.warn,s,t)};var W=function(t,e){m("Error in your "+t+" function:",e)},G=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},J=function(t){return"string"==typeof t},X=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},Y=function(t,e){return t&&t.getAttribute("data-"+e)},Z=function(t){return Array.isArray(t)?t:J(t)&&t.length?t.split(/, ?/):[]},K=function(t){return t&&t.constructor===Object},Q=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},ct=function(t){return"function"==typeof t},st="namespace",ut=et[st]||Y(z,st)||"sa",lt=function(t,e){var n=v[ut+"_metadata"];K(n)&&(t=Q(t,n));var r=v[qt];if(!ct(r))return qt&&m(qt+" not found, set window."+qt),t;try{return Q(t,r.call(v,Q(t,e)))}catch(a){W("metadata",a)}},ft=et.strictUtm||Y(z,"strict-utm")==i,dt=function(i,t){nt=!i&&at("q")?"":_;var e=(t||f.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");nt!==_&&0"); //# sourceMappingURL=e.js.map \ No newline at end of file diff --git a/dist/latest/custom/e.js.map b/dist/latest/custom/e.js.map index 8250885b..325699b3 100644 --- a/dist/latest/custom/e.js.map +++ b/dist/latest/custom/e.js.map @@ -1 +1 @@ -{"version":3,"file":"e.source.js","sources":["e.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData, keepalive) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n var imageUrl =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n\n // Events must survive navigation without taking over links or forms.\n if (keepalive && window.fetch) {\n try {\n window\n .fetch(imageUrl, {\n keepalive: trueVar,\n mode: \"no-cors\",\n credentials: \"omit\",\n })\n .catch(function () {\n image.src = imageUrl;\n });\n return;\n } catch (error) {}\n }\n image.src = imageUrl;\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function (raw) {\n // Customers can overwrite their referrer, here we check for that\n var referrer =\n overwriteOptions.referrer ||\n attr(scriptElement, \"referrer\") ||\n doc.referrer ||\n \"\";\n\n if (raw) return referrer;\n return (\n referrer\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch = \"\";\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n var pathKey = path + querySearch;\n if (!path || lastSendPath == pathKey) return;\n\n lastSendPath = pathKey;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // Only the first pageview can use a Cloudflare referrer as a unique arrival.\n page.unique =\n isPushState || userNavigated\n ? falseVar\n : !sameSite || (!pages && /[?&]__cf_/.test(getReferrer(trueVar)));\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n var manualPageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n window[namespace + \"_\" + pageviewText] = manualPageview;\n var defaultPageview = defaultNamespace + \"_\" + pageviewText;\n if (!window[defaultPageview]) window[defaultPageview] = manualPageview;\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw, keepalive) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback,\n undefinedVar,\n keepalive\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback, keepalive) {\n sendEvent(event, metadata, callback, keepalive);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n\n var inlineEvent = function (event) {\n var element = event.target;\n while (\n element &&\n element !== doc &&\n (!element.getAttribute || attr(element, \"simple-event\") === null)\n )\n element = element.parentNode;\n\n if (!element || element === doc) return;\n var isForm = element.tagName === \"FORM\";\n var name = attr(element, \"simple-event\");\n if (!name || isForm !== (event.type === \"submit\")) return;\n\n var metadata = { tag: element.tagName.toLowerCase() };\n var attributes = element.attributes;\n for (var i = 0; i < attributes.length; i++) {\n var attribute = attributes[i];\n if (attribute.name.indexOf(\"data-simple-event-\") === 0)\n metadata[attribute.name.slice(18).replace(/-/g, \"_\")] =\n attribute.value;\n }\n if (isForm) {\n var button = event.submitter;\n metadata.button_text = button\n ? (button.textContent || button.value || \"\")\n .replace(/\\s+/g, \" \")\n .trim()\n .slice(0, 200)\n : \"\";\n }\n sendEvent(name, metadata, undefinedVar, trueVar);\n };\n\n doc.addEventListener(\"click\", inlineEvent, falseVar);\n doc.addEventListener(\"submit\", inlineEvent, falseVar);\n\n // 404 confirmation adds a request, so existing installs must opt in.\n if (\n overwriteOptions.detect404 === trueVar ||\n attr(scriptElement, \"detect-404\") == trueText\n ) {\n var detect404 = function () {\n if (\n !/\\b404\\b/.test(doc.title + \" \" + (doc.body && doc.body.textContent))\n )\n return;\n try {\n var request = new window.XMLHttpRequest();\n request.open(\"HEAD\", loc.href, trueVar);\n request.onload = function () {\n if (request.status === 404)\n sendEvent(\"page_404\", {\n url: loc.protocol + \"//\" + definedHostname + loc.pathname,\n status: 404,\n });\n };\n request.send();\n } catch (error) {}\n };\n if (doc.readyState === \"loading\")\n doc.addEventListener(\"DOMContentLoaded\", detect404, falseVar);\n else detect404();\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_events_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","keepalive","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","imageUrl","key","fetch","mode","credentials","catch","src","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","protocol","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","raw","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","parts","querySearch","shift","pathKey","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","manualPageview","defaultPageview","defaultNamespace","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue","detect404","inlineEvent","element","target","parentNode","isForm","tagName","button","tag","toLowerCase","attributes","submitter","button_text","textContent","trim","title","request","XMLHttpRequest","open","href","status","url","send","readyState"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"e.source.js","sources":["e.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n // Only initialize in a browser.\n if (!window) return;\n\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings;\n settings = assign(settings);\n\n if (logSettings) warn(\"Settings\", settings);\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n settings.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n settings[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n settings.strictUtm || attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData, keepalive) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n var imageUrl =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n\n // Events must survive navigation without taking over links or forms.\n if (keepalive && window.fetch) {\n try {\n window\n .fetch(imageUrl, {\n keepalive: trueVar,\n mode: \"no-cors\",\n credentials: \"omit\",\n })\n .catch(function () {\n image.src = imageUrl;\n });\n return;\n } catch (error) {}\n }\n image.src = imageUrl;\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n settings.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = settings.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(settings.collectDnt)\n ? settings.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n settings.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n settings.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n settings.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n settings.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n settings.nonUniqueHostnames || attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n settings.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n settings.metadataCollector || attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function (raw) {\n // Customers can overwrite their referrer, here we check for that\n var referrer =\n settings.referrer ||\n attr(scriptElement, \"referrer\") ||\n doc.referrer ||\n \"\";\n\n if (raw) return referrer;\n return (\n referrer\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch = \"\";\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n var pathKey = path + querySearch;\n if (!path || lastSendPath == pathKey) return;\n\n lastSendPath = pathKey;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // Only the first pageview can use a Cloudflare referrer as a unique arrival.\n page.unique =\n isPushState || userNavigated\n ? falseVar\n : !sameSite || (!pages && /[?&]__cf_/.test(getReferrer(trueVar)));\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n var manualPageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n window[namespace + \"_\" + pageviewText] = manualPageview;\n var defaultPageview = defaultNamespace + \"_\" + pageviewText;\n if (!window[defaultPageview]) window[defaultPageview] = manualPageview;\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw, keepalive) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback,\n undefinedVar,\n keepalive\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback, keepalive) {\n sendEvent(event, metadata, callback, keepalive);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n\n var inlineEvent = function (event) {\n var element = event.target;\n while (\n element &&\n element !== doc &&\n (!element.getAttribute || attr(element, \"simple-event\") === null)\n )\n element = element.parentNode;\n\n if (!element || element === doc) return;\n var isForm = element.tagName === \"FORM\";\n var name = attr(element, \"simple-event\");\n if (!name || isForm !== (event.type === \"submit\")) return;\n\n var metadata = { tag: element.tagName.toLowerCase() };\n var attributes = element.attributes;\n for (var i = 0; i < attributes.length; i++) {\n var attribute = attributes[i];\n if (attribute.name.indexOf(\"data-simple-event-\") === 0)\n metadata[attribute.name.slice(18).replace(/-/g, \"_\")] =\n attribute.value;\n }\n if (isForm) {\n var button = event.submitter;\n metadata.button_text = button\n ? (button.textContent || button.value || \"\")\n .replace(/\\s+/g, \" \")\n .trim()\n .slice(0, 200)\n : \"\";\n }\n sendEvent(name, metadata, undefinedVar, trueVar);\n };\n\n doc.addEventListener(\"click\", inlineEvent, falseVar);\n doc.addEventListener(\"submit\", inlineEvent, falseVar);\n\n // 404 confirmation adds a request, so existing installs must opt in.\n if (\n settings.detect404 === trueVar ||\n attr(scriptElement, \"detect-404\") == trueText\n ) {\n var detect404 = function () {\n if (\n !/\\b404\\b/.test(doc.title + \" \" + (doc.body && doc.body.textContent))\n )\n return;\n try {\n var request = new window.XMLHttpRequest();\n request.open(\"HEAD\", loc.href, trueVar);\n request.onload = function () {\n if (request.status === 404)\n sendEvent(\"page_404\", {\n url: loc.protocol + \"//\" + definedHostname + loc.pathname,\n status: 404,\n });\n };\n request.send();\n } catch (error) {}\n };\n if (doc.readyState === \"loading\")\n doc.addEventListener(\"DOMContentLoaded\", detect404, falseVar);\n else detect404();\n }\n } catch (e) {\n sendError(e);\n }\n})(\n typeof window != \"undefined\" && window,\n \"\",\n \"\",\n \"custom_events_12\",\n \"sa\"\n);\n"],"names":["window","baseUrl","sendError","warn","type","orig","value","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","logSettings","settings","sa_settings","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","keepalive","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","imageUrl","keys","key","fetch","mode","credentials","catch","src","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","path","pathname","event","filename","message","timezone","start","scrolled","collectDnt","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","protocol","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","raw","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","parts","querySearch","shift","pathKey","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","rv","this","createEvent","initEvent","manualPageview","defaultPageview","defaultNamespace","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue","detect404","inlineEvent","element","target","parentNode","isForm","tagName","button","tag","toLowerCase","attributes","submitter","button_text","textContent","trim","title","request","XMLHttpRequest","open","href","status","url","send","readyState"],"mappings":"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"} \ No newline at end of file diff --git a/dist/latest/custom/latest.dev.js b/dist/latest/custom/latest.dev.js index 4efdcd15..579c9a8b 100644 --- a/dist/latest/custom/latest.dev.js +++ b/dist/latest/custom/latest.dev.js @@ -1,9 +1,8 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-15; 25ef; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-15; 5f47; v12) */ /* eslint-env browser */ (function ( window, - overwriteOptions, baseUrl, apiUrlPrefix, version, @@ -11,6 +10,9 @@ sendError, warn ) { + // Only initialize in a browser. + if (!window) return; + try { ///////////////////// // PREDEFINED VARIABLES FOR BETTER MINIFICATION @@ -64,7 +66,6 @@ /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent); var screen = window.screen; - // Find the script element where options can be set on var scriptElement = doc.currentScript || doc.querySelector('script[src*="' + baseUrl + '"]'); @@ -135,16 +136,14 @@ }; var settings = window.sa_settings; - var logSettings = settings || Object.keys(overwriteOptions).length; + var logSettings = settings; + settings = assign(settings); - // Merge overwriteOptions with sa_settings - overwriteOptions = assign(overwriteOptions, settings); - - if (logSettings) warn("Settings", overwriteOptions); + if (logSettings) warn("Settings", settings); // Customers can skip data points var ignoreMetrics = convertCommaSeparatedToArray( - overwriteOptions.ignoreMetrics || attr(scriptElement, "ignore-metrics") + settings.ignoreMetrics || attr(scriptElement, "ignore-metrics") ); var collectMetricByString = function (metricAbbreviation) { @@ -187,7 +186,7 @@ // Define namespace for the library var namespaceText = "namespace"; var namespace = - overwriteOptions[namespaceText] || + settings[namespaceText] || attr(scriptElement, namespaceText) || defaultNamespace; @@ -219,8 +218,7 @@ // By default we allow source, medium in the URLs. With strictUtm enabled // we only allow it with the utm_ prefix: utm_source, utm_medium, ... var strictUtm = - overwriteOptions.strictUtm || - attr(scriptElement, "strict-utm") == trueText; + settings.strictUtm || attr(scriptElement, "strict-utm") == trueText; var k; @@ -347,7 +345,7 @@ // Customers can overwrite their hostname, here we check for that var overwrittenHostname = - overwriteOptions.hostname || attr(scriptElement, "hostname"); + settings.hostname || attr(scriptElement, "hostname"); var definedHostname = overwrittenHostname || locationHostname; var basePayload = { @@ -402,11 +400,11 @@ // // Script mode, this can be hash mode for example - var mode = overwriteOptions.mode || attr(scriptElement, "mode"); + var mode = settings.mode || attr(scriptElement, "mode"); // Should we record Do Not Track visits? - var collectDnt = isBoolean(overwriteOptions.collectDnt) - ? overwriteOptions.collectDnt + var collectDnt = isBoolean(settings.collectDnt) + ? settings.collectDnt : attr(scriptElement, "ignore-dnt") == trueText || attr(scriptElement, "skip-dnt") == trueText || attr(scriptElement, "collect-dnt") == trueText; @@ -414,39 +412,37 @@ // Some customers want to collect page views manually var autoCollect = !( attr(scriptElement, "auto-collect") == "false" || - overwriteOptions.autoCollect === falseVar + settings.autoCollect === falseVar ); // Event function name var eventFunctionName = - overwriteOptions.saGlobal || + settings.saGlobal || attr(scriptElement, "sa-global") || namespace + "_" + eventText; // Customers can ignore certain pages var ignorePages = convertCommaSeparatedToArray( - overwriteOptions.ignorePages || attr(scriptElement, "ignore-pages") + settings.ignorePages || attr(scriptElement, "ignore-pages") ); // Customers can allow params var allowParams = convertCommaSeparatedToArray( - overwriteOptions.allowParams || attr(scriptElement, "allow-params") + settings.allowParams || attr(scriptElement, "allow-params") ); // Customers can allow params var nonUniqueHostnames = convertCommaSeparatedToArray( - overwriteOptions.nonUniqueHostnames || - attr(scriptElement, "non-unique-hostnames") + settings.nonUniqueHostnames || attr(scriptElement, "non-unique-hostnames") ); // Customers can overwrite certain values var pathOverwriter = - overwriteOptions.pathOverwriter || attr(scriptElement, "path-overwriter"); + settings.pathOverwriter || attr(scriptElement, "path-overwriter"); // Customers can add metadata to events and pageviews via a function var metadataCollector = - overwriteOptions.metadataCollector || - attr(scriptElement, "metadata-collector"); + settings.metadataCollector || attr(scriptElement, "metadata-collector"); // This code could error on (incomplete) implementations, that's why we use try...catch var timezone; @@ -546,7 +542,7 @@ var getReferrer = function (raw) { // Customers can overwrite their referrer, here we check for that var referrer = - overwriteOptions.referrer || + settings.referrer || attr(scriptElement, "referrer") || doc.referrer || ""; @@ -1049,7 +1045,7 @@ // 404 confirmation adds a request, so existing installs must opt in. if ( - overwriteOptions.detect404 === trueVar || + settings.detect404 === trueVar || attr(scriptElement, "detect-404") == trueText ) { var detect404 = function () { @@ -1078,8 +1074,7 @@ sendError(e); } })( - window, - {}, + typeof window != "undefined" && window, "", "", "custom_latest_dev_12", diff --git a/dist/latest/custom/latest.js b/dist/latest/custom/latest.js index ae0db61d..186abf9a 100644 --- a/dist/latest/custom/latest.js +++ b/dist/latest/custom/latest.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-15; be19; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-15; 79e7; v12) */ -!function(v,n,e,r,m){try{var g=undefined,y=!0,_=!1,t="true",a="https:",b="pageview",l="event",i="error",o=v.console,c="doNotTrack",w=v.navigator,s=v.location,O=s.host,u=v.document,f=w.userAgent,p="Not sending request ",d=p+"when ",x=_,h=encodeURIComponent,E=decodeURIComponent,M=JSON.stringify,S=v.addEventListener,k="https://"+e,A=u.documentElement||{},q="language",C="Height",D="scroll",$=w.userAgentData,j=D+C,H="offset"+C,R="client"+C,L="pagehide",N="platform",P="platformVersion",T="https://docs.simpleanalytics.com",U=0,I=/(bot|spider|crawl)/i.test(f)&&!/(cubot)/i.test(f),V=v.screen,B=u.currentScript||u.querySelector('script[src*="'+e+'"]');m=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){m("Error in your "+t+" function:",e)},z=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},W=function(t){return"string"==typeof t},G=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},J=function(t,e){return t&&t.getAttribute("data-"+e)},X=function(t){return Array.isArray(t)?t:W(t)&&t.length?t.split(/, ?/):[]},Y=function(t){return t&&t.constructor===Object},Z=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},it=function(t){return"function"==typeof t},ot="namespace",ct=n[ot]||J(B,ot)||"sa",st=function(t,e){var n=v[ct+"_metadata"];Y(n)&&(t=Z(t,n));var r=v[kt];if(!it(r))return kt&&m(kt+" not found, set window."+kt),t;try{return Z(t,r.call(v,Z(t,e)))}catch(a){F("metadata",a)}},ut=n.strictUtm||J(B,"strict-utm")==t,lt=function(i,t){tt=!i&&nt("q")?"":_;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");tt!==_&&0"); +!function(v,e,n,m){var r,a,t;if(v)try{var g=undefined,y=!0,_=!1,i="true",o="https:",w="pageview",l="event",c="error",s=v.console,u="doNotTrack",b=v.navigator,f=v.location,x=f.host,d=v.document,p=b.userAgent,h="Not sending request ",E=h+"when ",O=_,M=encodeURIComponent,S=decodeURIComponent,k=JSON.stringify,A=v.addEventListener,q="https://"+e,C=d.documentElement||{},D="language",$="Height",H="scroll",R=b.userAgentData,j=H+$,L="offset"+$,N="client"+$,P="pagehide",T="platform",U="platformVersion",I="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),F=v.screen,z=d.currentScript||d.querySelector('script[src*="'+e+'"]');m=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(s.warn,s,t)};var W=function(t,e){m("Error in your "+t+" function:",e)},G=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},J=function(t){return"string"==typeof t},X=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},Y=function(t,e){return t&&t.getAttribute("data-"+e)},Z=function(t){return Array.isArray(t)?t:J(t)&&t.length?t.split(/, ?/):[]},K=function(t){return t&&t.constructor===Object},Q=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},ct=function(t){return"function"==typeof t},st="namespace",ut=et[st]||Y(z,st)||"sa",lt=function(t,e){var n=v[ut+"_metadata"];K(n)&&(t=Q(t,n));var r=v[qt];if(!ct(r))return qt&&m(qt+" not found, set window."+qt),t;try{return Q(t,r.call(v,Q(t,e)))}catch(a){W("metadata",a)}},ft=et.strictUtm||Y(z,"strict-utm")==i,dt=function(i,t){nt=!i&&at("q")?"":_;var e=(t||f.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");nt!==_&&0"); //# sourceMappingURL=latest.js.map \ No newline at end of file diff --git a/dist/latest/custom/latest.js.map b/dist/latest/custom/latest.js.map index aa2a709d..e8fd11c9 100644 --- a/dist/latest/custom/latest.js.map +++ b/dist/latest/custom/latest.js.map @@ -1 +1 @@ -{"version":3,"file":"latest.source.js","sources":["latest.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData, keepalive) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n var imageUrl =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n\n // Events must survive navigation without taking over links or forms.\n if (keepalive && window.fetch) {\n try {\n window\n .fetch(imageUrl, {\n keepalive: trueVar,\n mode: \"no-cors\",\n credentials: \"omit\",\n })\n .catch(function () {\n image.src = imageUrl;\n });\n return;\n } catch (error) {}\n }\n image.src = imageUrl;\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function (raw) {\n // Customers can overwrite their referrer, here we check for that\n var referrer =\n overwriteOptions.referrer ||\n attr(scriptElement, \"referrer\") ||\n doc.referrer ||\n \"\";\n\n if (raw) return referrer;\n return (\n referrer\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch = \"\";\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n var pathKey = path + querySearch;\n if (!path || lastSendPath == pathKey) return;\n\n lastSendPath = pathKey;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // Only the first pageview can use a Cloudflare referrer as a unique arrival.\n page.unique =\n isPushState || userNavigated\n ? falseVar\n : !sameSite || (!pages && /[?&]__cf_/.test(getReferrer(trueVar)));\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n var manualPageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n window[namespace + \"_\" + pageviewText] = manualPageview;\n var defaultPageview = defaultNamespace + \"_\" + pageviewText;\n if (!window[defaultPageview]) window[defaultPageview] = manualPageview;\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw, keepalive) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback,\n undefinedVar,\n keepalive\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback, keepalive) {\n sendEvent(event, metadata, callback, keepalive);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n\n var inlineEvent = function (event) {\n var element = event.target;\n while (\n element &&\n element !== doc &&\n (!element.getAttribute || attr(element, \"simple-event\") === null)\n )\n element = element.parentNode;\n\n if (!element || element === doc) return;\n var isForm = element.tagName === \"FORM\";\n var name = attr(element, \"simple-event\");\n if (!name || isForm !== (event.type === \"submit\")) return;\n\n var metadata = { tag: element.tagName.toLowerCase() };\n var attributes = element.attributes;\n for (var i = 0; i < attributes.length; i++) {\n var attribute = attributes[i];\n if (attribute.name.indexOf(\"data-simple-event-\") === 0)\n metadata[attribute.name.slice(18).replace(/-/g, \"_\")] =\n attribute.value;\n }\n if (isForm) {\n var button = event.submitter;\n metadata.button_text = button\n ? (button.textContent || button.value || \"\")\n .replace(/\\s+/g, \" \")\n .trim()\n .slice(0, 200)\n : \"\";\n }\n sendEvent(name, metadata, undefinedVar, trueVar);\n };\n\n doc.addEventListener(\"click\", inlineEvent, falseVar);\n doc.addEventListener(\"submit\", inlineEvent, falseVar);\n\n // 404 confirmation adds a request, so existing installs must opt in.\n if (\n overwriteOptions.detect404 === trueVar ||\n attr(scriptElement, \"detect-404\") == trueText\n ) {\n var detect404 = function () {\n if (\n !/\\b404\\b/.test(doc.title + \" \" + (doc.body && doc.body.textContent))\n )\n return;\n try {\n var request = new window.XMLHttpRequest();\n request.open(\"HEAD\", loc.href, trueVar);\n request.onload = function () {\n if (request.status === 404)\n sendEvent(\"page_404\", {\n url: loc.protocol + \"//\" + definedHostname + loc.pathname,\n status: 404,\n });\n };\n request.send();\n } catch (error) {}\n };\n if (doc.readyState === \"loading\")\n doc.addEventListener(\"DOMContentLoaded\", detect404, falseVar);\n else detect404();\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_latest_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","keepalive","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","imageUrl","key","fetch","mode","credentials","catch","src","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","protocol","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","raw","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","parts","querySearch","shift","pathKey","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","manualPageview","defaultPageview","defaultNamespace","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue","detect404","inlineEvent","element","target","parentNode","isForm","tagName","button","tag","toLowerCase","attributes","submitter","button_text","textContent","trim","title","request","XMLHttpRequest","open","href","status","url","send","readyState"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"latest.source.js","sources":["latest.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n // Only initialize in a browser.\n if (!window) return;\n\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings;\n settings = assign(settings);\n\n if (logSettings) warn(\"Settings\", settings);\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n settings.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n settings[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n settings.strictUtm || attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData, keepalive) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n var imageUrl =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n\n // Events must survive navigation without taking over links or forms.\n if (keepalive && window.fetch) {\n try {\n window\n .fetch(imageUrl, {\n keepalive: trueVar,\n mode: \"no-cors\",\n credentials: \"omit\",\n })\n .catch(function () {\n image.src = imageUrl;\n });\n return;\n } catch (error) {}\n }\n image.src = imageUrl;\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n settings.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = settings.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(settings.collectDnt)\n ? settings.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n settings.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n settings.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n settings.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n settings.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n settings.nonUniqueHostnames || attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n settings.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n settings.metadataCollector || attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function (raw) {\n // Customers can overwrite their referrer, here we check for that\n var referrer =\n settings.referrer ||\n attr(scriptElement, \"referrer\") ||\n doc.referrer ||\n \"\";\n\n if (raw) return referrer;\n return (\n referrer\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch = \"\";\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n var pathKey = path + querySearch;\n if (!path || lastSendPath == pathKey) return;\n\n lastSendPath = pathKey;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // Only the first pageview can use a Cloudflare referrer as a unique arrival.\n page.unique =\n isPushState || userNavigated\n ? falseVar\n : !sameSite || (!pages && /[?&]__cf_/.test(getReferrer(trueVar)));\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n var manualPageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n window[namespace + \"_\" + pageviewText] = manualPageview;\n var defaultPageview = defaultNamespace + \"_\" + pageviewText;\n if (!window[defaultPageview]) window[defaultPageview] = manualPageview;\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw, keepalive) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback,\n undefinedVar,\n keepalive\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback, keepalive) {\n sendEvent(event, metadata, callback, keepalive);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n\n var inlineEvent = function (event) {\n var element = event.target;\n while (\n element &&\n element !== doc &&\n (!element.getAttribute || attr(element, \"simple-event\") === null)\n )\n element = element.parentNode;\n\n if (!element || element === doc) return;\n var isForm = element.tagName === \"FORM\";\n var name = attr(element, \"simple-event\");\n if (!name || isForm !== (event.type === \"submit\")) return;\n\n var metadata = { tag: element.tagName.toLowerCase() };\n var attributes = element.attributes;\n for (var i = 0; i < attributes.length; i++) {\n var attribute = attributes[i];\n if (attribute.name.indexOf(\"data-simple-event-\") === 0)\n metadata[attribute.name.slice(18).replace(/-/g, \"_\")] =\n attribute.value;\n }\n if (isForm) {\n var button = event.submitter;\n metadata.button_text = button\n ? (button.textContent || button.value || \"\")\n .replace(/\\s+/g, \" \")\n .trim()\n .slice(0, 200)\n : \"\";\n }\n sendEvent(name, metadata, undefinedVar, trueVar);\n };\n\n doc.addEventListener(\"click\", inlineEvent, falseVar);\n doc.addEventListener(\"submit\", inlineEvent, falseVar);\n\n // 404 confirmation adds a request, so existing installs must opt in.\n if (\n settings.detect404 === trueVar ||\n attr(scriptElement, \"detect-404\") == trueText\n ) {\n var detect404 = function () {\n if (\n !/\\b404\\b/.test(doc.title + \" \" + (doc.body && doc.body.textContent))\n )\n return;\n try {\n var request = new window.XMLHttpRequest();\n request.open(\"HEAD\", loc.href, trueVar);\n request.onload = function () {\n if (request.status === 404)\n sendEvent(\"page_404\", {\n url: loc.protocol + \"//\" + definedHostname + loc.pathname,\n status: 404,\n });\n };\n request.send();\n } catch (error) {}\n };\n if (doc.readyState === \"loading\")\n doc.addEventListener(\"DOMContentLoaded\", detect404, falseVar);\n else detect404();\n }\n } catch (e) {\n sendError(e);\n }\n})(\n typeof window != \"undefined\" && window,\n \"\",\n \"\",\n \"custom_latest_12\",\n \"sa\"\n);\n"],"names":["window","baseUrl","sendError","warn","type","orig","value","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","logSettings","settings","sa_settings","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","keepalive","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","imageUrl","keys","key","fetch","mode","credentials","catch","src","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","path","pathname","event","filename","message","timezone","start","scrolled","collectDnt","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","protocol","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","raw","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","parts","querySearch","shift","pathKey","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","rv","this","createEvent","initEvent","manualPageview","defaultPageview","defaultNamespace","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue","detect404","inlineEvent","element","target","parentNode","isForm","tagName","button","tag","toLowerCase","attributes","submitter","button_text","textContent","trim","title","request","XMLHttpRequest","open","href","status","url","send","readyState"],"mappings":"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"} \ No newline at end of file diff --git a/dist/latest/custom/light.js b/dist/latest/custom/light.js index 9aba4df4..a2ddf851 100644 --- a/dist/latest/custom/light.js +++ b/dist/latest/custom/light.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-15; 40ea; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-15; 5075; v12) */ -!function(f,e,t,m){try{var u=undefined,n="https:",r=f.console,a="doNotTrack",g=f.navigator,p=f.location,h=p.host,i=f.document,o=g.userAgent,c="Not sending request ",v=!1,s=encodeURIComponent,d=decodeURIComponent,l=JSON.stringify,y=f.addEventListener,_="https://"+t,b=(i.documentElement,"language"),w=g.userAgentData,O="platform",S="platformVersion",j="https://docs.simpleanalytics.com",k=/(bot|spider|crawl)/i.test(o)&&!/(cubot)/i.test(o),x=i.currentScript||i.querySelector('script[src*="'+t+'"]');m=function(){var e=[].slice.call(arguments);return e.unshift("Simple Analytics:"),Function.prototype.apply.call(r.warn,r,e)};var E=function(e){return"string"==typeof e},A=function(e,t){return e&&e.getAttribute("data-"+t)},$=function(){for(var e,t,n,r={},a=arguments,i=0;i>e/4).toString(16)})}catch(r){return e.replace(n,function(e){var t=16*Math.random()|0;return(e<2?t:3&t|8).toString(16)})}},N=function(e){return"function"==typeof e},R="namespace",U=e[R]||A(x,R)||"sa",V=e.strictUtm||"true"==A(x,"strict-utm"),B=U+"_loaded";if(1==f[B])return m(c+"twice");f.sa_event_loaded=!0,f[B]=!0;var C,H=function(t,e,n,r){t=n?t:$(J,M,t),g.brave&&!n&&(t.brave=!0),g._duckduckgoloader_&&!n&&(t.duck=!0);var a=new Image,i=_+"/simple.gif?"+Object.keys(t).filter(function(e){return t[e]!=u}).map(function(e){return s(e)+"="+s(t[e])}).join("&")+"&time="+Date.now();a.src=i},T=e.hostname||A(x,"hostname"),F=T||h,z={version:"custom_light_12",hostname:F};e.mode||A(x,"mode");try{C=Intl.DateTimeFormat().resolvedOptions().timeZone}catch(X){m(X)}k&&(z.bot=!0);var J=$(z,{ua:o,https:p.protocol==n,timezone:C,page_id:I(),session_id:I()});if(J.sri=!1,w&&(J.mobile=w.mobile,J.brands=l(w.brands)),F!==h&&(J.hostname_original=h),a in g&&"1"==g[a])return m("Not sending request when "+a+" is enabled. See "+j+"/dnt");-1!=h.indexOf(".")&&!/^[0-9.:]+$/.test(h)||T||m("Set hostname on "+h+". See "+j+"/overwrite-domain-name");var L,M={},P=(e.referrer||A(x,"referrer")||i.referrer||"").replace(h,F).replace(/^https?:\/\/((m|l|w{2,3}([0-9]+)?)\.)?([^?#]+)(.*)$/,"$4").replace(/^([^/]+)$/,"$1")||u,Z=function(e,t){var n=$(z,{type:"append",original_id:t?e:J.page_id});if(t||!g.sendBeacon)H(n,0,!0);else try{g.sendBeacon.bind(g)(_+"/append",l(n))}catch(r){H(n,0,!0)}};y("pagehide",Z,!1);var G,K,Q=function(e){var t="";try{t=e||d(p.pathname)}catch(X){m(X)}return t},W=function(e,t,n,r,a,i){e&&Z(""+J.page_id,!0),J.page_id=I();var o,c=F+Q(),s=(o=t,(r||p.search).slice(1).split("&").filter(function(e){return!o&&new RegExp("^((utm_)"+(V?"":"?")+"(source|medium|content|term|campaign)"+(V?"":"|ref")+")=","i").test(e)}).join("&")||u);H({id:J.page_id,type:"pageview",referrer:!t||n?P:null,query:s}),P=c,0};!function(e,t,n,r){!r&&N(n)&&(r=n);N(r);var a,i="";E(t)&&-1"); +!function(f,e,m){if(f)try{var u=undefined,t="https:",n=f.console,r="doNotTrack",g=f.navigator,p=f.location,h=p.host,i=f.document,a=g.userAgent,o="Not sending request ",v=!1,c=encodeURIComponent,s=decodeURIComponent,d=JSON.stringify,l=f.addEventListener,y="https://"+e,_=(i.documentElement,"language"),w=g.userAgentData,b="platform",O="platformVersion",S="https://docs.simpleanalytics.com",j=/(bot|spider|crawl)/i.test(a)&&!/(cubot)/i.test(a),k=i.currentScript||i.querySelector('script[src*="'+e+'"]');m=function(){var e=[].slice.call(arguments);return e.unshift("Simple Analytics:"),Function.prototype.apply.call(n.warn,n,e)};var x=function(e){return"string"==typeof e},E=function(e,t){return e&&e.getAttribute("data-"+t)},A=function(){for(var e,t,n,r={},i=arguments,a=0;a>e/4).toString(16)})}catch(r){return e.replace(n,function(e){var t=16*Math.random()|0;return(e<2?t:3&t|8).toString(16)})}},I=function(e){return"function"==typeof e},N="namespace",R=q[N]||E(k,N)||"sa",U=q.strictUtm||"true"==E(k,"strict-utm"),V=R+"_loaded";if(1==f[V])return m(o+"twice");f.sa_event_loaded=!0,f[V]=!0;var B,C=function(t,e,n,r){t=n?t:A(z,L,t),g.brave&&!n&&(t.brave=!0),g._duckduckgoloader_&&!n&&(t.duck=!0);var i=new Image,a=y+"/simple.gif?"+Object.keys(t).filter(function(e){return t[e]!=u}).map(function(e){return c(e)+"="+c(t[e])}).join("&")+"&time="+Date.now();i.src=a},H=q.hostname||E(k,"hostname"),T=H||h,F={version:"custom_light_12",hostname:T};q.mode||E(k,"mode");try{B=Intl.DateTimeFormat().resolvedOptions().timeZone}catch(W){m(W)}j&&(F.bot=!0);var z=A(F,{ua:a,https:p.protocol==t,timezone:B,page_id:D(),session_id:D()});if(z.sri=!1,w&&(z.mobile=w.mobile,z.brands=d(w.brands)),T!==h&&(z.hostname_original=h),r in g&&"1"==g[r])return m("Not sending request when "+r+" is enabled. See "+S+"/dnt");-1!=h.indexOf(".")&&!/^[0-9.:]+$/.test(h)||H||m("Set hostname on "+h+". See "+S+"/overwrite-domain-name");var J,L={},M=(q.referrer||E(k,"referrer")||i.referrer||"").replace(h,T).replace(/^https?:\/\/((m|l|w{2,3}([0-9]+)?)\.)?([^?#]+)(.*)$/,"$4").replace(/^([^/]+)$/,"$1")||u,P=function(e,t){var n=A(F,{type:"append",original_id:t?e:z.page_id});if(t||!g.sendBeacon)C(n,0,!0);else try{g.sendBeacon.bind(g)(y+"/append",d(n))}catch(r){C(n,0,!0)}};l("pagehide",P,!1);var Z,G,K=function(e){var t="";try{t=e||s(p.pathname)}catch(W){m(W)}return t},Q=function(e,t,n,r,i,a){e&&P(""+z.page_id,!0),z.page_id=D();var o,c=T+K(),s=(o=t,(r||p.search).slice(1).split("&").filter(function(e){return!o&&new RegExp("^((utm_)"+(U?"":"?")+"(source|medium|content|term|campaign)"+(U?"":"|ref")+")=","i").test(e)}).join("&")||u);C({id:z.page_id,type:"pageview",referrer:!t||n?M:null,query:s}),M=c,0};!function(e,t,n,r){!r&&I(n)&&(r=n);I(r);var i,a="";x(t)&&-1"); //# sourceMappingURL=light.js.map \ No newline at end of file diff --git a/dist/latest/custom/light.js.map b/dist/latest/custom/light.js.map index 0a3a27da..9e9d78ee 100644 --- a/dist/latest/custom/light.js.map +++ b/dist/latest/custom/light.js.map @@ -1 +1 @@ -{"version":3,"file":"light.source.js","sources":["light.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n\n var collectMetricByString = function (metricAbbreviation) {\n // eslint-disable-next-line no-unreachable\n return true;\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n if (ignore) return falseVar;\n // eslint-disable-next-line no-redeclare\n var regex =\n \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \")=\";\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n return q || undefinedVar;\n };\n\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData, keepalive) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n var imageUrl =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n\n image.src = imageUrl;\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n\n\n\n\n\n\n\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n // eslint-disable-next-line no-redeclare\n var bot = isBotAgent;\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function (raw) {\n // Customers can overwrite their referrer, here we check for that\n var referrer =\n overwriteOptions.referrer ||\n attr(scriptElement, \"referrer\") ||\n doc.referrer ||\n \"\";\n\n return (\n referrer\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n\n\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch = \"\";\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n var pathKey = path + querySearch;\n if (!path || lastSendPath == pathKey) return;\n\n lastSendPath = pathKey;\n page.path = path;\n\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n sameSite = referrer\n ? referrer.split(slash)[0] == locationHostname\n : falseVar;\n\n\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n\n\n pageview();\n\n } catch (e) {\n warn(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_light_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","warn","undefinedVar","undefined","https","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","language","documentElement","uaData","userAgentData","platformText","platformVersionText","docsUrl","isBotAgent","test","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","isString","string","attr","attribute","getAttribute","assign","obj","prop","object","to","arg","index","length","nextSource","constructor","Object","nextKey","hasOwnProperty","settings","sa_settings","logSettings","keys","Date","now","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","replace","c","getRandomValues","Uint8Array","toString","error","r","Math","random","isFunction","func","namespaceText","namespace","strictUtm","loadedVariable","sa_event_loaded","timezone","sendData","data","callback","onlyThisData","keepalive","payload","page","brave","_duckduckgoloader_","duck","image","Image","imageUrl","filter","key","map","join","src","overwrittenHostname","hostname","definedHostname","basePayload","version","mode","Intl","DateTimeFormat","resolvedOptions","timeZone","bot","ua","protocol","page_id","session_id","sri","mobile","brands","hostname_original","indexOf","lastSendPath","referrer","sendOnLeave","id","push","append","type","original_id","sendBeacon","bind","e","sameSite","userNavigated","getPath","overwrite","path","pathname","sendPageView","isPushState","deleteSourceInfo","search","metadata","ignoreSource","currentPage","query","split","keyValue","RegExp","pages","pathOverwrite","callbackRaw","parts","querySearch","shift","pathKey","performaceEntryType","perf","performance","navigationText","getEntriesByType","triggerSendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","pageview"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"light.source.js","sources":["light.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n // Only initialize in a browser.\n if (!window) return;\n\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings;\n settings = assign(settings);\n\n if (logSettings) warn(\"Settings\", settings);\n\n\n var collectMetricByString = function (metricAbbreviation) {\n // eslint-disable-next-line no-unreachable\n return true;\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n settings[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n settings.strictUtm || attr(scriptElement, \"strict-utm\") == trueText;\n\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n if (ignore) return falseVar;\n // eslint-disable-next-line no-redeclare\n var regex =\n \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \")=\";\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n return q || undefinedVar;\n };\n\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData, keepalive) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n var imageUrl =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n\n image.src = imageUrl;\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n settings.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = settings.mode || attr(scriptElement, \"mode\");\n\n\n\n\n\n\n\n\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n // eslint-disable-next-line no-redeclare\n var bot = isBotAgent;\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function (raw) {\n // Customers can overwrite their referrer, here we check for that\n var referrer =\n settings.referrer ||\n attr(scriptElement, \"referrer\") ||\n doc.referrer ||\n \"\";\n\n return (\n referrer\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n\n\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch = \"\";\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n var pathKey = path + querySearch;\n if (!path || lastSendPath == pathKey) return;\n\n lastSendPath = pathKey;\n page.path = path;\n\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n sameSite = referrer\n ? referrer.split(slash)[0] == locationHostname\n : falseVar;\n\n\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n\n\n pageview();\n\n } catch (e) {\n warn(e);\n }\n})(\n typeof window != \"undefined\" && window,\n \"\",\n \"\",\n \"custom_light_12\",\n \"sa\"\n);\n"],"names":["window","baseUrl","warn","undefinedVar","undefined","https","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","language","documentElement","uaData","userAgentData","platformText","platformVersionText","docsUrl","isBotAgent","test","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","isString","string","attr","attribute","getAttribute","assign","obj","prop","object","to","arg","index","length","nextSource","constructor","Object","nextKey","hasOwnProperty","logSettings","settings","sa_settings","Date","now","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","replace","c","getRandomValues","Uint8Array","toString","error","r","Math","random","isFunction","func","namespaceText","namespace","strictUtm","loadedVariable","sa_event_loaded","timezone","sendData","data","callback","onlyThisData","keepalive","payload","page","brave","_duckduckgoloader_","duck","image","Image","imageUrl","keys","filter","key","map","join","src","overwrittenHostname","hostname","definedHostname","basePayload","version","mode","Intl","DateTimeFormat","resolvedOptions","timeZone","bot","ua","protocol","page_id","session_id","sri","mobile","brands","hostname_original","indexOf","lastSendPath","referrer","sendOnLeave","id","push","append","type","original_id","sendBeacon","bind","e","sameSite","userNavigated","getPath","overwrite","path","pathname","sendPageView","isPushState","deleteSourceInfo","search","metadata","ignoreSource","currentPage","query","split","keyValue","RegExp","pages","pathOverwrite","callbackRaw","parts","querySearch","shift","pathKey","performaceEntryType","perf","performance","navigationText","getEntriesByType","triggerSendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","pageview"],"mappings":";;CAEA,SACEA,EACAC,EAKAC,GAGA,GAAKF,EAEL,IAQE,IAAIG,EAAeC,UAIfC,EAAQ,SAKRC,EAAMN,EAAOO,QACbC,EAAa,aACbC,EAAMT,EAAOU,UACbC,EAAMX,EAAOY,SACbC,EAAmBF,EAAIG,KACvBC,EAAMf,EAAOgB,SACbC,EAAYR,EAAIQ,UAChBC,EAAa,uBAEbC,GAhBW,EAiBXC,EAAyBC,mBACzBC,EAAyBC,mBACzBC,EAAYC,KAAKD,UAEjBE,EAAuB1B,EAAO2B,iBAC9BC,EAhBWvB,WAgB4BJ,EAEvC4B,GADkBd,EAAIe,gBACX,YAIXC,EAAStB,EAAIuB,cAMbC,EAAe,WACfC,EAAsB,kBACtBC,EAAU,mCAEVC,EACF,sBAAsBC,KAAKpB,KAAe,WAAWoB,KAAKpB,GAGxDqB,EACFvB,EAAIwB,eAAiBxB,EAAIyB,cAAc,gBAAkBvC,EAAU,MAOrEC,EAAO,WAEL,IAAIuC,EAAO,GAAGC,MAAMC,KAAKC,WAOzB,OAJAH,EAAKI,QAAQ,qBAINC,SAASC,UAAUC,MAAML,KAAKrC,EAAIJ,KAAMI,EAAKmC,IAGtD,IAQIQ,EAAW,SAAUC,GACvB,MAAwB,iBAAVA,GAOZC,EAAO,SAAUb,EAAec,GAClC,OAAOd,GAAiBA,EAAce,aAAa,QAAUD,IAe3DE,EAAS,WAGX,IAFA,IA7BsBC,EAAKC,EAwBJC,EAKnBC,EAAK,GACLC,EAAMf,UACDgB,EAAQ,EAAGA,EAAQD,EAAIE,OAAQD,IAAS,CAC/C,IAAIE,EAAaH,EAAIC,GACrB,IATqBH,EASRK,IAREL,EAAOM,cAAgBC,OASpC,IAAK,IAAIC,KAAWH,EAlCFP,EAmCJO,EAnCSN,EAmCGS,EAlCvBD,OAAOjB,UAAUmB,eAAevB,KAAKY,EAAKC,KAmCzCE,EAAGO,GAAWH,EAAWG,IAKjC,OAAOP,GAILS,EADAC,EAAWpE,EAAOqE,YAEtBD,EAAWd,EAAOc,GAEdD,GAAajE,EAAK,WAAYkE,GAQxBE,KAAKC,IALf,IAOIC,EAAO,WACT,IAAIC,EAAezE,EAAO0E,QAAU1E,EAAO2E,SACvCC,EAAY,CAAC,MAAQ,KAAO,KAAO,KAAO,KAC1CC,EAAY,SAEhB,IACE,OAAOD,EAAUE,QAAQD,EAAW,SAAUE,GAC5C,OACEA,EACCN,EAAaO,gBAAgB,IAAIC,WAAW,IAAI,GAC9C,IAAOF,EAAI,GACdG,SAAS,MAEb,MAAOC,GACP,OAAOP,EAAUE,QAAQD,EAAW,SAAUE,GAC5C,IAAIK,EAAqB,GAAhBC,KAAKC,SAAiB,EAE/B,OADMP,EAAI,EAAIK,EAAS,EAAJA,EAAW,GACrBF,SAAS,QAKpBK,EAAa,SAAUC,GACzB,MAAsB,mBAARA,GAIZC,EAAgB,YAChBC,EACFtB,EAASqB,IACTtC,EAAKb,EAAemD,IAmaxB,KAzZME,EACFvB,EAASuB,WApKI,QAoKSxC,EAAKb,EAAe,cAoCxCsD,EAAiBF,EAAY,UACjC,GA3Mc,GA2MV1F,EAAO4F,GAA4B,OAAO1F,EAAKgB,EAAa,SAChElB,EAAO6F,iBA5MO,EA6Md7F,EAAO4F,IA7MO,EAoNd,IA8DIE,EA9DAC,EAAW,SAAUC,EAAMC,EAAUC,EAAcC,GACrDH,EAAOE,EAAeF,EAAO1C,EAAO8C,EAASC,EAAML,GAE/CvF,EAAI6F,QAAUJ,IAAcF,EAAKM,OAvNzB,GAwNR7F,EAAI8F,qBAAuBL,IAAcF,EAAKQ,MAxNtC,GA2NZ,IAAIC,EAAQ,IAAIC,MACZC,EACF/E,EACA,eACAoC,OAAO4C,KAAKZ,GACTa,OAAO,SAAUC,GAChB,OAAOd,EAAKc,IAAQ3G,IAErB4G,IAAI,SAAUD,GACb,OACE1F,EAAuB0F,GACvB,IACA1F,EAAuB4E,EAAKc,MAG/BE,KAAK,KACR,SACA1C,KAAKC,MAEPkC,EAAMQ,IAAMN,GAIVO,EACF9C,EAAS+C,UAAYhE,EAAKb,EAAe,YACvC8E,EAAkBF,GAAuBrG,EAEzCwG,EAAc,CAChBC,QAsUJ,kBArUIH,SAAUC,GAeDhD,EAASmD,MAAQpE,EAAKb,EAAe,QAYhD,IAEEwD,EACI0B,KAAKC,iBAAiBC,kBAAkBC,SAE5C,MAAOxC,GACPjF,EAAKiF,GAQG/C,IAMDiF,EAAYO,KAvSP,GAySd,IAAIxB,EAAU9C,EAAO+D,EAAa,CAEhCQ,GAAkC5G,EAElCZ,MAAOM,EAAImH,UAAYzH,EACvByF,SAAUA,EACViC,QAA8BvD,IAG9BwD,WAA0CxD,MAwB5C,GArBA4B,EAAQ6B,KApTO,EAwTXlG,IACFqE,EAAQ8B,OAASnG,EAAOmG,OACxB9B,EAAQ+B,OAAS3G,EAAUO,EAAOoG,SAWhCf,IAAoBvG,IACtBuF,EAAQgC,kBAAoBvH,GAG1BL,KAAcC,GAA0B,KAAnBA,EAAID,GAC3B,OAAON,EA3TYgB,4BA4TAV,EAAa,oBAAsB2B,EAAU,SAK7B,GAAlCtB,EAAiBwH,QAAQ,OACxB,aAAahG,KAAKxB,IACnBqG,GAEDhH,EACE,mBACEW,EACA,SACAsB,EACA,0BAON,IACImG,EADAjC,EAAO,GAoBPkC,GAdAnE,EAASmE,UACTpF,EAAKb,EAAe,aACpBvB,EAAIwH,UACJ,IAIGzD,QAAQjE,EAAkBuG,GAC1BtC,QAAQ,sDAAuD,MAC/DA,QAAQ,YAAa,OAAS3E,EAcjCqI,EAAc,SAAUC,EAAIC,GAG9B,IAAIC,EAASrF,EAAO+D,EAAa,CAC/BuB,KAAM,SACNC,YAAaH,EAAOD,EAAKrC,EAAQ2B,UAKnC,GAAIW,IAASjI,EAAIqI,WAEf/C,EAAS4C,EAAQxI,GA1YP,QA4YV,IACEM,EAAIqI,WAAWC,KAAKtI,EAApBA,CAAyBmB,EAAa,UAAWJ,EAAUmH,IAC3D,MAAOK,GAEPjD,EAAS4C,EAAQxI,GAhZT,KAsZduB,EApXe,WAoXgB8G,GArZhB,GA4Zf,IAmDIS,EAAUC,EAnDVC,EAAU,SAAUC,GACtB,IAAIC,EAAO,GAIX,IACEA,EAAOD,GAAa9H,EAAuBX,EAAI2I,UAC/C,MAAOnE,GACPjF,EAAKiF,GAMP,OAAOkE,GAMLE,EAAe,SACjBC,EACAC,EACAR,EACAS,EACAC,EACA1D,GAEIuD,GAAahB,EAAY,GAAKpC,EAAQ2B,SAzb9B,GA0bY3B,EAAQ2B,QAAUvD,IAE1C,IAnR6BoF,EAmRzBC,EAAczC,EAAkB+B,IAChCW,GApRyBF,EAoRFH,GAAkBC,GAnRjB/I,EAAI+I,QAC7BhH,MAAM,GACNqH,MAAM,KACNlD,OAAO,SAAUmD,GAIhB,OAFaJ,GAaN,IAAIK,OART,YACCtE,EAAY,GAAK,KAClB,yCACCA,EAAY,GAAK,QAClB,KAIuB,KAAKtD,KAAK2H,KAEpChD,KAAK,MAEI7G,GA+PZ4F,EACE,CACE0C,GAAIrC,EAAQ2B,QACZa,KA9ba,WA+bbL,UAAWkB,GAAoBR,EAAWV,EAAW,KACrDuB,MAAOA,IAOXvB,EAAWsB,EAEXK,IAKa,SACbV,EACAW,EACAR,EACAS,IAEKA,GAAe7E,EAAWoE,KAAWS,EAAcT,GACzCpE,EAAW6E,GAA1B,IAIMC,EAHFC,EAAc,GACdrH,EAASkH,KAAgD,EAA9BA,EAAc9B,QAAQ,OAGnD8B,GADIE,EAAQF,EAAcJ,MAAM,MACVQ,QACtBD,EAAc,IAAMD,EAAMrD,KAAK,MAGjC,IAAIqC,EAAOF,EAAQgB,GAGfK,EAAUnB,EAAOiB,EACrB,GAAKjB,GAAQf,GAAgBkC,EAA7B,CAEAlC,EAAekC,EACfnE,EAAKgD,KAAOA,EAKN5I,EAAIoB,KAAWwE,EAAKxE,GAAYpB,EAAIoB,IAK1C,IAII4I,EAJAC,EAAO1K,EAAO2K,YACdC,EAAiB,aAIrB,IACEH,EAAsBC,EAAKG,iBAAiBD,GAAgB,GAAGhC,KAC/D,MAAOzD,GACPjF,EAAKiF,GAGP+D,EAAgBuB,GAC+C,EAA3D,CAAC,SAAU,gBAAgBpC,QAAQoC,GAGnCC,GACAA,EAAKE,KACwC,EAA7C,CAAC,EAAG,GAAGvC,QAAQqC,EAAKE,GAAgBhC,MAGxCK,IAAWV,GACPA,EAASwB,MAlgBH,KAkgBgB,IAAMlJ,EAKhC,IAAIiK,EAAsB,WACxB3J,GA9gBU,EAihBVoI,EACEC,EAFAA,GAAeN,IAAiB,EAIhCD,EACAqB,IAMJ,GAAKnJ,EAmBH2J,SAjBA,IACM/I,GAAUwD,EAAWxD,EAAOgJ,sBAC9BhJ,EACGgJ,qBAAqB,CAAC9I,EAAcC,IACpC8I,KAAK,SAAUC,GACd7E,EAAQ8E,QAAUD,EAAkBhJ,GACpCmE,EAAQ+E,WAAaF,EAAkB/I,GACvC4I,MAEDM,SAAMN,GAETA,IAEF,MAAO9B,GACP8B,MASNO,GAEA,MAAOrC,GACP9I,EAAK8I,IA5kBT,CA+kBmB,oBAAVhJ,QAAyBA,OAChC"} \ No newline at end of file diff --git a/dist/latest/custom/proxy.js b/dist/latest/custom/proxy.js index 6a7b7e19..b88a2a7f 100644 --- a/dist/latest/custom/proxy.js +++ b/dist/latest/custom/proxy.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-15; b3bb; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-15; 8624; v12) */ -!function(v,n,e,r,m){try{var g=undefined,y=!0,_=!1,t="true",a="https:",b="pageview",l="event",i="error",o=v.console,c="doNotTrack",w=v.navigator,s=v.location,x=s.host,u=v.document,f=w.userAgent,p="Not sending request ",d=p+"when ",O=_,h=encodeURIComponent,E=decodeURIComponent,M=JSON.stringify,S=v.addEventListener,k="https://"+e,A=u.documentElement||{},q="language",C="Height",D="scroll",$=w.userAgentData,j=D+C,H="offset"+C,R="client"+C,L="pagehide",N="platform",P="platformVersion",T="https://docs.simpleanalytics.com",U=0,I=/(bot|spider|crawl)/i.test(f)&&!/(cubot)/i.test(f),V=v.screen,B=u.currentScript||u.querySelector('script[src*="'+e+'"]');m=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){m("Error in your "+t+" function:",e)},z=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},W=function(t){return"string"==typeof t},G=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},J=function(t,e){return t&&t.getAttribute("data-"+e)},X=function(t){return Array.isArray(t)?t:W(t)&&t.length?t.split(/, ?/):[]},Y=function(t){return t&&t.constructor===Object},Z=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},it=function(t){return"function"==typeof t},ot="namespace",ct=n[ot]||J(B,ot)||"sa",st=function(t,e){var n=v[ct+"_metadata"];Y(n)&&(t=Z(t,n));var r=v[kt];if(!it(r))return kt&&m(kt+" not found, set window."+kt),t;try{return Z(t,r.call(v,Z(t,e)))}catch(a){F("metadata",a)}},ut=n.strictUtm||J(B,"strict-utm")==t,lt=function(i,t){tt=!i&&nt("q")?"":_;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");tt!==_&&0"); +!function(v,e,n,m){var r,a,t;if(v)try{var g=undefined,y=!0,_=!1,i="true",o="https:",w="pageview",l="event",c="error",s=v.console,u="doNotTrack",b=v.navigator,f=v.location,x=f.host,p=v.document,d=b.userAgent,h="Not sending request ",E=h+"when ",O=_,M=encodeURIComponent,S=decodeURIComponent,k=JSON.stringify,A=v.addEventListener,q="https://"+e,C=p.documentElement||{},D="language",$="Height",H="scroll",R=b.userAgentData,j=H+$,L="offset"+$,N="client"+$,P="pagehide",T="platform",U="platformVersion",I="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(d)&&!/(cubot)/i.test(d),F=v.screen,z=p.currentScript||p.querySelector('script[src*="'+e+'"]');m=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(s.warn,s,t)};var W=function(t,e){m("Error in your "+t+" function:",e)},G=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},J=function(t){return"string"==typeof t},X=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},Y=function(t,e){return t&&t.getAttribute("data-"+e)},Z=function(t){return Array.isArray(t)?t:J(t)&&t.length?t.split(/, ?/):[]},K=function(t){return t&&t.constructor===Object},Q=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},ct=function(t){return"function"==typeof t},st="namespace",ut=et[st]||Y(z,st)||"sa",lt=function(t,e){var n=v[ut+"_metadata"];K(n)&&(t=Q(t,n));var r=v[qt];if(!ct(r))return qt&&m(qt+" not found, set window."+qt),t;try{return Q(t,r.call(v,Q(t,e)))}catch(a){W("metadata",a)}},ft=et.strictUtm||Y(z,"strict-utm")==i,pt=function(i,t){nt=!i&&at("q")?"":_;var e=(t||f.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");nt!==_&&0"); //# sourceMappingURL=proxy.js.map \ No newline at end of file diff --git a/dist/latest/custom/proxy.js.map b/dist/latest/custom/proxy.js.map index 99a2a133..0778ab95 100644 --- a/dist/latest/custom/proxy.js.map +++ b/dist/latest/custom/proxy.js.map @@ -1 +1 @@ -{"version":3,"file":"proxy.source.js","sources":["proxy.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData, keepalive) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n var imageUrl =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n\n // Events must survive navigation without taking over links or forms.\n if (keepalive && window.fetch) {\n try {\n window\n .fetch(imageUrl, {\n keepalive: trueVar,\n mode: \"no-cors\",\n credentials: \"omit\",\n })\n .catch(function () {\n image.src = imageUrl;\n });\n return;\n } catch (error) {}\n }\n image.src = imageUrl;\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function (raw) {\n // Customers can overwrite their referrer, here we check for that\n var referrer =\n overwriteOptions.referrer ||\n attr(scriptElement, \"referrer\") ||\n doc.referrer ||\n \"\";\n\n if (raw) return referrer;\n return (\n referrer\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch = \"\";\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n var pathKey = path + querySearch;\n if (!path || lastSendPath == pathKey) return;\n\n lastSendPath = pathKey;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // Only the first pageview can use a Cloudflare referrer as a unique arrival.\n page.unique =\n isPushState || userNavigated\n ? falseVar\n : !sameSite || (!pages && /[?&]__cf_/.test(getReferrer(trueVar)));\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n var manualPageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n window[namespace + \"_\" + pageviewText] = manualPageview;\n var defaultPageview = defaultNamespace + \"_\" + pageviewText;\n if (!window[defaultPageview]) window[defaultPageview] = manualPageview;\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw, keepalive) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback,\n undefinedVar,\n keepalive\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback, keepalive) {\n sendEvent(event, metadata, callback, keepalive);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n\n var inlineEvent = function (event) {\n var element = event.target;\n while (\n element &&\n element !== doc &&\n (!element.getAttribute || attr(element, \"simple-event\") === null)\n )\n element = element.parentNode;\n\n if (!element || element === doc) return;\n var isForm = element.tagName === \"FORM\";\n var name = attr(element, \"simple-event\");\n if (!name || isForm !== (event.type === \"submit\")) return;\n\n var metadata = { tag: element.tagName.toLowerCase() };\n var attributes = element.attributes;\n for (var i = 0; i < attributes.length; i++) {\n var attribute = attributes[i];\n if (attribute.name.indexOf(\"data-simple-event-\") === 0)\n metadata[attribute.name.slice(18).replace(/-/g, \"_\")] =\n attribute.value;\n }\n if (isForm) {\n var button = event.submitter;\n metadata.button_text = button\n ? (button.textContent || button.value || \"\")\n .replace(/\\s+/g, \" \")\n .trim()\n .slice(0, 200)\n : \"\";\n }\n sendEvent(name, metadata, undefinedVar, trueVar);\n };\n\n doc.addEventListener(\"click\", inlineEvent, falseVar);\n doc.addEventListener(\"submit\", inlineEvent, falseVar);\n\n // 404 confirmation adds a request, so existing installs must opt in.\n if (\n overwriteOptions.detect404 === trueVar ||\n attr(scriptElement, \"detect-404\") == trueText\n ) {\n var detect404 = function () {\n if (\n !/\\b404\\b/.test(doc.title + \" \" + (doc.body && doc.body.textContent))\n )\n return;\n try {\n var request = new window.XMLHttpRequest();\n request.open(\"HEAD\", loc.href, trueVar);\n request.onload = function () {\n if (request.status === 404)\n sendEvent(\"page_404\", {\n url: loc.protocol + \"//\" + definedHostname + loc.pathname,\n status: 404,\n });\n };\n request.send();\n } catch (error) {}\n };\n if (doc.readyState === \"loading\")\n doc.addEventListener(\"DOMContentLoaded\", detect404, falseVar);\n else detect404();\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_proxy_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","keepalive","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","imageUrl","key","fetch","mode","credentials","catch","src","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","protocol","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","raw","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","parts","querySearch","shift","pathKey","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","manualPageview","defaultPageview","defaultNamespace","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue","detect404","inlineEvent","element","target","parentNode","isForm","tagName","button","tag","toLowerCase","attributes","submitter","button_text","textContent","trim","title","request","XMLHttpRequest","open","href","status","url","send","readyState"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"proxy.source.js","sources":["proxy.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n // Only initialize in a browser.\n if (!window) return;\n\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings;\n settings = assign(settings);\n\n if (logSettings) warn(\"Settings\", settings);\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n settings.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n settings[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n settings.strictUtm || attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData, keepalive) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n var imageUrl =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n\n // Events must survive navigation without taking over links or forms.\n if (keepalive && window.fetch) {\n try {\n window\n .fetch(imageUrl, {\n keepalive: trueVar,\n mode: \"no-cors\",\n credentials: \"omit\",\n })\n .catch(function () {\n image.src = imageUrl;\n });\n return;\n } catch (error) {}\n }\n image.src = imageUrl;\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n settings.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = settings.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(settings.collectDnt)\n ? settings.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n settings.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n settings.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n settings.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n settings.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n settings.nonUniqueHostnames || attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n settings.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n settings.metadataCollector || attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function (raw) {\n // Customers can overwrite their referrer, here we check for that\n var referrer =\n settings.referrer ||\n attr(scriptElement, \"referrer\") ||\n doc.referrer ||\n \"\";\n\n if (raw) return referrer;\n return (\n referrer\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch = \"\";\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n var pathKey = path + querySearch;\n if (!path || lastSendPath == pathKey) return;\n\n lastSendPath = pathKey;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // Only the first pageview can use a Cloudflare referrer as a unique arrival.\n page.unique =\n isPushState || userNavigated\n ? falseVar\n : !sameSite || (!pages && /[?&]__cf_/.test(getReferrer(trueVar)));\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n var manualPageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n window[namespace + \"_\" + pageviewText] = manualPageview;\n var defaultPageview = defaultNamespace + \"_\" + pageviewText;\n if (!window[defaultPageview]) window[defaultPageview] = manualPageview;\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw, keepalive) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback,\n undefinedVar,\n keepalive\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback, keepalive) {\n sendEvent(event, metadata, callback, keepalive);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n\n var inlineEvent = function (event) {\n var element = event.target;\n while (\n element &&\n element !== doc &&\n (!element.getAttribute || attr(element, \"simple-event\") === null)\n )\n element = element.parentNode;\n\n if (!element || element === doc) return;\n var isForm = element.tagName === \"FORM\";\n var name = attr(element, \"simple-event\");\n if (!name || isForm !== (event.type === \"submit\")) return;\n\n var metadata = { tag: element.tagName.toLowerCase() };\n var attributes = element.attributes;\n for (var i = 0; i < attributes.length; i++) {\n var attribute = attributes[i];\n if (attribute.name.indexOf(\"data-simple-event-\") === 0)\n metadata[attribute.name.slice(18).replace(/-/g, \"_\")] =\n attribute.value;\n }\n if (isForm) {\n var button = event.submitter;\n metadata.button_text = button\n ? (button.textContent || button.value || \"\")\n .replace(/\\s+/g, \" \")\n .trim()\n .slice(0, 200)\n : \"\";\n }\n sendEvent(name, metadata, undefinedVar, trueVar);\n };\n\n doc.addEventListener(\"click\", inlineEvent, falseVar);\n doc.addEventListener(\"submit\", inlineEvent, falseVar);\n\n // 404 confirmation adds a request, so existing installs must opt in.\n if (\n settings.detect404 === trueVar ||\n attr(scriptElement, \"detect-404\") == trueText\n ) {\n var detect404 = function () {\n if (\n !/\\b404\\b/.test(doc.title + \" \" + (doc.body && doc.body.textContent))\n )\n return;\n try {\n var request = new window.XMLHttpRequest();\n request.open(\"HEAD\", loc.href, trueVar);\n request.onload = function () {\n if (request.status === 404)\n sendEvent(\"page_404\", {\n url: loc.protocol + \"//\" + definedHostname + loc.pathname,\n status: 404,\n });\n };\n request.send();\n } catch (error) {}\n };\n if (doc.readyState === \"loading\")\n doc.addEventListener(\"DOMContentLoaded\", detect404, falseVar);\n else detect404();\n }\n } catch (e) {\n sendError(e);\n }\n})(\n typeof window != \"undefined\" && window,\n \"\",\n \"\",\n \"custom_proxy_12\",\n \"sa\"\n);\n"],"names":["window","baseUrl","sendError","warn","type","orig","value","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","logSettings","settings","sa_settings","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","keepalive","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","imageUrl","keys","key","fetch","mode","credentials","catch","src","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","path","pathname","event","filename","message","timezone","start","scrolled","collectDnt","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","protocol","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","raw","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","parts","querySearch","shift","pathKey","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","rv","this","createEvent","initEvent","manualPageview","defaultPageview","defaultNamespace","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue","detect404","inlineEvent","element","target","parentNode","isForm","tagName","button","tag","toLowerCase","attributes","submitter","button_text","textContent","trim","title","request","XMLHttpRequest","open","href","status","url","send","readyState"],"mappings":"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"} \ No newline at end of file diff --git a/dist/latest/hello.js b/dist/latest/hello.js index e0577574..05857b8b 100644 --- a/dist/latest/hello.js +++ b/dist/latest/hello.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-15; 62ae) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-15; 9ce0) */ -!function(v,n,e,r,m){try{var g=undefined,y=!0,_=!1,t="true",a="https:",b="pageview",l="event",i="error",o=v.console,c="doNotTrack",w=v.navigator,s=v.location,O=s.host,u=v.document,f=w.userAgent,p="Not sending request ",d=p+"when ",E=_,h=encodeURIComponent,x=decodeURIComponent,M=JSON.stringify,S=v.addEventListener,k="https://queue."+e,q=u.documentElement||{},A="language",C="Height",D="scroll",$=w.userAgentData,j=D+C,R="offset"+C,H="client"+C,L="pagehide",N="platform",P="platformVersion",T="https://docs.simpleanalytics.com",U=0,I=/(bot|spider|crawl)/i.test(f)&&!/(cubot)/i.test(f),V=v.screen,B=u.currentScript||u.querySelector('script[src*="'+e+'"]');m=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){m("Error in your "+t+" function:",e)},z=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},W=function(t){return"string"==typeof t},G=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},J=function(t,e){return t&&t.getAttribute("data-"+e)},X=function(t){return Array.isArray(t)?t:W(t)&&t.length?t.split(/, ?/):[]},Y=function(t){return t&&t.constructor===Object},Z=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},it=function(t){return"function"==typeof t},ot="namespace",ct=n[ot]||J(B,ot)||"sa",st=function(t,e){var n=v[ct+"_metadata"];Y(n)&&(t=Z(t,n));var r=v[kt];if(!it(r))return kt&&m(kt+" not found, set window."+kt),t;try{return Z(t,r.call(v,Z(t,e)))}catch(a){F("metadata",a)}},ut=n.strictUtm||J(B,"strict-utm")==t,lt=function(i,t){tt=!i&&nt("q")?"":_;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");tt!==_&&0>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},ct=function(t){return"function"==typeof t},st="namespace",ut=et[st]||Y(z,st)||"sa",lt=function(t,e){var n=m[ut+"_metadata"];K(n)&&(t=Q(t,n));var r=m[At];if(!ct(r))return At&&v(At+" not found, set window."+At),t;try{return Q(t,r.call(m,Q(t,e)))}catch(a){W("metadata",a)}},ft=et.strictUtm||Y(z,"strict-utm")==i,dt=function(i,t){nt=!i&&at("q")?"":_;var e=(t||f.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");nt!==_&&0> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData, keepalive) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n var imageUrl =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n\n // Events must survive navigation without taking over links or forms.\n if (keepalive && window.fetch) {\n try {\n window\n .fetch(imageUrl, {\n keepalive: trueVar,\n mode: \"no-cors\",\n credentials: \"omit\",\n })\n .catch(function () {\n image.src = imageUrl;\n });\n return;\n } catch (error) {}\n }\n image.src = imageUrl;\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function (raw) {\n // Customers can overwrite their referrer, here we check for that\n var referrer =\n overwriteOptions.referrer ||\n attr(scriptElement, \"referrer\") ||\n doc.referrer ||\n \"\";\n\n if (raw) return referrer;\n return (\n referrer\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch = \"\";\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n var pathKey = path + querySearch;\n if (!path || lastSendPath == pathKey) return;\n\n lastSendPath = pathKey;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // Only the first pageview can use a Cloudflare referrer as a unique arrival.\n page.unique =\n isPushState || userNavigated\n ? falseVar\n : !sameSite || (!pages && /[?&]__cf_/.test(getReferrer(trueVar)));\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n var manualPageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n window[namespace + \"_\" + pageviewText] = manualPageview;\n var defaultPageview = defaultNamespace + \"_\" + pageviewText;\n if (!window[defaultPageview]) window[defaultPageview] = manualPageview;\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw, keepalive) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback,\n undefinedVar,\n keepalive\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback, keepalive) {\n sendEvent(event, metadata, callback, keepalive);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n\n var inlineEvent = function (event) {\n var element = event.target;\n while (\n element &&\n element !== doc &&\n (!element.getAttribute || attr(element, \"simple-event\") === null)\n )\n element = element.parentNode;\n\n if (!element || element === doc) return;\n var isForm = element.tagName === \"FORM\";\n var name = attr(element, \"simple-event\");\n if (!name || isForm !== (event.type === \"submit\")) return;\n\n var metadata = { tag: element.tagName.toLowerCase() };\n var attributes = element.attributes;\n for (var i = 0; i < attributes.length; i++) {\n var attribute = attributes[i];\n if (attribute.name.indexOf(\"data-simple-event-\") === 0)\n metadata[attribute.name.slice(18).replace(/-/g, \"_\")] =\n attribute.value;\n }\n if (isForm) {\n var button = event.submitter;\n metadata.button_text = button\n ? (button.textContent || button.value || \"\")\n .replace(/\\s+/g, \" \")\n .trim()\n .slice(0, 200)\n : \"\";\n }\n sendEvent(name, metadata, undefinedVar, trueVar);\n };\n\n doc.addEventListener(\"click\", inlineEvent, falseVar);\n doc.addEventListener(\"submit\", inlineEvent, falseVar);\n\n // 404 confirmation adds a request, so existing installs must opt in.\n if (\n overwriteOptions.detect404 === trueVar ||\n attr(scriptElement, \"detect-404\") == trueText\n ) {\n var detect404 = function () {\n if (\n !/\\b404\\b/.test(doc.title + \" \" + (doc.body && doc.body.textContent))\n )\n return;\n try {\n var request = new window.XMLHttpRequest();\n request.open(\"HEAD\", loc.href, trueVar);\n request.onload = function () {\n if (request.status === 404)\n sendEvent(\"page_404\", {\n url: loc.protocol + \"//\" + definedHostname + loc.pathname,\n status: 404,\n });\n };\n request.send();\n } catch (error) {}\n };\n if (doc.readyState === \"loading\")\n doc.addEventListener(\"DOMContentLoaded\", detect404, falseVar);\n else detect404();\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"simpleanalyticscdn.com\",\n \"queue.\",\n \"cdn_hello_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","protocol","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","keepalive","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","imageUrl","key","fetch","mode","credentials","catch","src","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","raw","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","parts","querySearch","shift","pathKey","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","manualPageview","defaultPageview","defaultNamespace","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue","detect404","inlineEvent","element","target","parentNode","isForm","tagName","button","tag","toLowerCase","attributes","submitter","button_text","textContent","trim","title","request","XMLHttpRequest","open","href","status","url","send","readyState"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"hello.source.js","sources":["hello.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n // Only initialize in a browser.\n if (!window) return;\n\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings;\n settings = assign(settings);\n\n if (logSettings) warn(\"Settings\", settings);\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n settings.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n settings[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n settings.strictUtm || attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData, keepalive) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n var imageUrl =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n\n // Events must survive navigation without taking over links or forms.\n if (keepalive && window.fetch) {\n try {\n window\n .fetch(imageUrl, {\n keepalive: trueVar,\n mode: \"no-cors\",\n credentials: \"omit\",\n })\n .catch(function () {\n image.src = imageUrl;\n });\n return;\n } catch (error) {}\n }\n image.src = imageUrl;\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n settings.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = settings.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(settings.collectDnt)\n ? settings.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n settings.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n settings.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n settings.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n settings.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n settings.nonUniqueHostnames || attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n settings.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n settings.metadataCollector || attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function (raw) {\n // Customers can overwrite their referrer, here we check for that\n var referrer =\n settings.referrer ||\n attr(scriptElement, \"referrer\") ||\n doc.referrer ||\n \"\";\n\n if (raw) return referrer;\n return (\n referrer\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch = \"\";\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n var pathKey = path + querySearch;\n if (!path || lastSendPath == pathKey) return;\n\n lastSendPath = pathKey;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // Only the first pageview can use a Cloudflare referrer as a unique arrival.\n page.unique =\n isPushState || userNavigated\n ? falseVar\n : !sameSite || (!pages && /[?&]__cf_/.test(getReferrer(trueVar)));\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n var manualPageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n window[namespace + \"_\" + pageviewText] = manualPageview;\n var defaultPageview = defaultNamespace + \"_\" + pageviewText;\n if (!window[defaultPageview]) window[defaultPageview] = manualPageview;\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw, keepalive) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback,\n undefinedVar,\n keepalive\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback, keepalive) {\n sendEvent(event, metadata, callback, keepalive);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n\n var inlineEvent = function (event) {\n var element = event.target;\n while (\n element &&\n element !== doc &&\n (!element.getAttribute || attr(element, \"simple-event\") === null)\n )\n element = element.parentNode;\n\n if (!element || element === doc) return;\n var isForm = element.tagName === \"FORM\";\n var name = attr(element, \"simple-event\");\n if (!name || isForm !== (event.type === \"submit\")) return;\n\n var metadata = { tag: element.tagName.toLowerCase() };\n var attributes = element.attributes;\n for (var i = 0; i < attributes.length; i++) {\n var attribute = attributes[i];\n if (attribute.name.indexOf(\"data-simple-event-\") === 0)\n metadata[attribute.name.slice(18).replace(/-/g, \"_\")] =\n attribute.value;\n }\n if (isForm) {\n var button = event.submitter;\n metadata.button_text = button\n ? (button.textContent || button.value || \"\")\n .replace(/\\s+/g, \" \")\n .trim()\n .slice(0, 200)\n : \"\";\n }\n sendEvent(name, metadata, undefinedVar, trueVar);\n };\n\n doc.addEventListener(\"click\", inlineEvent, falseVar);\n doc.addEventListener(\"submit\", inlineEvent, falseVar);\n\n // 404 confirmation adds a request, so existing installs must opt in.\n if (\n settings.detect404 === trueVar ||\n attr(scriptElement, \"detect-404\") == trueText\n ) {\n var detect404 = function () {\n if (\n !/\\b404\\b/.test(doc.title + \" \" + (doc.body && doc.body.textContent))\n )\n return;\n try {\n var request = new window.XMLHttpRequest();\n request.open(\"HEAD\", loc.href, trueVar);\n request.onload = function () {\n if (request.status === 404)\n sendEvent(\"page_404\", {\n url: loc.protocol + \"//\" + definedHostname + loc.pathname,\n status: 404,\n });\n };\n request.send();\n } catch (error) {}\n };\n if (doc.readyState === \"loading\")\n doc.addEventListener(\"DOMContentLoaded\", detect404, falseVar);\n else detect404();\n }\n } catch (e) {\n sendError(e);\n }\n})(\n typeof window != \"undefined\" && window,\n \"simpleanalyticscdn.com\",\n \"queue.\",\n \"cdn_hello_12\",\n \"sa\"\n);\n"],"names":["window","baseUrl","sendError","warn","type","orig","value","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","protocol","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","logSettings","settings","sa_settings","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","keepalive","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","imageUrl","keys","key","fetch","mode","credentials","catch","src","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","path","pathname","event","filename","message","timezone","start","scrolled","collectDnt","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","raw","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","parts","querySearch","shift","pathKey","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","rv","this","createEvent","initEvent","manualPageview","defaultPageview","defaultNamespace","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue","detect404","inlineEvent","element","target","parentNode","isForm","tagName","button","tag","toLowerCase","attributes","submitter","button_text","textContent","trim","title","request","XMLHttpRequest","open","href","status","url","send","readyState"],"mappings":"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"} \ No newline at end of file diff --git a/dist/latest/latest.dev.js b/dist/latest/latest.dev.js index b6b05092..45688817 100644 --- a/dist/latest/latest.dev.js +++ b/dist/latest/latest.dev.js @@ -1,9 +1,8 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-15; 233d; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-15; 1a59; v12) */ /* eslint-env browser */ (function ( window, - overwriteOptions, baseUrl, apiUrlPrefix, version, @@ -11,6 +10,9 @@ sendError, warn ) { + // Only initialize in a browser. + if (!window) return; + try { ///////////////////// // PREDEFINED VARIABLES FOR BETTER MINIFICATION @@ -64,7 +66,6 @@ /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent); var screen = window.screen; - // Find the script element where options can be set on var scriptElement = doc.currentScript || doc.querySelector('script[src*="' + baseUrl + '"]'); @@ -135,16 +136,14 @@ }; var settings = window.sa_settings; - var logSettings = settings || Object.keys(overwriteOptions).length; + var logSettings = settings; + settings = assign(settings); - // Merge overwriteOptions with sa_settings - overwriteOptions = assign(overwriteOptions, settings); - - if (logSettings) warn("Settings", overwriteOptions); + if (logSettings) warn("Settings", settings); // Customers can skip data points var ignoreMetrics = convertCommaSeparatedToArray( - overwriteOptions.ignoreMetrics || attr(scriptElement, "ignore-metrics") + settings.ignoreMetrics || attr(scriptElement, "ignore-metrics") ); var collectMetricByString = function (metricAbbreviation) { @@ -187,7 +186,7 @@ // Define namespace for the library var namespaceText = "namespace"; var namespace = - overwriteOptions[namespaceText] || + settings[namespaceText] || attr(scriptElement, namespaceText) || defaultNamespace; @@ -219,8 +218,7 @@ // By default we allow source, medium in the URLs. With strictUtm enabled // we only allow it with the utm_ prefix: utm_source, utm_medium, ... var strictUtm = - overwriteOptions.strictUtm || - attr(scriptElement, "strict-utm") == trueText; + settings.strictUtm || attr(scriptElement, "strict-utm") == trueText; var k; @@ -347,7 +345,7 @@ // Customers can overwrite their hostname, here we check for that var overwrittenHostname = - overwriteOptions.hostname || attr(scriptElement, "hostname"); + settings.hostname || attr(scriptElement, "hostname"); var definedHostname = overwrittenHostname || locationHostname; var basePayload = { @@ -402,11 +400,11 @@ // // Script mode, this can be hash mode for example - var mode = overwriteOptions.mode || attr(scriptElement, "mode"); + var mode = settings.mode || attr(scriptElement, "mode"); // Should we record Do Not Track visits? - var collectDnt = isBoolean(overwriteOptions.collectDnt) - ? overwriteOptions.collectDnt + var collectDnt = isBoolean(settings.collectDnt) + ? settings.collectDnt : attr(scriptElement, "ignore-dnt") == trueText || attr(scriptElement, "skip-dnt") == trueText || attr(scriptElement, "collect-dnt") == trueText; @@ -414,39 +412,37 @@ // Some customers want to collect page views manually var autoCollect = !( attr(scriptElement, "auto-collect") == "false" || - overwriteOptions.autoCollect === falseVar + settings.autoCollect === falseVar ); // Event function name var eventFunctionName = - overwriteOptions.saGlobal || + settings.saGlobal || attr(scriptElement, "sa-global") || namespace + "_" + eventText; // Customers can ignore certain pages var ignorePages = convertCommaSeparatedToArray( - overwriteOptions.ignorePages || attr(scriptElement, "ignore-pages") + settings.ignorePages || attr(scriptElement, "ignore-pages") ); // Customers can allow params var allowParams = convertCommaSeparatedToArray( - overwriteOptions.allowParams || attr(scriptElement, "allow-params") + settings.allowParams || attr(scriptElement, "allow-params") ); // Customers can allow params var nonUniqueHostnames = convertCommaSeparatedToArray( - overwriteOptions.nonUniqueHostnames || - attr(scriptElement, "non-unique-hostnames") + settings.nonUniqueHostnames || attr(scriptElement, "non-unique-hostnames") ); // Customers can overwrite certain values var pathOverwriter = - overwriteOptions.pathOverwriter || attr(scriptElement, "path-overwriter"); + settings.pathOverwriter || attr(scriptElement, "path-overwriter"); // Customers can add metadata to events and pageviews via a function var metadataCollector = - overwriteOptions.metadataCollector || - attr(scriptElement, "metadata-collector"); + settings.metadataCollector || attr(scriptElement, "metadata-collector"); // This code could error on (incomplete) implementations, that's why we use try...catch var timezone; @@ -546,7 +542,7 @@ var getReferrer = function (raw) { // Customers can overwrite their referrer, here we check for that var referrer = - overwriteOptions.referrer || + settings.referrer || attr(scriptElement, "referrer") || doc.referrer || ""; @@ -1049,7 +1045,7 @@ // 404 confirmation adds a request, so existing installs must opt in. if ( - overwriteOptions.detect404 === trueVar || + settings.detect404 === trueVar || attr(scriptElement, "detect-404") == trueText ) { var detect404 = function () { @@ -1078,8 +1074,7 @@ sendError(e); } })( - window, - {}, + typeof window != "undefined" && window, "simpleanalyticscdn.com", "queue.", "cdn_latest_dev_12", diff --git a/dist/latest/latest.js b/dist/latest/latest.js index 1b88b8d2..e05ca679 100644 --- a/dist/latest/latest.js +++ b/dist/latest/latest.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-15; 462b; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-15; d320; v12) */ -!function(v,n,e,r,m){try{var g=undefined,y=!0,_=!1,t="true",a="https:",b="pageview",l="event",i="error",o=v.console,c="doNotTrack",w=v.navigator,s=v.location,O=s.host,u=v.document,f=w.userAgent,p="Not sending request ",d=p+"when ",E=_,h=encodeURIComponent,x=decodeURIComponent,M=JSON.stringify,S=v.addEventListener,k="https://queue."+e,q=u.documentElement||{},A="language",C="Height",D="scroll",$=w.userAgentData,j=D+C,R="offset"+C,H="client"+C,L="pagehide",N="platform",P="platformVersion",T="https://docs.simpleanalytics.com",U=0,I=/(bot|spider|crawl)/i.test(f)&&!/(cubot)/i.test(f),V=v.screen,B=u.currentScript||u.querySelector('script[src*="'+e+'"]');m=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){m("Error in your "+t+" function:",e)},z=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},W=function(t){return"string"==typeof t},G=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},J=function(t,e){return t&&t.getAttribute("data-"+e)},X=function(t){return Array.isArray(t)?t:W(t)&&t.length?t.split(/, ?/):[]},Y=function(t){return t&&t.constructor===Object},Z=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},it=function(t){return"function"==typeof t},ot="namespace",ct=n[ot]||J(B,ot)||"sa",st=function(t,e){var n=v[ct+"_metadata"];Y(n)&&(t=Z(t,n));var r=v[kt];if(!it(r))return kt&&m(kt+" not found, set window."+kt),t;try{return Z(t,r.call(v,Z(t,e)))}catch(a){F("metadata",a)}},ut=n.strictUtm||J(B,"strict-utm")==t,lt=function(i,t){tt=!i&&nt("q")?"":_;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");tt!==_&&0>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},ct=function(t){return"function"==typeof t},st="namespace",ut=et[st]||Y(z,st)||"sa",lt=function(t,e){var n=m[ut+"_metadata"];K(n)&&(t=Q(t,n));var r=m[At];if(!ct(r))return At&&v(At+" not found, set window."+At),t;try{return Q(t,r.call(m,Q(t,e)))}catch(a){W("metadata",a)}},ft=et.strictUtm||Y(z,"strict-utm")==i,dt=function(i,t){nt=!i&&at("q")?"":_;var e=(t||f.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");nt!==_&&0> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData, keepalive) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n var imageUrl =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n\n // Events must survive navigation without taking over links or forms.\n if (keepalive && window.fetch) {\n try {\n window\n .fetch(imageUrl, {\n keepalive: trueVar,\n mode: \"no-cors\",\n credentials: \"omit\",\n })\n .catch(function () {\n image.src = imageUrl;\n });\n return;\n } catch (error) {}\n }\n image.src = imageUrl;\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function (raw) {\n // Customers can overwrite their referrer, here we check for that\n var referrer =\n overwriteOptions.referrer ||\n attr(scriptElement, \"referrer\") ||\n doc.referrer ||\n \"\";\n\n if (raw) return referrer;\n return (\n referrer\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch = \"\";\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n var pathKey = path + querySearch;\n if (!path || lastSendPath == pathKey) return;\n\n lastSendPath = pathKey;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // Only the first pageview can use a Cloudflare referrer as a unique arrival.\n page.unique =\n isPushState || userNavigated\n ? falseVar\n : !sameSite || (!pages && /[?&]__cf_/.test(getReferrer(trueVar)));\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n var manualPageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n window[namespace + \"_\" + pageviewText] = manualPageview;\n var defaultPageview = defaultNamespace + \"_\" + pageviewText;\n if (!window[defaultPageview]) window[defaultPageview] = manualPageview;\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw, keepalive) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback,\n undefinedVar,\n keepalive\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback, keepalive) {\n sendEvent(event, metadata, callback, keepalive);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n\n var inlineEvent = function (event) {\n var element = event.target;\n while (\n element &&\n element !== doc &&\n (!element.getAttribute || attr(element, \"simple-event\") === null)\n )\n element = element.parentNode;\n\n if (!element || element === doc) return;\n var isForm = element.tagName === \"FORM\";\n var name = attr(element, \"simple-event\");\n if (!name || isForm !== (event.type === \"submit\")) return;\n\n var metadata = { tag: element.tagName.toLowerCase() };\n var attributes = element.attributes;\n for (var i = 0; i < attributes.length; i++) {\n var attribute = attributes[i];\n if (attribute.name.indexOf(\"data-simple-event-\") === 0)\n metadata[attribute.name.slice(18).replace(/-/g, \"_\")] =\n attribute.value;\n }\n if (isForm) {\n var button = event.submitter;\n metadata.button_text = button\n ? (button.textContent || button.value || \"\")\n .replace(/\\s+/g, \" \")\n .trim()\n .slice(0, 200)\n : \"\";\n }\n sendEvent(name, metadata, undefinedVar, trueVar);\n };\n\n doc.addEventListener(\"click\", inlineEvent, falseVar);\n doc.addEventListener(\"submit\", inlineEvent, falseVar);\n\n // 404 confirmation adds a request, so existing installs must opt in.\n if (\n overwriteOptions.detect404 === trueVar ||\n attr(scriptElement, \"detect-404\") == trueText\n ) {\n var detect404 = function () {\n if (\n !/\\b404\\b/.test(doc.title + \" \" + (doc.body && doc.body.textContent))\n )\n return;\n try {\n var request = new window.XMLHttpRequest();\n request.open(\"HEAD\", loc.href, trueVar);\n request.onload = function () {\n if (request.status === 404)\n sendEvent(\"page_404\", {\n url: loc.protocol + \"//\" + definedHostname + loc.pathname,\n status: 404,\n });\n };\n request.send();\n } catch (error) {}\n };\n if (doc.readyState === \"loading\")\n doc.addEventListener(\"DOMContentLoaded\", detect404, falseVar);\n else detect404();\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"simpleanalyticscdn.com\",\n \"queue.\",\n \"cdn_latest_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","protocol","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","keepalive","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","imageUrl","key","fetch","mode","credentials","catch","src","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","raw","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","parts","querySearch","shift","pathKey","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","manualPageview","defaultPageview","defaultNamespace","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue","detect404","inlineEvent","element","target","parentNode","isForm","tagName","button","tag","toLowerCase","attributes","submitter","button_text","textContent","trim","title","request","XMLHttpRequest","open","href","status","url","send","readyState"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"latest.source.js","sources":["latest.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n // Only initialize in a browser.\n if (!window) return;\n\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings;\n settings = assign(settings);\n\n if (logSettings) warn(\"Settings\", settings);\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n settings.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n settings[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n settings.strictUtm || attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData, keepalive) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n var imageUrl =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n\n // Events must survive navigation without taking over links or forms.\n if (keepalive && window.fetch) {\n try {\n window\n .fetch(imageUrl, {\n keepalive: trueVar,\n mode: \"no-cors\",\n credentials: \"omit\",\n })\n .catch(function () {\n image.src = imageUrl;\n });\n return;\n } catch (error) {}\n }\n image.src = imageUrl;\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n settings.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = settings.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(settings.collectDnt)\n ? settings.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n settings.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n settings.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n settings.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n settings.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n settings.nonUniqueHostnames || attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n settings.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n settings.metadataCollector || attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function (raw) {\n // Customers can overwrite their referrer, here we check for that\n var referrer =\n settings.referrer ||\n attr(scriptElement, \"referrer\") ||\n doc.referrer ||\n \"\";\n\n if (raw) return referrer;\n return (\n referrer\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch = \"\";\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n var pathKey = path + querySearch;\n if (!path || lastSendPath == pathKey) return;\n\n lastSendPath = pathKey;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // Only the first pageview can use a Cloudflare referrer as a unique arrival.\n page.unique =\n isPushState || userNavigated\n ? falseVar\n : !sameSite || (!pages && /[?&]__cf_/.test(getReferrer(trueVar)));\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n var manualPageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n window[namespace + \"_\" + pageviewText] = manualPageview;\n var defaultPageview = defaultNamespace + \"_\" + pageviewText;\n if (!window[defaultPageview]) window[defaultPageview] = manualPageview;\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw, keepalive) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback,\n undefinedVar,\n keepalive\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback, keepalive) {\n sendEvent(event, metadata, callback, keepalive);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n\n var inlineEvent = function (event) {\n var element = event.target;\n while (\n element &&\n element !== doc &&\n (!element.getAttribute || attr(element, \"simple-event\") === null)\n )\n element = element.parentNode;\n\n if (!element || element === doc) return;\n var isForm = element.tagName === \"FORM\";\n var name = attr(element, \"simple-event\");\n if (!name || isForm !== (event.type === \"submit\")) return;\n\n var metadata = { tag: element.tagName.toLowerCase() };\n var attributes = element.attributes;\n for (var i = 0; i < attributes.length; i++) {\n var attribute = attributes[i];\n if (attribute.name.indexOf(\"data-simple-event-\") === 0)\n metadata[attribute.name.slice(18).replace(/-/g, \"_\")] =\n attribute.value;\n }\n if (isForm) {\n var button = event.submitter;\n metadata.button_text = button\n ? (button.textContent || button.value || \"\")\n .replace(/\\s+/g, \" \")\n .trim()\n .slice(0, 200)\n : \"\";\n }\n sendEvent(name, metadata, undefinedVar, trueVar);\n };\n\n doc.addEventListener(\"click\", inlineEvent, falseVar);\n doc.addEventListener(\"submit\", inlineEvent, falseVar);\n\n // 404 confirmation adds a request, so existing installs must opt in.\n if (\n settings.detect404 === trueVar ||\n attr(scriptElement, \"detect-404\") == trueText\n ) {\n var detect404 = function () {\n if (\n !/\\b404\\b/.test(doc.title + \" \" + (doc.body && doc.body.textContent))\n )\n return;\n try {\n var request = new window.XMLHttpRequest();\n request.open(\"HEAD\", loc.href, trueVar);\n request.onload = function () {\n if (request.status === 404)\n sendEvent(\"page_404\", {\n url: loc.protocol + \"//\" + definedHostname + loc.pathname,\n status: 404,\n });\n };\n request.send();\n } catch (error) {}\n };\n if (doc.readyState === \"loading\")\n doc.addEventListener(\"DOMContentLoaded\", detect404, falseVar);\n else detect404();\n }\n } catch (e) {\n sendError(e);\n }\n})(\n typeof window != \"undefined\" && window,\n \"simpleanalyticscdn.com\",\n \"queue.\",\n \"cdn_latest_12\",\n \"sa\"\n);\n"],"names":["window","baseUrl","sendError","warn","type","orig","value","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","protocol","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","logSettings","settings","sa_settings","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","keepalive","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","imageUrl","keys","key","fetch","mode","credentials","catch","src","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","path","pathname","event","filename","message","timezone","start","scrolled","collectDnt","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","raw","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","parts","querySearch","shift","pathKey","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","rv","this","createEvent","initEvent","manualPageview","defaultPageview","defaultNamespace","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue","detect404","inlineEvent","element","target","parentNode","isForm","tagName","button","tag","toLowerCase","attributes","submitter","button_text","textContent","trim","title","request","XMLHttpRequest","open","href","status","url","send","readyState"],"mappings":"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"} \ No newline at end of file diff --git a/dist/latest/light.js b/dist/latest/light.js index a6a58a63..c4b64988 100644 --- a/dist/latest/light.js +++ b/dist/latest/light.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-15; e3ad; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-15; b187; v12) */ -!function(f,e,t,m){try{var u=undefined,n="https:",r=f.console,a="doNotTrack",g=f.navigator,p=f.location,h=p.host,i=f.document,o=g.userAgent,c="Not sending request ",v=!1,s=encodeURIComponent,d=decodeURIComponent,l=JSON.stringify,y=f.addEventListener,_="https://queue."+t,b=(i.documentElement,"language"),w=g.userAgentData,O="platform",S="platformVersion",j="https://docs.simpleanalytics.com",k=/(bot|spider|crawl)/i.test(o)&&!/(cubot)/i.test(o),E=i.currentScript||i.querySelector('script[src*="'+t+'"]');m=function(){var e=[].slice.call(arguments);return e.unshift("Simple Analytics:"),Function.prototype.apply.call(r.warn,r,e)};var q=function(e){return"string"==typeof e},x=function(e,t){return e&&e.getAttribute("data-"+t)},A=function(){for(var e,t,n,r={},a=arguments,i=0;i>e/4).toString(16)})}catch(r){return e.replace(n,function(e){var t=16*Math.random()|0;return(e<2?t:3&t|8).toString(16)})}},N=function(e){return"function"==typeof e},R="namespace",U=e[R]||x(E,R)||"sa",V=e.strictUtm||"true"==x(E,"strict-utm"),B=U+"_loaded";if(1==f[B])return m(c+"twice");f.sa_event_loaded=!0,f[B]=!0;var C,T=function(t,e,n,r){t=n?t:A(J,M,t),g.brave&&!n&&(t.brave=!0),g._duckduckgoloader_&&!n&&(t.duck=!0);var a=new Image,i=_+"/simple.gif?"+Object.keys(t).filter(function(e){return t[e]!=u}).map(function(e){return s(e)+"="+s(t[e])}).join("&")+"&time="+Date.now();a.src=i},F=e.hostname||x(E,"hostname"),H=F||h,z={version:"cdn_light_12",hostname:H};e.mode||x(E,"mode");try{C=Intl.DateTimeFormat().resolvedOptions().timeZone}catch(X){m(X)}k&&(z.bot=!0);var J=A(z,{ua:o,https:p.protocol==n,timezone:C,page_id:I(),session_id:I()});if(J.sri=!1,w&&(J.mobile=w.mobile,J.brands=l(w.brands)),H!==h&&(J.hostname_original=h),a in g&&"1"==g[a])return m("Not sending request when "+a+" is enabled. See "+j+"/dnt");-1!=h.indexOf(".")&&!/^[0-9.:]+$/.test(h)||F||m("Set hostname on "+h+". See "+j+"/overwrite-domain-name");var L,M={},P=(e.referrer||x(E,"referrer")||i.referrer||"").replace(h,H).replace(/^https?:\/\/((m|l|w{2,3}([0-9]+)?)\.)?([^?#]+)(.*)$/,"$4").replace(/^([^/]+)$/,"$1")||u,Z=function(e,t){var n=A(z,{type:"append",original_id:t?e:J.page_id});if(t||!g.sendBeacon)T(n,0,!0);else try{g.sendBeacon.bind(g)(_+"/append",l(n))}catch(r){T(n,0,!0)}};y("pagehide",Z,!1);var G,K,Q=function(e){var t="";try{t=e||d(p.pathname)}catch(X){m(X)}return t},W=function(e,t,n,r,a,i){e&&Z(""+J.page_id,!0),J.page_id=I();var o,c=H+Q(),s=(o=t,(r||p.search).slice(1).split("&").filter(function(e){return!o&&new RegExp("^((utm_)"+(V?"":"?")+"(source|medium|content|term|campaign)"+(V?"":"|ref")+")=","i").test(e)}).join("&")||u);T({id:J.page_id,type:"pageview",referrer:!t||n?P:null,query:s}),P=c,0};!function(e,t,n,r){!r&&N(n)&&(r=n);N(r);var a,i="";q(t)&&-1>e/4).toString(16)})}catch(r){return e.replace(n,function(e){var t=16*Math.random()|0;return(e<2?t:3&t|8).toString(16)})}},I=function(e){return"function"==typeof e},N="namespace",R=$[N]||q(k,N)||"sa",U=$.strictUtm||"true"==q(k,"strict-utm"),V=R+"_loaded";if(1==f[V])return m(o+"twice");f.sa_event_loaded=!0,f[V]=!0;var B,C=function(t,e,n,r){t=n?t:x(z,L,t),g.brave&&!n&&(t.brave=!0),g._duckduckgoloader_&&!n&&(t.duck=!0);var a=new Image,i=y+"/simple.gif?"+Object.keys(t).filter(function(e){return t[e]!=u}).map(function(e){return c(e)+"="+c(t[e])}).join("&")+"&time="+Date.now();a.src=i},T=$.hostname||q(k,"hostname"),F=T||h,H={version:"cdn_light_12",hostname:F};$.mode||q(k,"mode");try{B=Intl.DateTimeFormat().resolvedOptions().timeZone}catch(W){m(W)}j&&(H.bot=!0);var z=x(H,{ua:i,https:p.protocol==t,timezone:B,page_id:D(),session_id:D()});if(z.sri=!1,w&&(z.mobile=w.mobile,z.brands=d(w.brands)),F!==h&&(z.hostname_original=h),r in g&&"1"==g[r])return m("Not sending request when "+r+" is enabled. See "+S+"/dnt");-1!=h.indexOf(".")&&!/^[0-9.:]+$/.test(h)||T||m("Set hostname on "+h+". See "+S+"/overwrite-domain-name");var J,L={},M=($.referrer||q(k,"referrer")||a.referrer||"").replace(h,F).replace(/^https?:\/\/((m|l|w{2,3}([0-9]+)?)\.)?([^?#]+)(.*)$/,"$4").replace(/^([^/]+)$/,"$1")||u,P=function(e,t){var n=x(H,{type:"append",original_id:t?e:z.page_id});if(t||!g.sendBeacon)C(n,0,!0);else try{g.sendBeacon.bind(g)(y+"/append",d(n))}catch(r){C(n,0,!0)}};l("pagehide",P,!1);var Z,G,K=function(e){var t="";try{t=e||s(p.pathname)}catch(W){m(W)}return t},Q=function(e,t,n,r,a,i){e&&P(""+z.page_id,!0),z.page_id=D();var o,c=F+K(),s=(o=t,(r||p.search).slice(1).split("&").filter(function(e){return!o&&new RegExp("^((utm_)"+(U?"":"?")+"(source|medium|content|term|campaign)"+(U?"":"|ref")+")=","i").test(e)}).join("&")||u);C({id:z.page_id,type:"pageview",referrer:!t||n?M:null,query:s}),M=c,0};!function(e,t,n,r){!r&&I(n)&&(r=n);I(r);var a,i="";E(t)&&-1> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n if (ignore) return falseVar;\n // eslint-disable-next-line no-redeclare\n var regex =\n \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \")=\";\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n return q || undefinedVar;\n };\n\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData, keepalive) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n var imageUrl =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n\n image.src = imageUrl;\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n\n\n\n\n\n\n\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n // eslint-disable-next-line no-redeclare\n var bot = isBotAgent;\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function (raw) {\n // Customers can overwrite their referrer, here we check for that\n var referrer =\n overwriteOptions.referrer ||\n attr(scriptElement, \"referrer\") ||\n doc.referrer ||\n \"\";\n\n return (\n referrer\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n\n\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch = \"\";\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n var pathKey = path + querySearch;\n if (!path || lastSendPath == pathKey) return;\n\n lastSendPath = pathKey;\n page.path = path;\n\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n sameSite = referrer\n ? referrer.split(slash)[0] == locationHostname\n : falseVar;\n\n\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n\n\n pageview();\n\n } catch (e) {\n warn(e);\n }\n})(\n window,\n {},\n \"simpleanalyticscdn.com\",\n \"queue.\",\n \"cdn_light_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","warn","undefinedVar","undefined","https","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","protocol","language","documentElement","uaData","userAgentData","platformText","platformVersionText","docsUrl","isBotAgent","test","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","isString","string","attr","attribute","getAttribute","assign","obj","prop","object","to","arg","index","length","nextSource","constructor","Object","nextKey","hasOwnProperty","settings","sa_settings","logSettings","keys","Date","now","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","replace","c","getRandomValues","Uint8Array","toString","error","r","Math","random","isFunction","func","namespaceText","namespace","strictUtm","loadedVariable","sa_event_loaded","timezone","sendData","data","callback","onlyThisData","keepalive","payload","page","brave","_duckduckgoloader_","duck","image","Image","imageUrl","filter","key","map","join","src","overwrittenHostname","hostname","definedHostname","basePayload","version","mode","Intl","DateTimeFormat","resolvedOptions","timeZone","bot","ua","page_id","session_id","sri","mobile","brands","hostname_original","indexOf","lastSendPath","referrer","sendOnLeave","id","push","append","type","original_id","sendBeacon","bind","e","sameSite","userNavigated","getPath","overwrite","path","pathname","sendPageView","isPushState","deleteSourceInfo","search","metadata","ignoreSource","currentPage","query","split","keyValue","RegExp","pages","pathOverwrite","callbackRaw","parts","querySearch","shift","pathKey","performaceEntryType","perf","performance","navigationText","getEntriesByType","triggerSendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","pageview"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"light.source.js","sources":["light.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n // Only initialize in a browser.\n if (!window) return;\n\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings;\n settings = assign(settings);\n\n if (logSettings) warn(\"Settings\", settings);\n\n\n var collectMetricByString = function (metricAbbreviation) {\n // eslint-disable-next-line no-unreachable\n return true;\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n settings[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n settings.strictUtm || attr(scriptElement, \"strict-utm\") == trueText;\n\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n if (ignore) return falseVar;\n // eslint-disable-next-line no-redeclare\n var regex =\n \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \")=\";\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n return q || undefinedVar;\n };\n\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData, keepalive) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n var imageUrl =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n\n image.src = imageUrl;\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n settings.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = settings.mode || attr(scriptElement, \"mode\");\n\n\n\n\n\n\n\n\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n // eslint-disable-next-line no-redeclare\n var bot = isBotAgent;\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function (raw) {\n // Customers can overwrite their referrer, here we check for that\n var referrer =\n settings.referrer ||\n attr(scriptElement, \"referrer\") ||\n doc.referrer ||\n \"\";\n\n return (\n referrer\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n\n\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch = \"\";\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n var pathKey = path + querySearch;\n if (!path || lastSendPath == pathKey) return;\n\n lastSendPath = pathKey;\n page.path = path;\n\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n sameSite = referrer\n ? referrer.split(slash)[0] == locationHostname\n : falseVar;\n\n\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n\n\n pageview();\n\n } catch (e) {\n warn(e);\n }\n})(\n typeof window != \"undefined\" && window,\n \"simpleanalyticscdn.com\",\n \"queue.\",\n \"cdn_light_12\",\n \"sa\"\n);\n"],"names":["window","baseUrl","warn","undefinedVar","undefined","https","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","protocol","language","documentElement","uaData","userAgentData","platformText","platformVersionText","docsUrl","isBotAgent","test","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","isString","string","attr","attribute","getAttribute","assign","obj","prop","object","to","arg","index","length","nextSource","constructor","Object","nextKey","hasOwnProperty","logSettings","settings","sa_settings","Date","now","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","replace","c","getRandomValues","Uint8Array","toString","error","r","Math","random","isFunction","func","namespaceText","namespace","strictUtm","loadedVariable","sa_event_loaded","timezone","sendData","data","callback","onlyThisData","keepalive","payload","page","brave","_duckduckgoloader_","duck","image","Image","imageUrl","keys","filter","key","map","join","src","overwrittenHostname","hostname","definedHostname","basePayload","version","mode","Intl","DateTimeFormat","resolvedOptions","timeZone","bot","ua","page_id","session_id","sri","mobile","brands","hostname_original","indexOf","lastSendPath","referrer","sendOnLeave","id","push","append","type","original_id","sendBeacon","bind","e","sameSite","userNavigated","getPath","overwrite","path","pathname","sendPageView","isPushState","deleteSourceInfo","search","metadata","ignoreSource","currentPage","query","split","keyValue","RegExp","pages","pathOverwrite","callbackRaw","parts","querySearch","shift","pathKey","performaceEntryType","perf","performance","navigationText","getEntriesByType","triggerSendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","pageview"],"mappings":"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"} \ No newline at end of file diff --git a/dist/v12/app.js b/dist/v12/app.js index dba496c9..472fa436 100644 --- a/dist/v12/app.js +++ b/dist/v12/app.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-15; c622; SRI-version; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-15; 2ba7; SRI-version; v12) */ -!function(v,n,e,r,m){try{var g=undefined,y=!0,_=!1,t="true",a="https:",b="pageview",l="event",i="error",o=v.console,c="doNotTrack",w=v.navigator,s=v.location,O=s.host,u=v.document,f=w.userAgent,p="Not sending request ",d=p+"when ",E=_,h=encodeURIComponent,x=decodeURIComponent,M=JSON.stringify,S=v.addEventListener,k="https://queue."+e,q=u.documentElement||{},A="language",C="Height",D="scroll",$=w.userAgentData,j=D+C,R="offset"+C,H="client"+C,L="pagehide",N="platform",P="platformVersion",T="https://docs.simpleanalytics.com",U=0,I=/(bot|spider|crawl)/i.test(f)&&!/(cubot)/i.test(f),V=v.screen,B=u.currentScript||u.querySelector('script[src*="'+e+'"]');m=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){m("Error in your "+t+" function:",e)},z=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},W=function(t){return"string"==typeof t},G=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},J=function(t,e){return t&&t.getAttribute("data-"+e)},X=function(t){return Array.isArray(t)?t:W(t)&&t.length?t.split(/, ?/):[]},Y=function(t){return t&&t.constructor===Object},Z=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},it=function(t){return"function"==typeof t},ot="namespace",ct=n[ot]||J(B,ot)||"sa",st=function(t,e){var n=v[ct+"_metadata"];Y(n)&&(t=Z(t,n));var r=v[kt];if(!it(r))return kt&&m(kt+" not found, set window."+kt),t;try{return Z(t,r.call(v,Z(t,e)))}catch(a){F("metadata",a)}},ut=n.strictUtm||J(B,"strict-utm")==t,lt=function(i,t){tt=!i&&nt("q")?"":_;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");tt!==_&&0>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},ct=function(t){return"function"==typeof t},st="namespace",ut=et[st]||Y(z,st)||"sa",lt=function(t,e){var n=m[ut+"_metadata"];K(n)&&(t=Q(t,n));var r=m[At];if(!ct(r))return At&&v(At+" not found, set window."+At),t;try{return Q(t,r.call(m,Q(t,e)))}catch(a){W("metadata",a)}},ft=et.strictUtm||Y(z,"strict-utm")==i,dt=function(i,t){nt=!i&&at("q")?"":_;var e=(t||f.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");nt!==_&&0> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData, keepalive) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n var imageUrl =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n\n // Events must survive navigation without taking over links or forms.\n if (keepalive && window.fetch) {\n try {\n window\n .fetch(imageUrl, {\n keepalive: trueVar,\n mode: \"no-cors\",\n credentials: \"omit\",\n })\n .catch(function () {\n image.src = imageUrl;\n });\n return;\n } catch (error) {}\n }\n image.src = imageUrl;\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = trueVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function (raw) {\n // Customers can overwrite their referrer, here we check for that\n var referrer =\n overwriteOptions.referrer ||\n attr(scriptElement, \"referrer\") ||\n doc.referrer ||\n \"\";\n\n if (raw) return referrer;\n return (\n referrer\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch = \"\";\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n var pathKey = path + querySearch;\n if (!path || lastSendPath == pathKey) return;\n\n lastSendPath = pathKey;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // Only the first pageview can use a Cloudflare referrer as a unique arrival.\n page.unique =\n isPushState || userNavigated\n ? falseVar\n : !sameSite || (!pages && /[?&]__cf_/.test(getReferrer(trueVar)));\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n var manualPageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n window[namespace + \"_\" + pageviewText] = manualPageview;\n var defaultPageview = defaultNamespace + \"_\" + pageviewText;\n if (!window[defaultPageview]) window[defaultPageview] = manualPageview;\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw, keepalive) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback,\n undefinedVar,\n keepalive\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback, keepalive) {\n sendEvent(event, metadata, callback, keepalive);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n\n var inlineEvent = function (event) {\n var element = event.target;\n while (\n element &&\n element !== doc &&\n (!element.getAttribute || attr(element, \"simple-event\") === null)\n )\n element = element.parentNode;\n\n if (!element || element === doc) return;\n var isForm = element.tagName === \"FORM\";\n var name = attr(element, \"simple-event\");\n if (!name || isForm !== (event.type === \"submit\")) return;\n\n var metadata = { tag: element.tagName.toLowerCase() };\n var attributes = element.attributes;\n for (var i = 0; i < attributes.length; i++) {\n var attribute = attributes[i];\n if (attribute.name.indexOf(\"data-simple-event-\") === 0)\n metadata[attribute.name.slice(18).replace(/-/g, \"_\")] =\n attribute.value;\n }\n if (isForm) {\n var button = event.submitter;\n metadata.button_text = button\n ? (button.textContent || button.value || \"\")\n .replace(/\\s+/g, \" \")\n .trim()\n .slice(0, 200)\n : \"\";\n }\n sendEvent(name, metadata, undefinedVar, trueVar);\n };\n\n doc.addEventListener(\"click\", inlineEvent, falseVar);\n doc.addEventListener(\"submit\", inlineEvent, falseVar);\n\n // 404 confirmation adds a request, so existing installs must opt in.\n if (\n overwriteOptions.detect404 === trueVar ||\n attr(scriptElement, \"detect-404\") == trueText\n ) {\n var detect404 = function () {\n if (\n !/\\b404\\b/.test(doc.title + \" \" + (doc.body && doc.body.textContent))\n )\n return;\n try {\n var request = new window.XMLHttpRequest();\n request.open(\"HEAD\", loc.href, trueVar);\n request.onload = function () {\n if (request.status === 404)\n sendEvent(\"page_404\", {\n url: loc.protocol + \"//\" + definedHostname + loc.pathname,\n status: 404,\n });\n };\n request.send();\n } catch (error) {}\n };\n if (doc.readyState === \"loading\")\n doc.addEventListener(\"DOMContentLoaded\", detect404, falseVar);\n else detect404();\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"simpleanalyticscdn.com\",\n \"queue.\",\n \"cdn_latest_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","protocol","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","keepalive","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","imageUrl","key","fetch","mode","credentials","catch","src","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","raw","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","parts","querySearch","shift","pathKey","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","manualPageview","defaultPageview","defaultNamespace","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue","detect404","inlineEvent","element","target","parentNode","isForm","tagName","button","tag","toLowerCase","attributes","submitter","button_text","textContent","trim","title","request","XMLHttpRequest","open","href","status","url","send","readyState"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"app.js","sources":["app.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n // Only initialize in a browser.\n if (!window) return;\n\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings;\n settings = assign(settings);\n\n if (logSettings) warn(\"Settings\", settings);\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n settings.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n settings[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n settings.strictUtm || attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData, keepalive) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n var imageUrl =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n\n // Events must survive navigation without taking over links or forms.\n if (keepalive && window.fetch) {\n try {\n window\n .fetch(imageUrl, {\n keepalive: trueVar,\n mode: \"no-cors\",\n credentials: \"omit\",\n })\n .catch(function () {\n image.src = imageUrl;\n });\n return;\n } catch (error) {}\n }\n image.src = imageUrl;\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n settings.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = settings.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(settings.collectDnt)\n ? settings.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n settings.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n settings.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n settings.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n settings.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n settings.nonUniqueHostnames || attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n settings.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n settings.metadataCollector || attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = trueVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function (raw) {\n // Customers can overwrite their referrer, here we check for that\n var referrer =\n settings.referrer ||\n attr(scriptElement, \"referrer\") ||\n doc.referrer ||\n \"\";\n\n if (raw) return referrer;\n return (\n referrer\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch = \"\";\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n var pathKey = path + querySearch;\n if (!path || lastSendPath == pathKey) return;\n\n lastSendPath = pathKey;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // Only the first pageview can use a Cloudflare referrer as a unique arrival.\n page.unique =\n isPushState || userNavigated\n ? falseVar\n : !sameSite || (!pages && /[?&]__cf_/.test(getReferrer(trueVar)));\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n var manualPageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n window[namespace + \"_\" + pageviewText] = manualPageview;\n var defaultPageview = defaultNamespace + \"_\" + pageviewText;\n if (!window[defaultPageview]) window[defaultPageview] = manualPageview;\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw, keepalive) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback,\n undefinedVar,\n keepalive\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback, keepalive) {\n sendEvent(event, metadata, callback, keepalive);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n\n var inlineEvent = function (event) {\n var element = event.target;\n while (\n element &&\n element !== doc &&\n (!element.getAttribute || attr(element, \"simple-event\") === null)\n )\n element = element.parentNode;\n\n if (!element || element === doc) return;\n var isForm = element.tagName === \"FORM\";\n var name = attr(element, \"simple-event\");\n if (!name || isForm !== (event.type === \"submit\")) return;\n\n var metadata = { tag: element.tagName.toLowerCase() };\n var attributes = element.attributes;\n for (var i = 0; i < attributes.length; i++) {\n var attribute = attributes[i];\n if (attribute.name.indexOf(\"data-simple-event-\") === 0)\n metadata[attribute.name.slice(18).replace(/-/g, \"_\")] =\n attribute.value;\n }\n if (isForm) {\n var button = event.submitter;\n metadata.button_text = button\n ? (button.textContent || button.value || \"\")\n .replace(/\\s+/g, \" \")\n .trim()\n .slice(0, 200)\n : \"\";\n }\n sendEvent(name, metadata, undefinedVar, trueVar);\n };\n\n doc.addEventListener(\"click\", inlineEvent, falseVar);\n doc.addEventListener(\"submit\", inlineEvent, falseVar);\n\n // 404 confirmation adds a request, so existing installs must opt in.\n if (\n settings.detect404 === trueVar ||\n attr(scriptElement, \"detect-404\") == trueText\n ) {\n var detect404 = function () {\n if (\n !/\\b404\\b/.test(doc.title + \" \" + (doc.body && doc.body.textContent))\n )\n return;\n try {\n var request = new window.XMLHttpRequest();\n request.open(\"HEAD\", loc.href, trueVar);\n request.onload = function () {\n if (request.status === 404)\n sendEvent(\"page_404\", {\n url: loc.protocol + \"//\" + definedHostname + loc.pathname,\n status: 404,\n });\n };\n request.send();\n } catch (error) {}\n };\n if (doc.readyState === \"loading\")\n doc.addEventListener(\"DOMContentLoaded\", detect404, falseVar);\n else detect404();\n }\n } catch (e) {\n sendError(e);\n }\n})(\n typeof window != \"undefined\" && window,\n \"simpleanalyticscdn.com\",\n \"queue.\",\n \"cdn_latest_12\",\n \"sa\"\n);\n"],"names":["window","baseUrl","sendError","warn","type","orig","value","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","protocol","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","logSettings","settings","sa_settings","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","keepalive","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","imageUrl","keys","key","fetch","mode","credentials","catch","src","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","path","pathname","event","filename","message","timezone","start","scrolled","collectDnt","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","raw","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","parts","querySearch","shift","pathKey","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","rv","this","createEvent","initEvent","manualPageview","defaultPageview","defaultNamespace","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue","detect404","inlineEvent","element","target","parentNode","isForm","tagName","button","tag","toLowerCase","attributes","submitter","button_text","textContent","trim","title","request","XMLHttpRequest","open","href","status","url","send","readyState"],"mappings":"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"} \ No newline at end of file diff --git a/dist/v12/custom/app.js b/dist/v12/custom/app.js index 0564eba5..e61330ed 100644 --- a/dist/v12/custom/app.js +++ b/dist/v12/custom/app.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-15; f311; SRI-version; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-15; fcc2; SRI-version; v12) */ -!function(v,n,e,r,m){try{var g=undefined,y=!0,_=!1,t="true",a="https:",b="pageview",l="event",i="error",o=v.console,c="doNotTrack",w=v.navigator,s=v.location,O=s.host,u=v.document,p=w.userAgent,f="Not sending request ",d=f+"when ",x=_,h=encodeURIComponent,E=decodeURIComponent,M=JSON.stringify,S=v.addEventListener,k="https://"+e,A=u.documentElement||{},q="language",C="Height",D="scroll",$=w.userAgentData,j=D+C,H="offset"+C,R="client"+C,L="pagehide",N="platform",P="platformVersion",T="https://docs.simpleanalytics.com",U=0,I=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),V=v.screen,B=u.currentScript||u.querySelector('script[src*="'+e+'"]');m=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){m("Error in your "+t+" function:",e)},z=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},W=function(t){return"string"==typeof t},G=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},J=function(t,e){return t&&t.getAttribute("data-"+e)},X=function(t){return Array.isArray(t)?t:W(t)&&t.length?t.split(/, ?/):[]},Y=function(t){return t&&t.constructor===Object},Z=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},it=function(t){return"function"==typeof t},ot="namespace",ct=n[ot]||J(B,ot)||"sa",st=function(t,e){var n=v[ct+"_metadata"];Y(n)&&(t=Z(t,n));var r=v[kt];if(!it(r))return kt&&m(kt+" not found, set window."+kt),t;try{return Z(t,r.call(v,Z(t,e)))}catch(a){F("metadata",a)}},ut=n.strictUtm||J(B,"strict-utm")==t,lt=function(i,t){tt=!i&&nt("q")?"":_;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");tt!==_&&0"); +!function(v,e,n,m){var r,a,t;if(v)try{var g=undefined,y=!0,_=!1,i="true",o="https:",w="pageview",l="event",c="error",s=v.console,u="doNotTrack",b=v.navigator,f=v.location,x=f.host,p=v.document,d=b.userAgent,h="Not sending request ",E=h+"when ",O=_,M=encodeURIComponent,S=decodeURIComponent,k=JSON.stringify,A=v.addEventListener,q="https://"+e,C=p.documentElement||{},D="language",$="Height",H="scroll",R=b.userAgentData,j=H+$,L="offset"+$,N="client"+$,P="pagehide",T="platform",U="platformVersion",I="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(d)&&!/(cubot)/i.test(d),F=v.screen,z=p.currentScript||p.querySelector('script[src*="'+e+'"]');m=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(s.warn,s,t)};var W=function(t,e){m("Error in your "+t+" function:",e)},G=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},J=function(t){return"string"==typeof t},X=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},Y=function(t,e){return t&&t.getAttribute("data-"+e)},Z=function(t){return Array.isArray(t)?t:J(t)&&t.length?t.split(/, ?/):[]},K=function(t){return t&&t.constructor===Object},Q=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},ct=function(t){return"function"==typeof t},st="namespace",ut=et[st]||Y(z,st)||"sa",lt=function(t,e){var n=v[ut+"_metadata"];K(n)&&(t=Q(t,n));var r=v[qt];if(!ct(r))return qt&&m(qt+" not found, set window."+qt),t;try{return Q(t,r.call(v,Q(t,e)))}catch(a){W("metadata",a)}},ft=et.strictUtm||Y(z,"strict-utm")==i,pt=function(i,t){nt=!i&&at("q")?"":_;var e=(t||f.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");nt!==_&&0"); //# sourceMappingURL=app.js.map \ No newline at end of file diff --git a/dist/v12/custom/app.js.map b/dist/v12/custom/app.js.map index 16cdcd1c..c2da3efc 100644 --- a/dist/v12/custom/app.js.map +++ b/dist/v12/custom/app.js.map @@ -1 +1 @@ -{"version":3,"file":"app.source.js","sources":["app.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData, keepalive) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n var imageUrl =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n\n // Events must survive navigation without taking over links or forms.\n if (keepalive && window.fetch) {\n try {\n window\n .fetch(imageUrl, {\n keepalive: trueVar,\n mode: \"no-cors\",\n credentials: \"omit\",\n })\n .catch(function () {\n image.src = imageUrl;\n });\n return;\n } catch (error) {}\n }\n image.src = imageUrl;\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = trueVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function (raw) {\n // Customers can overwrite their referrer, here we check for that\n var referrer =\n overwriteOptions.referrer ||\n attr(scriptElement, \"referrer\") ||\n doc.referrer ||\n \"\";\n\n if (raw) return referrer;\n return (\n referrer\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch = \"\";\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n var pathKey = path + querySearch;\n if (!path || lastSendPath == pathKey) return;\n\n lastSendPath = pathKey;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // Only the first pageview can use a Cloudflare referrer as a unique arrival.\n page.unique =\n isPushState || userNavigated\n ? falseVar\n : !sameSite || (!pages && /[?&]__cf_/.test(getReferrer(trueVar)));\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n var manualPageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n window[namespace + \"_\" + pageviewText] = manualPageview;\n var defaultPageview = defaultNamespace + \"_\" + pageviewText;\n if (!window[defaultPageview]) window[defaultPageview] = manualPageview;\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw, keepalive) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback,\n undefinedVar,\n keepalive\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback, keepalive) {\n sendEvent(event, metadata, callback, keepalive);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n\n var inlineEvent = function (event) {\n var element = event.target;\n while (\n element &&\n element !== doc &&\n (!element.getAttribute || attr(element, \"simple-event\") === null)\n )\n element = element.parentNode;\n\n if (!element || element === doc) return;\n var isForm = element.tagName === \"FORM\";\n var name = attr(element, \"simple-event\");\n if (!name || isForm !== (event.type === \"submit\")) return;\n\n var metadata = { tag: element.tagName.toLowerCase() };\n var attributes = element.attributes;\n for (var i = 0; i < attributes.length; i++) {\n var attribute = attributes[i];\n if (attribute.name.indexOf(\"data-simple-event-\") === 0)\n metadata[attribute.name.slice(18).replace(/-/g, \"_\")] =\n attribute.value;\n }\n if (isForm) {\n var button = event.submitter;\n metadata.button_text = button\n ? (button.textContent || button.value || \"\")\n .replace(/\\s+/g, \" \")\n .trim()\n .slice(0, 200)\n : \"\";\n }\n sendEvent(name, metadata, undefinedVar, trueVar);\n };\n\n doc.addEventListener(\"click\", inlineEvent, falseVar);\n doc.addEventListener(\"submit\", inlineEvent, falseVar);\n\n // 404 confirmation adds a request, so existing installs must opt in.\n if (\n overwriteOptions.detect404 === trueVar ||\n attr(scriptElement, \"detect-404\") == trueText\n ) {\n var detect404 = function () {\n if (\n !/\\b404\\b/.test(doc.title + \" \" + (doc.body && doc.body.textContent))\n )\n return;\n try {\n var request = new window.XMLHttpRequest();\n request.open(\"HEAD\", loc.href, trueVar);\n request.onload = function () {\n if (request.status === 404)\n sendEvent(\"page_404\", {\n url: loc.protocol + \"//\" + definedHostname + loc.pathname,\n status: 404,\n });\n };\n request.send();\n } catch (error) {}\n };\n if (doc.readyState === \"loading\")\n doc.addEventListener(\"DOMContentLoaded\", detect404, falseVar);\n else detect404();\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_app_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","keepalive","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","imageUrl","key","fetch","mode","credentials","catch","src","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","protocol","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","raw","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","parts","querySearch","shift","pathKey","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","manualPageview","defaultPageview","defaultNamespace","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue","detect404","inlineEvent","element","target","parentNode","isForm","tagName","button","tag","toLowerCase","attributes","submitter","button_text","textContent","trim","title","request","XMLHttpRequest","open","href","status","url","send","readyState"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"app.source.js","sources":["app.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n // Only initialize in a browser.\n if (!window) return;\n\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings;\n settings = assign(settings);\n\n if (logSettings) warn(\"Settings\", settings);\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n settings.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n settings[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n settings.strictUtm || attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData, keepalive) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n var imageUrl =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n\n // Events must survive navigation without taking over links or forms.\n if (keepalive && window.fetch) {\n try {\n window\n .fetch(imageUrl, {\n keepalive: trueVar,\n mode: \"no-cors\",\n credentials: \"omit\",\n })\n .catch(function () {\n image.src = imageUrl;\n });\n return;\n } catch (error) {}\n }\n image.src = imageUrl;\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n settings.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = settings.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(settings.collectDnt)\n ? settings.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n settings.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n settings.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n settings.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n settings.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n settings.nonUniqueHostnames || attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n settings.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n settings.metadataCollector || attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = trueVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function (raw) {\n // Customers can overwrite their referrer, here we check for that\n var referrer =\n settings.referrer ||\n attr(scriptElement, \"referrer\") ||\n doc.referrer ||\n \"\";\n\n if (raw) return referrer;\n return (\n referrer\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch = \"\";\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n var pathKey = path + querySearch;\n if (!path || lastSendPath == pathKey) return;\n\n lastSendPath = pathKey;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // Only the first pageview can use a Cloudflare referrer as a unique arrival.\n page.unique =\n isPushState || userNavigated\n ? falseVar\n : !sameSite || (!pages && /[?&]__cf_/.test(getReferrer(trueVar)));\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n var manualPageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n window[namespace + \"_\" + pageviewText] = manualPageview;\n var defaultPageview = defaultNamespace + \"_\" + pageviewText;\n if (!window[defaultPageview]) window[defaultPageview] = manualPageview;\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw, keepalive) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback,\n undefinedVar,\n keepalive\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback, keepalive) {\n sendEvent(event, metadata, callback, keepalive);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n\n var inlineEvent = function (event) {\n var element = event.target;\n while (\n element &&\n element !== doc &&\n (!element.getAttribute || attr(element, \"simple-event\") === null)\n )\n element = element.parentNode;\n\n if (!element || element === doc) return;\n var isForm = element.tagName === \"FORM\";\n var name = attr(element, \"simple-event\");\n if (!name || isForm !== (event.type === \"submit\")) return;\n\n var metadata = { tag: element.tagName.toLowerCase() };\n var attributes = element.attributes;\n for (var i = 0; i < attributes.length; i++) {\n var attribute = attributes[i];\n if (attribute.name.indexOf(\"data-simple-event-\") === 0)\n metadata[attribute.name.slice(18).replace(/-/g, \"_\")] =\n attribute.value;\n }\n if (isForm) {\n var button = event.submitter;\n metadata.button_text = button\n ? (button.textContent || button.value || \"\")\n .replace(/\\s+/g, \" \")\n .trim()\n .slice(0, 200)\n : \"\";\n }\n sendEvent(name, metadata, undefinedVar, trueVar);\n };\n\n doc.addEventListener(\"click\", inlineEvent, falseVar);\n doc.addEventListener(\"submit\", inlineEvent, falseVar);\n\n // 404 confirmation adds a request, so existing installs must opt in.\n if (\n settings.detect404 === trueVar ||\n attr(scriptElement, \"detect-404\") == trueText\n ) {\n var detect404 = function () {\n if (\n !/\\b404\\b/.test(doc.title + \" \" + (doc.body && doc.body.textContent))\n )\n return;\n try {\n var request = new window.XMLHttpRequest();\n request.open(\"HEAD\", loc.href, trueVar);\n request.onload = function () {\n if (request.status === 404)\n sendEvent(\"page_404\", {\n url: loc.protocol + \"//\" + definedHostname + loc.pathname,\n status: 404,\n });\n };\n request.send();\n } catch (error) {}\n };\n if (doc.readyState === \"loading\")\n doc.addEventListener(\"DOMContentLoaded\", detect404, falseVar);\n else detect404();\n }\n } catch (e) {\n sendError(e);\n }\n})(\n typeof window != \"undefined\" && window,\n \"\",\n \"\",\n \"custom_app_12\",\n \"sa\"\n);\n"],"names":["window","baseUrl","sendError","warn","type","orig","value","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","logSettings","settings","sa_settings","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","keepalive","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","imageUrl","keys","key","fetch","mode","credentials","catch","src","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","path","pathname","event","filename","message","timezone","start","scrolled","collectDnt","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","protocol","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","raw","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","parts","querySearch","shift","pathKey","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","rv","this","createEvent","initEvent","manualPageview","defaultPageview","defaultNamespace","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue","detect404","inlineEvent","element","target","parentNode","isForm","tagName","button","tag","toLowerCase","attributes","submitter","button_text","textContent","trim","title","request","XMLHttpRequest","open","href","status","url","send","readyState"],"mappings":"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"} \ No newline at end of file diff --git a/dist/v12/custom/light.js b/dist/v12/custom/light.js index 498b73a6..51ab72ba 100644 --- a/dist/v12/custom/light.js +++ b/dist/v12/custom/light.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-15; 72ea; SRI-version; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-15; edd8; SRI-version; v12) */ -!function(f,e,t,m){try{var u=undefined,n="https:",r=f.console,a="doNotTrack",g=f.navigator,p=f.location,h=p.host,i=f.document,o=g.userAgent,c="Not sending request ",v=!1,s=encodeURIComponent,d=decodeURIComponent,l=JSON.stringify,y=f.addEventListener,_="https://"+t,b=(i.documentElement,"language"),w=g.userAgentData,O="platform",S="platformVersion",j="https://docs.simpleanalytics.com",k=/(bot|spider|crawl)/i.test(o)&&!/(cubot)/i.test(o),x=i.currentScript||i.querySelector('script[src*="'+t+'"]');m=function(){var e=[].slice.call(arguments);return e.unshift("Simple Analytics:"),Function.prototype.apply.call(r.warn,r,e)};var E=function(e){return"string"==typeof e},A=function(e,t){return e&&e.getAttribute("data-"+t)},$=function(){for(var e,t,n,r={},a=arguments,i=0;i>e/4).toString(16)})}catch(r){return e.replace(n,function(e){var t=16*Math.random()|0;return(e<2?t:3&t|8).toString(16)})}},N=function(e){return"function"==typeof e},R="namespace",U=e[R]||A(x,R)||"sa",V=e.strictUtm||"true"==A(x,"strict-utm"),B=U+"_loaded";if(1==f[B])return m(c+"twice");f.sa_event_loaded=!0,f[B]=!0;var C,H=function(t,e,n,r){t=n?t:$(J,M,t),g.brave&&!n&&(t.brave=!0),g._duckduckgoloader_&&!n&&(t.duck=!0);var a=new Image,i=_+"/simple.gif?"+Object.keys(t).filter(function(e){return t[e]!=u}).map(function(e){return s(e)+"="+s(t[e])}).join("&")+"&time="+Date.now();a.src=i},T=e.hostname||A(x,"hostname"),F=T||h,z={version:"custom_light_12",hostname:F};e.mode||A(x,"mode");try{C=Intl.DateTimeFormat().resolvedOptions().timeZone}catch(X){m(X)}k&&(z.bot=!0);var J=$(z,{ua:o,https:p.protocol==n,timezone:C,page_id:I(),session_id:I()});if(J.sri=!0,w&&(J.mobile=w.mobile,J.brands=l(w.brands)),F!==h&&(J.hostname_original=h),a in g&&"1"==g[a])return m("Not sending request when "+a+" is enabled. See "+j+"/dnt");-1!=h.indexOf(".")&&!/^[0-9.:]+$/.test(h)||T||m("Set hostname on "+h+". See "+j+"/overwrite-domain-name");var L,M={},P=(e.referrer||A(x,"referrer")||i.referrer||"").replace(h,F).replace(/^https?:\/\/((m|l|w{2,3}([0-9]+)?)\.)?([^?#]+)(.*)$/,"$4").replace(/^([^/]+)$/,"$1")||u,Z=function(e,t){var n=$(z,{type:"append",original_id:t?e:J.page_id});if(t||!g.sendBeacon)H(n,0,!0);else try{g.sendBeacon.bind(g)(_+"/append",l(n))}catch(r){H(n,0,!0)}};y("pagehide",Z,!1);var G,K,Q=function(e){var t="";try{t=e||d(p.pathname)}catch(X){m(X)}return t},W=function(e,t,n,r,a,i){e&&Z(""+J.page_id,!0),J.page_id=I();var o,c=F+Q(),s=(o=t,(r||p.search).slice(1).split("&").filter(function(e){return!o&&new RegExp("^((utm_)"+(V?"":"?")+"(source|medium|content|term|campaign)"+(V?"":"|ref")+")=","i").test(e)}).join("&")||u);H({id:J.page_id,type:"pageview",referrer:!t||n?P:null,query:s}),P=c,0};!function(e,t,n,r){!r&&N(n)&&(r=n);N(r);var a,i="";E(t)&&-1"); +!function(f,e,m){if(f)try{var u=undefined,t="https:",n=f.console,r="doNotTrack",g=f.navigator,p=f.location,h=p.host,i=f.document,a=g.userAgent,o="Not sending request ",v=!1,c=encodeURIComponent,s=decodeURIComponent,d=JSON.stringify,l=f.addEventListener,y="https://"+e,_=(i.documentElement,"language"),w=g.userAgentData,b="platform",O="platformVersion",S="https://docs.simpleanalytics.com",j=/(bot|spider|crawl)/i.test(a)&&!/(cubot)/i.test(a),k=i.currentScript||i.querySelector('script[src*="'+e+'"]');m=function(){var e=[].slice.call(arguments);return e.unshift("Simple Analytics:"),Function.prototype.apply.call(n.warn,n,e)};var x=function(e){return"string"==typeof e},E=function(e,t){return e&&e.getAttribute("data-"+t)},A=function(){for(var e,t,n,r={},i=arguments,a=0;a>e/4).toString(16)})}catch(r){return e.replace(n,function(e){var t=16*Math.random()|0;return(e<2?t:3&t|8).toString(16)})}},I=function(e){return"function"==typeof e},N="namespace",R=q[N]||E(k,N)||"sa",U=q.strictUtm||"true"==E(k,"strict-utm"),V=R+"_loaded";if(1==f[V])return m(o+"twice");f.sa_event_loaded=!0,f[V]=!0;var B,C=function(t,e,n,r){t=n?t:A(z,L,t),g.brave&&!n&&(t.brave=!0),g._duckduckgoloader_&&!n&&(t.duck=!0);var i=new Image,a=y+"/simple.gif?"+Object.keys(t).filter(function(e){return t[e]!=u}).map(function(e){return c(e)+"="+c(t[e])}).join("&")+"&time="+Date.now();i.src=a},H=q.hostname||E(k,"hostname"),T=H||h,F={version:"custom_light_12",hostname:T};q.mode||E(k,"mode");try{B=Intl.DateTimeFormat().resolvedOptions().timeZone}catch(W){m(W)}j&&(F.bot=!0);var z=A(F,{ua:a,https:p.protocol==t,timezone:B,page_id:D(),session_id:D()});if(z.sri=!0,w&&(z.mobile=w.mobile,z.brands=d(w.brands)),T!==h&&(z.hostname_original=h),r in g&&"1"==g[r])return m("Not sending request when "+r+" is enabled. See "+S+"/dnt");-1!=h.indexOf(".")&&!/^[0-9.:]+$/.test(h)||H||m("Set hostname on "+h+". See "+S+"/overwrite-domain-name");var J,L={},M=(q.referrer||E(k,"referrer")||i.referrer||"").replace(h,T).replace(/^https?:\/\/((m|l|w{2,3}([0-9]+)?)\.)?([^?#]+)(.*)$/,"$4").replace(/^([^/]+)$/,"$1")||u,P=function(e,t){var n=A(F,{type:"append",original_id:t?e:z.page_id});if(t||!g.sendBeacon)C(n,0,!0);else try{g.sendBeacon.bind(g)(y+"/append",d(n))}catch(r){C(n,0,!0)}};l("pagehide",P,!1);var Z,G,K=function(e){var t="";try{t=e||s(p.pathname)}catch(W){m(W)}return t},Q=function(e,t,n,r,i,a){e&&P(""+z.page_id,!0),z.page_id=D();var o,c=T+K(),s=(o=t,(r||p.search).slice(1).split("&").filter(function(e){return!o&&new RegExp("^((utm_)"+(U?"":"?")+"(source|medium|content|term|campaign)"+(U?"":"|ref")+")=","i").test(e)}).join("&")||u);C({id:z.page_id,type:"pageview",referrer:!t||n?M:null,query:s}),M=c,0};!function(e,t,n,r){!r&&I(n)&&(r=n);I(r);var i,a="";x(t)&&-1"); //# sourceMappingURL=light.js.map \ No newline at end of file diff --git a/dist/v12/custom/light.js.map b/dist/v12/custom/light.js.map index 3cd75b0b..97df90a2 100644 --- a/dist/v12/custom/light.js.map +++ b/dist/v12/custom/light.js.map @@ -1 +1 @@ -{"version":3,"file":"light.source.js","sources":["light.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n\n var collectMetricByString = function (metricAbbreviation) {\n // eslint-disable-next-line no-unreachable\n return true;\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n if (ignore) return falseVar;\n // eslint-disable-next-line no-redeclare\n var regex =\n \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \")=\";\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n return q || undefinedVar;\n };\n\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData, keepalive) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n var imageUrl =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n\n image.src = imageUrl;\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n\n\n\n\n\n\n\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n // eslint-disable-next-line no-redeclare\n var bot = isBotAgent;\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = trueVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function (raw) {\n // Customers can overwrite their referrer, here we check for that\n var referrer =\n overwriteOptions.referrer ||\n attr(scriptElement, \"referrer\") ||\n doc.referrer ||\n \"\";\n\n return (\n referrer\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n\n\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch = \"\";\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n var pathKey = path + querySearch;\n if (!path || lastSendPath == pathKey) return;\n\n lastSendPath = pathKey;\n page.path = path;\n\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n sameSite = referrer\n ? referrer.split(slash)[0] == locationHostname\n : falseVar;\n\n\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n\n\n pageview();\n\n } catch (e) {\n warn(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_light_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","warn","undefinedVar","undefined","https","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","language","documentElement","uaData","userAgentData","platformText","platformVersionText","docsUrl","isBotAgent","test","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","isString","string","attr","attribute","getAttribute","assign","obj","prop","object","to","arg","index","length","nextSource","constructor","Object","nextKey","hasOwnProperty","settings","sa_settings","logSettings","keys","Date","now","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","replace","c","getRandomValues","Uint8Array","toString","error","r","Math","random","isFunction","func","namespaceText","namespace","strictUtm","loadedVariable","sa_event_loaded","timezone","sendData","data","callback","onlyThisData","keepalive","payload","page","brave","_duckduckgoloader_","duck","image","Image","imageUrl","filter","key","map","join","src","overwrittenHostname","hostname","definedHostname","basePayload","version","mode","Intl","DateTimeFormat","resolvedOptions","timeZone","bot","ua","protocol","page_id","session_id","sri","mobile","brands","hostname_original","indexOf","lastSendPath","referrer","sendOnLeave","id","push","append","type","original_id","sendBeacon","bind","e","sameSite","userNavigated","getPath","overwrite","path","pathname","sendPageView","isPushState","deleteSourceInfo","search","metadata","ignoreSource","currentPage","query","split","keyValue","RegExp","pages","pathOverwrite","callbackRaw","parts","querySearch","shift","pathKey","performaceEntryType","perf","performance","navigationText","getEntriesByType","triggerSendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","pageview"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"light.source.js","sources":["light.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n // Only initialize in a browser.\n if (!window) return;\n\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings;\n settings = assign(settings);\n\n if (logSettings) warn(\"Settings\", settings);\n\n\n var collectMetricByString = function (metricAbbreviation) {\n // eslint-disable-next-line no-unreachable\n return true;\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n settings[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n settings.strictUtm || attr(scriptElement, \"strict-utm\") == trueText;\n\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n if (ignore) return falseVar;\n // eslint-disable-next-line no-redeclare\n var regex =\n \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \")=\";\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n return q || undefinedVar;\n };\n\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData, keepalive) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n var imageUrl =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n\n image.src = imageUrl;\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n settings.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = settings.mode || attr(scriptElement, \"mode\");\n\n\n\n\n\n\n\n\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n // eslint-disable-next-line no-redeclare\n var bot = isBotAgent;\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = trueVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function (raw) {\n // Customers can overwrite their referrer, here we check for that\n var referrer =\n settings.referrer ||\n attr(scriptElement, \"referrer\") ||\n doc.referrer ||\n \"\";\n\n return (\n referrer\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n\n\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch = \"\";\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n var pathKey = path + querySearch;\n if (!path || lastSendPath == pathKey) return;\n\n lastSendPath = pathKey;\n page.path = path;\n\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n sameSite = referrer\n ? referrer.split(slash)[0] == locationHostname\n : falseVar;\n\n\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n\n\n pageview();\n\n } catch (e) {\n warn(e);\n }\n})(\n typeof window != \"undefined\" && window,\n \"\",\n \"\",\n \"custom_light_12\",\n \"sa\"\n);\n"],"names":["window","baseUrl","warn","undefinedVar","undefined","https","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","language","documentElement","uaData","userAgentData","platformText","platformVersionText","docsUrl","isBotAgent","test","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","isString","string","attr","attribute","getAttribute","assign","obj","prop","object","to","arg","index","length","nextSource","constructor","Object","nextKey","hasOwnProperty","logSettings","settings","sa_settings","Date","now","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","replace","c","getRandomValues","Uint8Array","toString","error","r","Math","random","isFunction","func","namespaceText","namespace","strictUtm","loadedVariable","sa_event_loaded","timezone","sendData","data","callback","onlyThisData","keepalive","payload","page","brave","_duckduckgoloader_","duck","image","Image","imageUrl","keys","filter","key","map","join","src","overwrittenHostname","hostname","definedHostname","basePayload","version","mode","Intl","DateTimeFormat","resolvedOptions","timeZone","bot","ua","protocol","page_id","session_id","sri","mobile","brands","hostname_original","indexOf","lastSendPath","referrer","sendOnLeave","id","push","append","type","original_id","sendBeacon","bind","e","sameSite","userNavigated","getPath","overwrite","path","pathname","sendPageView","isPushState","deleteSourceInfo","search","metadata","ignoreSource","currentPage","query","split","keyValue","RegExp","pages","pathOverwrite","callbackRaw","parts","querySearch","shift","pathKey","performaceEntryType","perf","performance","navigationText","getEntriesByType","triggerSendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","pageview"],"mappings":"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"} \ No newline at end of file diff --git a/dist/v12/custom/proxy.js b/dist/v12/custom/proxy.js index ddeebf2b..5cab442a 100644 --- a/dist/v12/custom/proxy.js +++ b/dist/v12/custom/proxy.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-15; 382b; SRI-version; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-15; a36f; SRI-version; v12) */ -!function(v,n,e,r,m){try{var g=undefined,y=!0,_=!1,t="true",a="https:",b="pageview",l="event",i="error",o=v.console,c="doNotTrack",w=v.navigator,s=v.location,x=s.host,u=v.document,f=w.userAgent,p="Not sending request ",d=p+"when ",O=_,h=encodeURIComponent,E=decodeURIComponent,M=JSON.stringify,S=v.addEventListener,k="https://"+e,A=u.documentElement||{},q="language",C="Height",D="scroll",$=w.userAgentData,j=D+C,H="offset"+C,R="client"+C,L="pagehide",N="platform",P="platformVersion",T="https://docs.simpleanalytics.com",U=0,I=/(bot|spider|crawl)/i.test(f)&&!/(cubot)/i.test(f),V=v.screen,B=u.currentScript||u.querySelector('script[src*="'+e+'"]');m=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){m("Error in your "+t+" function:",e)},z=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},W=function(t){return"string"==typeof t},G=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},J=function(t,e){return t&&t.getAttribute("data-"+e)},X=function(t){return Array.isArray(t)?t:W(t)&&t.length?t.split(/, ?/):[]},Y=function(t){return t&&t.constructor===Object},Z=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},it=function(t){return"function"==typeof t},ot="namespace",ct=n[ot]||J(B,ot)||"sa",st=function(t,e){var n=v[ct+"_metadata"];Y(n)&&(t=Z(t,n));var r=v[kt];if(!it(r))return kt&&m(kt+" not found, set window."+kt),t;try{return Z(t,r.call(v,Z(t,e)))}catch(a){F("metadata",a)}},ut=n.strictUtm||J(B,"strict-utm")==t,lt=function(i,t){tt=!i&&nt("q")?"":_;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");tt!==_&&0"); +!function(v,e,n,m){var r,a,t;if(v)try{var g=undefined,y=!0,_=!1,i="true",o="https:",w="pageview",l="event",c="error",s=v.console,u="doNotTrack",b=v.navigator,f=v.location,x=f.host,p=v.document,d=b.userAgent,h="Not sending request ",E=h+"when ",O=_,M=encodeURIComponent,S=decodeURIComponent,k=JSON.stringify,A=v.addEventListener,q="https://"+e,C=p.documentElement||{},D="language",$="Height",H="scroll",R=b.userAgentData,j=H+$,L="offset"+$,N="client"+$,P="pagehide",T="platform",U="platformVersion",I="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(d)&&!/(cubot)/i.test(d),F=v.screen,z=p.currentScript||p.querySelector('script[src*="'+e+'"]');m=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(s.warn,s,t)};var W=function(t,e){m("Error in your "+t+" function:",e)},G=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},J=function(t){return"string"==typeof t},X=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},Y=function(t,e){return t&&t.getAttribute("data-"+e)},Z=function(t){return Array.isArray(t)?t:J(t)&&t.length?t.split(/, ?/):[]},K=function(t){return t&&t.constructor===Object},Q=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},ct=function(t){return"function"==typeof t},st="namespace",ut=et[st]||Y(z,st)||"sa",lt=function(t,e){var n=v[ut+"_metadata"];K(n)&&(t=Q(t,n));var r=v[qt];if(!ct(r))return qt&&m(qt+" not found, set window."+qt),t;try{return Q(t,r.call(v,Q(t,e)))}catch(a){W("metadata",a)}},ft=et.strictUtm||Y(z,"strict-utm")==i,pt=function(i,t){nt=!i&&at("q")?"":_;var e=(t||f.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");nt!==_&&0"); //# sourceMappingURL=proxy.js.map \ No newline at end of file diff --git a/dist/v12/custom/proxy.js.map b/dist/v12/custom/proxy.js.map index d846c28e..db13d56b 100644 --- a/dist/v12/custom/proxy.js.map +++ b/dist/v12/custom/proxy.js.map @@ -1 +1 @@ -{"version":3,"file":"proxy.source.js","sources":["proxy.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData, keepalive) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n var imageUrl =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n\n // Events must survive navigation without taking over links or forms.\n if (keepalive && window.fetch) {\n try {\n window\n .fetch(imageUrl, {\n keepalive: trueVar,\n mode: \"no-cors\",\n credentials: \"omit\",\n })\n .catch(function () {\n image.src = imageUrl;\n });\n return;\n } catch (error) {}\n }\n image.src = imageUrl;\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = trueVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function (raw) {\n // Customers can overwrite their referrer, here we check for that\n var referrer =\n overwriteOptions.referrer ||\n attr(scriptElement, \"referrer\") ||\n doc.referrer ||\n \"\";\n\n if (raw) return referrer;\n return (\n referrer\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch = \"\";\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n var pathKey = path + querySearch;\n if (!path || lastSendPath == pathKey) return;\n\n lastSendPath = pathKey;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // Only the first pageview can use a Cloudflare referrer as a unique arrival.\n page.unique =\n isPushState || userNavigated\n ? falseVar\n : !sameSite || (!pages && /[?&]__cf_/.test(getReferrer(trueVar)));\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n var manualPageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n window[namespace + \"_\" + pageviewText] = manualPageview;\n var defaultPageview = defaultNamespace + \"_\" + pageviewText;\n if (!window[defaultPageview]) window[defaultPageview] = manualPageview;\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw, keepalive) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback,\n undefinedVar,\n keepalive\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback, keepalive) {\n sendEvent(event, metadata, callback, keepalive);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n\n var inlineEvent = function (event) {\n var element = event.target;\n while (\n element &&\n element !== doc &&\n (!element.getAttribute || attr(element, \"simple-event\") === null)\n )\n element = element.parentNode;\n\n if (!element || element === doc) return;\n var isForm = element.tagName === \"FORM\";\n var name = attr(element, \"simple-event\");\n if (!name || isForm !== (event.type === \"submit\")) return;\n\n var metadata = { tag: element.tagName.toLowerCase() };\n var attributes = element.attributes;\n for (var i = 0; i < attributes.length; i++) {\n var attribute = attributes[i];\n if (attribute.name.indexOf(\"data-simple-event-\") === 0)\n metadata[attribute.name.slice(18).replace(/-/g, \"_\")] =\n attribute.value;\n }\n if (isForm) {\n var button = event.submitter;\n metadata.button_text = button\n ? (button.textContent || button.value || \"\")\n .replace(/\\s+/g, \" \")\n .trim()\n .slice(0, 200)\n : \"\";\n }\n sendEvent(name, metadata, undefinedVar, trueVar);\n };\n\n doc.addEventListener(\"click\", inlineEvent, falseVar);\n doc.addEventListener(\"submit\", inlineEvent, falseVar);\n\n // 404 confirmation adds a request, so existing installs must opt in.\n if (\n overwriteOptions.detect404 === trueVar ||\n attr(scriptElement, \"detect-404\") == trueText\n ) {\n var detect404 = function () {\n if (\n !/\\b404\\b/.test(doc.title + \" \" + (doc.body && doc.body.textContent))\n )\n return;\n try {\n var request = new window.XMLHttpRequest();\n request.open(\"HEAD\", loc.href, trueVar);\n request.onload = function () {\n if (request.status === 404)\n sendEvent(\"page_404\", {\n url: loc.protocol + \"//\" + definedHostname + loc.pathname,\n status: 404,\n });\n };\n request.send();\n } catch (error) {}\n };\n if (doc.readyState === \"loading\")\n doc.addEventListener(\"DOMContentLoaded\", detect404, falseVar);\n else detect404();\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_proxy_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","keepalive","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","imageUrl","key","fetch","mode","credentials","catch","src","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","protocol","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","raw","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","parts","querySearch","shift","pathKey","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","manualPageview","defaultPageview","defaultNamespace","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue","detect404","inlineEvent","element","target","parentNode","isForm","tagName","button","tag","toLowerCase","attributes","submitter","button_text","textContent","trim","title","request","XMLHttpRequest","open","href","status","url","send","readyState"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"proxy.source.js","sources":["proxy.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n // Only initialize in a browser.\n if (!window) return;\n\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings;\n settings = assign(settings);\n\n if (logSettings) warn(\"Settings\", settings);\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n settings.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n settings[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n settings.strictUtm || attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData, keepalive) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n var imageUrl =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n\n // Events must survive navigation without taking over links or forms.\n if (keepalive && window.fetch) {\n try {\n window\n .fetch(imageUrl, {\n keepalive: trueVar,\n mode: \"no-cors\",\n credentials: \"omit\",\n })\n .catch(function () {\n image.src = imageUrl;\n });\n return;\n } catch (error) {}\n }\n image.src = imageUrl;\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n settings.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = settings.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(settings.collectDnt)\n ? settings.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n settings.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n settings.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n settings.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n settings.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n settings.nonUniqueHostnames || attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n settings.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n settings.metadataCollector || attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = trueVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function (raw) {\n // Customers can overwrite their referrer, here we check for that\n var referrer =\n settings.referrer ||\n attr(scriptElement, \"referrer\") ||\n doc.referrer ||\n \"\";\n\n if (raw) return referrer;\n return (\n referrer\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch = \"\";\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n var pathKey = path + querySearch;\n if (!path || lastSendPath == pathKey) return;\n\n lastSendPath = pathKey;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // Only the first pageview can use a Cloudflare referrer as a unique arrival.\n page.unique =\n isPushState || userNavigated\n ? falseVar\n : !sameSite || (!pages && /[?&]__cf_/.test(getReferrer(trueVar)));\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n var manualPageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n window[namespace + \"_\" + pageviewText] = manualPageview;\n var defaultPageview = defaultNamespace + \"_\" + pageviewText;\n if (!window[defaultPageview]) window[defaultPageview] = manualPageview;\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw, keepalive) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback,\n undefinedVar,\n keepalive\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback, keepalive) {\n sendEvent(event, metadata, callback, keepalive);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n\n var inlineEvent = function (event) {\n var element = event.target;\n while (\n element &&\n element !== doc &&\n (!element.getAttribute || attr(element, \"simple-event\") === null)\n )\n element = element.parentNode;\n\n if (!element || element === doc) return;\n var isForm = element.tagName === \"FORM\";\n var name = attr(element, \"simple-event\");\n if (!name || isForm !== (event.type === \"submit\")) return;\n\n var metadata = { tag: element.tagName.toLowerCase() };\n var attributes = element.attributes;\n for (var i = 0; i < attributes.length; i++) {\n var attribute = attributes[i];\n if (attribute.name.indexOf(\"data-simple-event-\") === 0)\n metadata[attribute.name.slice(18).replace(/-/g, \"_\")] =\n attribute.value;\n }\n if (isForm) {\n var button = event.submitter;\n metadata.button_text = button\n ? (button.textContent || button.value || \"\")\n .replace(/\\s+/g, \" \")\n .trim()\n .slice(0, 200)\n : \"\";\n }\n sendEvent(name, metadata, undefinedVar, trueVar);\n };\n\n doc.addEventListener(\"click\", inlineEvent, falseVar);\n doc.addEventListener(\"submit\", inlineEvent, falseVar);\n\n // 404 confirmation adds a request, so existing installs must opt in.\n if (\n settings.detect404 === trueVar ||\n attr(scriptElement, \"detect-404\") == trueText\n ) {\n var detect404 = function () {\n if (\n !/\\b404\\b/.test(doc.title + \" \" + (doc.body && doc.body.textContent))\n )\n return;\n try {\n var request = new window.XMLHttpRequest();\n request.open(\"HEAD\", loc.href, trueVar);\n request.onload = function () {\n if (request.status === 404)\n sendEvent(\"page_404\", {\n url: loc.protocol + \"//\" + definedHostname + loc.pathname,\n status: 404,\n });\n };\n request.send();\n } catch (error) {}\n };\n if (doc.readyState === \"loading\")\n doc.addEventListener(\"DOMContentLoaded\", detect404, falseVar);\n else detect404();\n }\n } catch (e) {\n sendError(e);\n }\n})(\n typeof window != \"undefined\" && window,\n \"\",\n \"\",\n \"custom_proxy_12\",\n \"sa\"\n);\n"],"names":["window","baseUrl","sendError","warn","type","orig","value","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","logSettings","settings","sa_settings","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","keepalive","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","imageUrl","keys","key","fetch","mode","credentials","catch","src","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","path","pathname","event","filename","message","timezone","start","scrolled","collectDnt","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","protocol","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","raw","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","parts","querySearch","shift","pathKey","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","rv","this","createEvent","initEvent","manualPageview","defaultPageview","defaultNamespace","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue","detect404","inlineEvent","element","target","parentNode","isForm","tagName","button","tag","toLowerCase","attributes","submitter","button_text","textContent","trim","title","request","XMLHttpRequest","open","href","status","url","send","readyState"],"mappings":"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"} \ No newline at end of file diff --git a/dist/v12/light.js b/dist/v12/light.js index 9b3f624b..b24ba6e6 100644 --- a/dist/v12/light.js +++ b/dist/v12/light.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-15; df91; SRI-version; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-15; d74a; SRI-version; v12) */ -!function(f,e,t,m){try{var u=undefined,n="https:",r=f.console,a="doNotTrack",g=f.navigator,p=f.location,h=p.host,i=f.document,o=g.userAgent,c="Not sending request ",v=!1,s=encodeURIComponent,d=decodeURIComponent,l=JSON.stringify,y=f.addEventListener,_="https://queue."+t,b=(i.documentElement,"language"),w=g.userAgentData,O="platform",S="platformVersion",j="https://docs.simpleanalytics.com",k=/(bot|spider|crawl)/i.test(o)&&!/(cubot)/i.test(o),E=i.currentScript||i.querySelector('script[src*="'+t+'"]');m=function(){var e=[].slice.call(arguments);return e.unshift("Simple Analytics:"),Function.prototype.apply.call(r.warn,r,e)};var q=function(e){return"string"==typeof e},x=function(e,t){return e&&e.getAttribute("data-"+t)},A=function(){for(var e,t,n,r={},a=arguments,i=0;i>e/4).toString(16)})}catch(r){return e.replace(n,function(e){var t=16*Math.random()|0;return(e<2?t:3&t|8).toString(16)})}},N=function(e){return"function"==typeof e},R="namespace",U=e[R]||x(E,R)||"sa",V=e.strictUtm||"true"==x(E,"strict-utm"),B=U+"_loaded";if(1==f[B])return m(c+"twice");f.sa_event_loaded=!0,f[B]=!0;var C,T=function(t,e,n,r){t=n?t:A(J,M,t),g.brave&&!n&&(t.brave=!0),g._duckduckgoloader_&&!n&&(t.duck=!0);var a=new Image,i=_+"/simple.gif?"+Object.keys(t).filter(function(e){return t[e]!=u}).map(function(e){return s(e)+"="+s(t[e])}).join("&")+"&time="+Date.now();a.src=i},F=e.hostname||x(E,"hostname"),H=F||h,z={version:"cdn_light_12",hostname:H};e.mode||x(E,"mode");try{C=Intl.DateTimeFormat().resolvedOptions().timeZone}catch(X){m(X)}k&&(z.bot=!0);var J=A(z,{ua:o,https:p.protocol==n,timezone:C,page_id:I(),session_id:I()});if(J.sri=!0,w&&(J.mobile=w.mobile,J.brands=l(w.brands)),H!==h&&(J.hostname_original=h),a in g&&"1"==g[a])return m("Not sending request when "+a+" is enabled. See "+j+"/dnt");-1!=h.indexOf(".")&&!/^[0-9.:]+$/.test(h)||F||m("Set hostname on "+h+". See "+j+"/overwrite-domain-name");var L,M={},P=(e.referrer||x(E,"referrer")||i.referrer||"").replace(h,H).replace(/^https?:\/\/((m|l|w{2,3}([0-9]+)?)\.)?([^?#]+)(.*)$/,"$4").replace(/^([^/]+)$/,"$1")||u,Z=function(e,t){var n=A(z,{type:"append",original_id:t?e:J.page_id});if(t||!g.sendBeacon)T(n,0,!0);else try{g.sendBeacon.bind(g)(_+"/append",l(n))}catch(r){T(n,0,!0)}};y("pagehide",Z,!1);var G,K,Q=function(e){var t="";try{t=e||d(p.pathname)}catch(X){m(X)}return t},W=function(e,t,n,r,a,i){e&&Z(""+J.page_id,!0),J.page_id=I();var o,c=H+Q(),s=(o=t,(r||p.search).slice(1).split("&").filter(function(e){return!o&&new RegExp("^((utm_)"+(V?"":"?")+"(source|medium|content|term|campaign)"+(V?"":"|ref")+")=","i").test(e)}).join("&")||u);T({id:J.page_id,type:"pageview",referrer:!t||n?P:null,query:s}),P=c,0};!function(e,t,n,r){!r&&N(n)&&(r=n);N(r);var a,i="";q(t)&&-1>e/4).toString(16)})}catch(r){return e.replace(n,function(e){var t=16*Math.random()|0;return(e<2?t:3&t|8).toString(16)})}},I=function(e){return"function"==typeof e},N="namespace",R=$[N]||q(k,N)||"sa",U=$.strictUtm||"true"==q(k,"strict-utm"),V=R+"_loaded";if(1==f[V])return m(o+"twice");f.sa_event_loaded=!0,f[V]=!0;var B,C=function(t,e,n,r){t=n?t:x(z,L,t),g.brave&&!n&&(t.brave=!0),g._duckduckgoloader_&&!n&&(t.duck=!0);var a=new Image,i=y+"/simple.gif?"+Object.keys(t).filter(function(e){return t[e]!=u}).map(function(e){return c(e)+"="+c(t[e])}).join("&")+"&time="+Date.now();a.src=i},T=$.hostname||q(k,"hostname"),F=T||h,H={version:"cdn_light_12",hostname:F};$.mode||q(k,"mode");try{B=Intl.DateTimeFormat().resolvedOptions().timeZone}catch(W){m(W)}j&&(H.bot=!0);var z=x(H,{ua:i,https:p.protocol==t,timezone:B,page_id:D(),session_id:D()});if(z.sri=!0,w&&(z.mobile=w.mobile,z.brands=d(w.brands)),F!==h&&(z.hostname_original=h),r in g&&"1"==g[r])return m("Not sending request when "+r+" is enabled. See "+S+"/dnt");-1!=h.indexOf(".")&&!/^[0-9.:]+$/.test(h)||T||m("Set hostname on "+h+". See "+S+"/overwrite-domain-name");var J,L={},M=($.referrer||q(k,"referrer")||a.referrer||"").replace(h,F).replace(/^https?:\/\/((m|l|w{2,3}([0-9]+)?)\.)?([^?#]+)(.*)$/,"$4").replace(/^([^/]+)$/,"$1")||u,P=function(e,t){var n=x(H,{type:"append",original_id:t?e:z.page_id});if(t||!g.sendBeacon)C(n,0,!0);else try{g.sendBeacon.bind(g)(y+"/append",d(n))}catch(r){C(n,0,!0)}};l("pagehide",P,!1);var Z,G,K=function(e){var t="";try{t=e||s(p.pathname)}catch(W){m(W)}return t},Q=function(e,t,n,r,a,i){e&&P(""+z.page_id,!0),z.page_id=D();var o,c=F+K(),s=(o=t,(r||p.search).slice(1).split("&").filter(function(e){return!o&&new RegExp("^((utm_)"+(U?"":"?")+"(source|medium|content|term|campaign)"+(U?"":"|ref")+")=","i").test(e)}).join("&")||u);C({id:z.page_id,type:"pageview",referrer:!t||n?M:null,query:s}),M=c,0};!function(e,t,n,r){!r&&I(n)&&(r=n);I(r);var a,i="";E(t)&&-1> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n if (ignore) return falseVar;\n // eslint-disable-next-line no-redeclare\n var regex =\n \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \")=\";\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n return q || undefinedVar;\n };\n\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData, keepalive) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n var imageUrl =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n\n image.src = imageUrl;\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n\n\n\n\n\n\n\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n // eslint-disable-next-line no-redeclare\n var bot = isBotAgent;\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = trueVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function (raw) {\n // Customers can overwrite their referrer, here we check for that\n var referrer =\n overwriteOptions.referrer ||\n attr(scriptElement, \"referrer\") ||\n doc.referrer ||\n \"\";\n\n return (\n referrer\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n\n\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch = \"\";\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n var pathKey = path + querySearch;\n if (!path || lastSendPath == pathKey) return;\n\n lastSendPath = pathKey;\n page.path = path;\n\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n sameSite = referrer\n ? referrer.split(slash)[0] == locationHostname\n : falseVar;\n\n\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n\n\n pageview();\n\n } catch (e) {\n warn(e);\n }\n})(\n window,\n {},\n \"simpleanalyticscdn.com\",\n \"queue.\",\n \"cdn_light_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","warn","undefinedVar","undefined","https","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","protocol","language","documentElement","uaData","userAgentData","platformText","platformVersionText","docsUrl","isBotAgent","test","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","isString","string","attr","attribute","getAttribute","assign","obj","prop","object","to","arg","index","length","nextSource","constructor","Object","nextKey","hasOwnProperty","settings","sa_settings","logSettings","keys","Date","now","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","replace","c","getRandomValues","Uint8Array","toString","error","r","Math","random","isFunction","func","namespaceText","namespace","strictUtm","loadedVariable","sa_event_loaded","timezone","sendData","data","callback","onlyThisData","keepalive","payload","page","brave","_duckduckgoloader_","duck","image","Image","imageUrl","filter","key","map","join","src","overwrittenHostname","hostname","definedHostname","basePayload","version","mode","Intl","DateTimeFormat","resolvedOptions","timeZone","bot","ua","page_id","session_id","sri","mobile","brands","hostname_original","indexOf","lastSendPath","referrer","sendOnLeave","id","push","append","type","original_id","sendBeacon","bind","e","sameSite","userNavigated","getPath","overwrite","path","pathname","sendPageView","isPushState","deleteSourceInfo","search","metadata","ignoreSource","currentPage","query","split","keyValue","RegExp","pages","pathOverwrite","callbackRaw","parts","querySearch","shift","pathKey","performaceEntryType","perf","performance","navigationText","getEntriesByType","triggerSendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","pageview"],"mappings":";;CAEA,SACEA,EACAC,EACAC,EAKAC,GAEA,IAQE,IAAIC,EAAeC,UAIfC,EAAQ,SAKRC,EAAMP,EAAOQ,QACbC,EAAa,aACbC,EAAMV,EAAOW,UACbC,EAAMZ,EAAOa,SACbC,EAAmBF,EAAIG,KACvBC,EAAMhB,EAAOiB,SACbC,EAAYR,EAAIQ,UAChBC,EAAa,uBAEbC,GAhBW,EAiBXC,EAAyBC,mBACzBC,EAAyBC,mBACzBC,EAAYC,KAAKD,UAEjBE,EAAuB3B,EAAO4B,iBAC9BC,EAAaC,iBAA0B5B,EAEvC6B,GADkBf,EAAIgB,gBACX,YAIXC,EAASvB,EAAIwB,cAMbC,EAAe,WACfC,EAAsB,kBACtBC,EAAU,mCAEVC,EACF,sBAAsBC,KAAKrB,KAAe,WAAWqB,KAAKrB,GAIxDsB,EACFxB,EAAIyB,eAAiBzB,EAAI0B,cAAc,gBAAkBxC,EAAU,MAOrEC,EAAO,WAEL,IAAIwC,EAAO,GAAGC,MAAMC,KAAKC,WAOzB,OAJAH,EAAKI,QAAQ,qBAINC,SAASC,UAAUC,MAAML,KAAKtC,EAAIJ,KAAMI,EAAKoC,IAGtD,IAQIQ,EAAW,SAAUC,GACvB,MAAwB,iBAAVA,GAOZC,EAAO,SAAUb,EAAec,GAClC,OAAOd,GAAiBA,EAAce,aAAa,QAAUD,IAe3DE,EAAS,WAGX,IAFA,IA7BsBC,EAAKC,EAwBJC,EAKnBC,EAAK,GACLC,EAAMf,UACDgB,EAAQ,EAAGA,EAAQD,EAAIE,OAAQD,IAAS,CAC/C,IAAIE,EAAaH,EAAIC,GACrB,IATqBH,EASRK,IAREL,EAAOM,cAAgBC,OASpC,IAAK,IAAIC,KAAWH,EAlCFP,EAmCJO,EAnCSN,EAmCGS,EAlCvBD,OAAOjB,UAAUmB,eAAevB,KAAKY,EAAKC,KAmCzCE,EAAGO,GAAWH,EAAWG,IAKjC,OAAOP,GAGLS,EAAWrE,EAAOsE,YAClBC,EAAcF,GAAYH,OAAOM,KAAKvE,GAAkB8D,OAG5D9D,EAAmBuD,EAAOvD,EAAkBoE,GAExCE,GAAapE,EAAK,WAAYF,GAQxBwE,KAAKC,IALf,IAOIC,EAAO,WACT,IAAIC,EAAe5E,EAAO6E,QAAU7E,EAAO8E,SACvCC,EAAY,CAAC,MAAQ,KAAO,KAAO,KAAO,KAC1CC,EAAY,SAEhB,IACE,OAAOD,EAAUE,QAAQD,EAAW,SAAUE,GAC5C,OACEA,EACCN,EAAaO,gBAAgB,IAAIC,WAAW,IAAI,GAC9C,IAAOF,EAAI,GACdG,SAAS,MAEb,MAAOC,GACP,OAAOP,EAAUE,QAAQD,EAAW,SAAUE,GAC5C,IAAIK,EAAqB,GAAhBC,KAAKC,SAAiB,EAE/B,OADMP,EAAI,EAAIK,EAAS,EAAJA,EAAW,GACrBF,SAAS,QAKpBK,EAAa,SAAUC,GACzB,MAAsB,mBAARA,GAIZC,EAAgB,YAChBC,EACF5F,EAAiB2F,IACjBvC,EAAKb,EAAeoD,IAqaxB,KA3ZME,EACF7F,EAAiB6F,WAvKJ,QAwKbzC,EAAKb,EAAe,cAoClBuD,EAAiBF,EAAY,UACjC,GA/Mc,GA+MV7F,EAAO+F,GAA4B,OAAO5F,EAAKgB,EAAa,SAChEnB,EAAOgG,iBAhNO,EAiNdhG,EAAO+F,IAjNO,EAwNd,IA8DIE,EA9DAC,EAAW,SAAUC,EAAMC,EAAUC,EAAcC,GACrDH,EAAOE,EAAeF,EAAO3C,EAAO+C,EAASC,EAAML,GAE/CzF,EAAI+F,QAAUJ,IAAcF,EAAKM,OA3NzB,GA4NR/F,EAAIgG,qBAAuBL,IAAcF,EAAKQ,MA5NtC,GA+NZ,IAAIC,EAAQ,IAAIC,MACZC,EACFjF,EACA,eACAqC,OAAOM,KAAK2B,GACTY,OAAO,SAAUC,GAChB,OAAOb,EAAKa,IAAQ5G,IAErB6G,IAAI,SAAUD,GACb,OACE3F,EAAuB2F,GACvB,IACA3F,EAAuB8E,EAAKa,MAG/BE,KAAK,KACR,SACAzC,KAAKC,MAEPkC,EAAMO,IAAML,GAIVM,EACFnH,EAAiBoH,UAAYhE,EAAKb,EAAe,YAC/C8E,EAAkBF,GAAuBtG,EAEzCyG,EAAc,CAChBC,QAuUJ,eAtUIH,SAAUC,GAeDrH,EAAiBwH,MAAQpE,EAAKb,EAAe,QAYxD,IAEEyD,EACIyB,KAAKC,iBAAiBC,kBAAkBC,SAE5C,MAAOvC,GACPnF,EAAKmF,GAQGhD,IAMDiF,EAAYO,KA3SP,GA6Sd,IAAIvB,EAAU/C,EAAO+D,EAAa,CAEhCQ,GAAkC7G,EAElCZ,MAAOM,EAAIkB,UAAYxB,EACvB2F,SAAUA,EACV+B,QAA8BrD,IAG9BsD,WAA0CtD,MAwB5C,GArBA4B,EAAQ2B,KAzTM,EA6TVjG,IACFsE,EAAQ4B,OAASlG,EAAOkG,OACxB5B,EAAQ6B,OAAS3G,EAAUQ,EAAOmG,SAWhCd,IAAoBxG,IACtByF,EAAQ8B,kBAAoBvH,GAG1BL,KAAcC,GAA0B,KAAnBA,EAAID,GAC3B,OAAON,EA/TYgB,4BAgUAV,EAAa,oBAAsB4B,EAAU,SAK7B,GAAlCvB,EAAiBwH,QAAQ,OACxB,aAAa/F,KAAKzB,IACnBsG,GAEDjH,EACE,mBACEW,EACA,SACAuB,EACA,0BAON,IACIkG,EADA/B,EAAO,GAoBPgC,GAdAvI,EAAiBuI,UACjBnF,EAAKb,EAAe,aACpBxB,EAAIwH,UACJ,IAIGvD,QAAQnE,EAAkBwG,GAC1BrC,QAAQ,sDAAuD,MAC/DA,QAAQ,YAAa,OAAS7E,EAcjCqI,EAAc,SAAUC,EAAIC,GAG9B,IAAIC,EAASpF,EAAO+D,EAAa,CAC/BsB,KAAM,SACNC,YAAaH,EAAOD,EAAKnC,EAAQyB,UAKnC,GAAIW,IAASjI,EAAIqI,WAEf7C,EAAS0C,EAAQxI,GA9YP,QAgZV,IACEM,EAAIqI,WAAWC,KAAKtI,EAApBA,CAAyBmB,EAAa,UAAWJ,EAAUmH,IAC3D,MAAOK,GAEP/C,EAAS0C,EAAQxI,GApZT,KA0ZduB,EAxXe,WAwXgB8G,GAzZhB,GAgaf,IAmDIS,EAAUC,EAnDVC,EAAU,SAAUC,GACtB,IAAIC,EAAO,GAIX,IACEA,EAAOD,GAAa9H,EAAuBX,EAAI2I,UAC/C,MAAOjE,GACPnF,EAAKmF,GAMP,OAAOgE,GAMLE,EAAe,SACjBC,EACAC,EACAR,EACAS,EACAC,EACAxD,GAEIqD,GAAahB,EAAY,GAAKlC,EAAQyB,SA7b9B,GA8bYzB,EAAQyB,QAAUrD,IAE1C,IAnR6BkF,EAmRzBC,EAAcxC,EAAkB8B,IAChCW,GApRyBF,EAoRFH,GAAkBC,GAnRjB/I,EAAI+I,QAC7B/G,MAAM,GACNoH,MAAM,KACNjD,OAAO,SAAUkD,GAIhB,OAFaJ,GAaN,IAAIK,OART,YACCpE,EAAY,GAAK,KAClB,yCACCA,EAAY,GAAK,QAClB,KAIuB,KAAKvD,KAAK0H,KAEpC/C,KAAK,MAEI9G,GA+PZ8F,EACE,CACEwC,GAAInC,EAAQyB,QACZa,KAlca,WAmcbL,UAAWkB,GAAoBR,EAAWV,EAAW,KACrDuB,MAAOA,IAOXvB,EAAWsB,EAEXK,IAKa,SACbV,EACAW,EACAR,EACAS,IAEKA,GAAe3E,EAAWkE,KAAWS,EAAcT,GACzClE,EAAW2E,GAA1B,IAIMC,EAHFC,EAAc,GACdpH,EAASiH,KAAgD,EAA9BA,EAAc9B,QAAQ,OAGnD8B,GADIE,EAAQF,EAAcJ,MAAM,MACVQ,QACtBD,EAAc,IAAMD,EAAMpD,KAAK,MAGjC,IAAIoC,EAAOF,EAAQgB,GAGfK,EAAUnB,EAAOiB,EACrB,GAAKjB,GAAQf,GAAgBkC,EAA7B,CAEAlC,EAAekC,EACfjE,EAAK8C,KAAOA,EAKN5I,EAAIqB,KAAWyE,EAAKzE,GAAYrB,EAAIqB,IAK1C,IAII2I,EAJAC,EAAO3K,EAAO4K,YACdC,EAAiB,aAIrB,IACEH,EAAsBC,EAAKG,iBAAiBD,GAAgB,GAAGhC,KAC/D,MAAOvD,GACPnF,EAAKmF,GAGP6D,EAAgBuB,GAC+C,EAA3D,CAAC,SAAU,gBAAgBpC,QAAQoC,GAGnCC,GACAA,EAAKE,KACwC,EAA7C,CAAC,EAAG,GAAGvC,QAAQqC,EAAKE,GAAgBhC,MAGxCK,IAAWV,GACPA,EAASwB,MAtgBH,KAsgBgB,IAAMlJ,EAKhC,IAAIiK,EAAsB,WACxB3J,GAlhBU,EAqhBVoI,EACEC,EAFAA,GAAeN,IAAiB,EAIhCD,EACAqB,IAMJ,GAAKnJ,EAmBH2J,SAjBA,IACM9I,GAAUyD,EAAWzD,EAAO+I,sBAC9B/I,EACG+I,qBAAqB,CAAC7I,EAAcC,IACpC6I,KAAK,SAAUC,GACd3E,EAAQ4E,QAAUD,EAAkB/I,GACpCoE,EAAQ6E,WAAaF,EAAkB9I,GACvC2I,MAEDM,SAAMN,GAETA,IAEF,MAAO9B,GACP8B,MASNO,GAEA,MAAOrC,GACP9I,EAAK8I,IA9kBT,CAilBEjJ,OACA,uBACA"} \ No newline at end of file +{"version":3,"file":"light.source.js","sources":["light.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n // Only initialize in a browser.\n if (!window) return;\n\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings;\n settings = assign(settings);\n\n if (logSettings) warn(\"Settings\", settings);\n\n\n var collectMetricByString = function (metricAbbreviation) {\n // eslint-disable-next-line no-unreachable\n return true;\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n settings[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n settings.strictUtm || attr(scriptElement, \"strict-utm\") == trueText;\n\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n if (ignore) return falseVar;\n // eslint-disable-next-line no-redeclare\n var regex =\n \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \")=\";\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n return q || undefinedVar;\n };\n\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData, keepalive) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n var imageUrl =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n\n image.src = imageUrl;\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n settings.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = settings.mode || attr(scriptElement, \"mode\");\n\n\n\n\n\n\n\n\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n // eslint-disable-next-line no-redeclare\n var bot = isBotAgent;\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = trueVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function (raw) {\n // Customers can overwrite their referrer, here we check for that\n var referrer =\n settings.referrer ||\n attr(scriptElement, \"referrer\") ||\n doc.referrer ||\n \"\";\n\n return (\n referrer\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n\n\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch = \"\";\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n var pathKey = path + querySearch;\n if (!path || lastSendPath == pathKey) return;\n\n lastSendPath = pathKey;\n page.path = path;\n\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n sameSite = referrer\n ? referrer.split(slash)[0] == locationHostname\n : falseVar;\n\n\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n\n\n pageview();\n\n } catch (e) {\n warn(e);\n }\n})(\n typeof window != \"undefined\" && window,\n \"simpleanalyticscdn.com\",\n \"queue.\",\n \"cdn_light_12\",\n \"sa\"\n);\n"],"names":["window","baseUrl","warn","undefinedVar","undefined","https","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","protocol","language","documentElement","uaData","userAgentData","platformText","platformVersionText","docsUrl","isBotAgent","test","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","isString","string","attr","attribute","getAttribute","assign","obj","prop","object","to","arg","index","length","nextSource","constructor","Object","nextKey","hasOwnProperty","logSettings","settings","sa_settings","Date","now","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","replace","c","getRandomValues","Uint8Array","toString","error","r","Math","random","isFunction","func","namespaceText","namespace","strictUtm","loadedVariable","sa_event_loaded","timezone","sendData","data","callback","onlyThisData","keepalive","payload","page","brave","_duckduckgoloader_","duck","image","Image","imageUrl","keys","filter","key","map","join","src","overwrittenHostname","hostname","definedHostname","basePayload","version","mode","Intl","DateTimeFormat","resolvedOptions","timeZone","bot","ua","page_id","session_id","sri","mobile","brands","hostname_original","indexOf","lastSendPath","referrer","sendOnLeave","id","push","append","type","original_id","sendBeacon","bind","e","sameSite","userNavigated","getPath","overwrite","path","pathname","sendPageView","isPushState","deleteSourceInfo","search","metadata","ignoreSource","currentPage","query","split","keyValue","RegExp","pages","pathOverwrite","callbackRaw","parts","querySearch","shift","pathKey","performaceEntryType","perf","performance","navigationText","getEntriesByType","triggerSendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","pageview"],"mappings":"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"} \ No newline at end of file diff --git a/src/default.js b/src/default.js index 28a938ff..b07d46b7 100644 --- a/src/default.js +++ b/src/default.js @@ -2,7 +2,6 @@ (function ( window, - overwriteOptions, baseUrl, apiUrlPrefix, version, @@ -10,6 +9,9 @@ sendError, warn ) { + // Only initialize in a browser. + if (!window) return; + try { ///////////////////// // PREDEFINED VARIABLES FOR BETTER MINIFICATION @@ -67,11 +69,6 @@ var screen = window.screen; /** endif **/ - /** if skipnonwindow **/ - // Skip server side rendered pages on Cloudflare - if (typeof window == "" + undefinedVar) return; - /** endif **/ - // Find the script element where options can be set on var scriptElement = doc.currentScript || doc.querySelector('script[src*="' + baseUrl + '"]'); @@ -142,17 +139,15 @@ }; var settings = window.sa_settings; - var logSettings = settings || Object.keys(overwriteOptions).length; + var logSettings = settings; + settings = assign(settings); - // Merge overwriteOptions with sa_settings - overwriteOptions = assign(overwriteOptions, settings); - - if (logSettings) warn("Settings", overwriteOptions); + if (logSettings) warn("Settings", settings); /** if ignoremetrics **/ // Customers can skip data points var ignoreMetrics = convertCommaSeparatedToArray( - overwriteOptions.ignoreMetrics || attr(scriptElement, "ignore-metrics") + settings.ignoreMetrics || attr(scriptElement, "ignore-metrics") ); /** endif **/ @@ -201,7 +196,7 @@ // Define namespace for the library var namespaceText = "namespace"; var namespace = - overwriteOptions[namespaceText] || + settings[namespaceText] || attr(scriptElement, namespaceText) || defaultNamespace; @@ -235,8 +230,7 @@ // By default we allow source, medium in the URLs. With strictUtm enabled // we only allow it with the utm_ prefix: utm_source, utm_medium, ... var strictUtm = - overwriteOptions.strictUtm || - attr(scriptElement, "strict-utm") == trueText; + settings.strictUtm || attr(scriptElement, "strict-utm") == trueText; /** if ignoremetrics **/ var k; @@ -390,7 +384,7 @@ // Customers can overwrite their hostname, here we check for that var overwrittenHostname = - overwriteOptions.hostname || attr(scriptElement, "hostname"); + settings.hostname || attr(scriptElement, "hostname"); var definedHostname = overwrittenHostname || locationHostname; var basePayload = { @@ -451,12 +445,12 @@ // // Script mode, this can be hash mode for example - var mode = overwriteOptions.mode || attr(scriptElement, "mode"); + var mode = settings.mode || attr(scriptElement, "mode"); /** if ignorednt **/ // Should we record Do Not Track visits? - var collectDnt = isBoolean(overwriteOptions.collectDnt) - ? overwriteOptions.collectDnt + var collectDnt = isBoolean(settings.collectDnt) + ? settings.collectDnt : attr(scriptElement, "ignore-dnt") == trueText || attr(scriptElement, "skip-dnt") == trueText || attr(scriptElement, "collect-dnt") == trueText; @@ -466,14 +460,14 @@ // Some customers want to collect page views manually var autoCollect = !( attr(scriptElement, "auto-collect") == "false" || - overwriteOptions.autoCollect === falseVar + settings.autoCollect === falseVar ); /** endif **/ /** if events **/ // Event function name var eventFunctionName = - overwriteOptions.saGlobal || + settings.saGlobal || attr(scriptElement, "sa-global") || namespace + "_" + eventText; /** endif **/ @@ -481,36 +475,34 @@ /** if ignorepages **/ // Customers can ignore certain pages var ignorePages = convertCommaSeparatedToArray( - overwriteOptions.ignorePages || attr(scriptElement, "ignore-pages") + settings.ignorePages || attr(scriptElement, "ignore-pages") ); /** endif **/ /** if allowparams **/ // Customers can allow params var allowParams = convertCommaSeparatedToArray( - overwriteOptions.allowParams || attr(scriptElement, "allow-params") + settings.allowParams || attr(scriptElement, "allow-params") ); /** endif **/ /** if nonuniquehostnames **/ // Customers can allow params var nonUniqueHostnames = convertCommaSeparatedToArray( - overwriteOptions.nonUniqueHostnames || - attr(scriptElement, "non-unique-hostnames") + settings.nonUniqueHostnames || attr(scriptElement, "non-unique-hostnames") ); /** endif **/ /** if pathoverwriter **/ // Customers can overwrite certain values var pathOverwriter = - overwriteOptions.pathOverwriter || attr(scriptElement, "path-overwriter"); + settings.pathOverwriter || attr(scriptElement, "path-overwriter"); /** endif **/ /** if metadata **/ // Customers can add metadata to events and pageviews via a function var metadataCollector = - overwriteOptions.metadataCollector || - attr(scriptElement, "metadata-collector"); + settings.metadataCollector || attr(scriptElement, "metadata-collector"); /** endif **/ // This code could error on (incomplete) implementations, that's why we use try...catch @@ -631,7 +623,7 @@ var getReferrer = function (raw) { // Customers can overwrite their referrer, here we check for that var referrer = - overwriteOptions.referrer || + settings.referrer || attr(scriptElement, "referrer") || doc.referrer || ""; @@ -1187,7 +1179,7 @@ // 404 confirmation adds a request, so existing installs must opt in. if ( - overwriteOptions.detect404 === trueVar || + settings.detect404 === trueVar || attr(scriptElement, "detect-404") == trueText ) { var detect404 = function () { @@ -1221,8 +1213,7 @@ /** endif **/ } })( - window, - "{{overwriteOptions}}", + typeof window != "undefined" && window, "{{baseUrl}}", "{{apiUrlPrefix}}", "{{scriptName}}", From 5ce345391fed0000dfc96589c5919ed834eab90d Mon Sep 17 00:00:00 2001 From: "simple-analytics-ai[bot]" <313929673+simple-analytics-ai[bot]@users.noreply.github.com> Date: Fri, 16 Oct 2026 14:40:34 +0200 Subject: [PATCH 61/62] fix: retain phone metadata with titled events (#122) User requested checking unresolved comments with a focus on CodeRabbit, separate reviewable changes, and minimal shipped bytes. Extract phone metadata before applying the existing title-derived event name and cover the regression. Refs #107 Co-authored-by: Simple Analytics Codex --- dist/latest/auto-events.js | 4 ++-- dist/latest/auto-events.js.map | 2 +- dist/latest/custom/auto-events.js | 4 ++-- dist/latest/custom/auto-events.js.map | 2 +- dist/v12/auto-events.js | 4 ++-- dist/v12/auto-events.js.map | 2 +- dist/v12/custom/auto-events.js | 4 ++-- dist/v12/custom/auto-events.js.map | 2 +- src/auto-events.js | 5 ++--- test/unit/auto-events.test.js | 17 +++++++++++++++++ 10 files changed, 31 insertions(+), 15 deletions(-) diff --git a/dist/latest/auto-events.js b/dist/latest/auto-events.js index 2e99bd73..cd391b60 100644 --- a/dist/latest/auto-events.js +++ b/dist/latest/auto-events.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-15; 54ac; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-15; 99ad; v12) */ -function t(){try{for(var e=document.getElementsByTagName("a"),t=0;t -1,\n emails: collectTypes.indexOf(\"emails\") > -1,\n downloads: collectTypes.indexOf(\"downloads\") > -1,\n phones: collectTypes.indexOf(\"phones\") > -1,\n // Downloads: enter file extensions you want to collect\n downloadsExtensions: setting(\"extensions\", \"array\", [\n \"pdf\",\n \"csv\",\n \"docx\",\n \"xlsx\",\n \"zip\",\n \"doc\",\n \"xls\",\n ]),\n\n // All: use title attribute if set for event name (for all events)\n // THIS TAKES PRECEDENCE OVER OTHER SETTINGS BELOW\n title: setting(\"useTitle\", \"bool\", true),\n // Outbound: use full URL of the links? false for just the hostname\n outboundFullUrl: fullUrls,\n // Downloads: if taking event name from URL, use full URL or just filename (default)\n downloadsFullUrl: fullUrls,\n };\n\n var saGlobal = setting(\"saGlobal\", \"string\", \"sa_event\");\n\n // For compiling the script\n var optionsLink = options;\n\n if (typeof optionsLink === \"undefined\")\n log(\"options object not found, please specify\", \"warn\");\n\n var saAutomatedLink = function saAutomatedLink(element, type) {\n try {\n if (!element) return log(\"no element found\");\n\n if (window[saGlobal] && window[saGlobal + \"_loaded\"]) {\n var hostname = element.hostname;\n var pathname = element.pathname;\n\n var event;\n var metadata = {\n title: element.getAttribute(\"title\") || undefined,\n };\n var url = element.href || undefined;\n\n var useTitle = false;\n if (optionsLink.title && element.hasAttribute(\"title\")) {\n var theTitle = element.getAttribute(\"title\").trim();\n if (theTitle != \"\") useTitle = true;\n }\n\n if (useTitle) {\n event = theTitle;\n } else {\n switch (type) {\n case \"outbound\": {\n event = hostname + (optionsLink.outboundFullUrl ? pathname : \"\");\n metadata.url = url;\n break;\n }\n case \"download\": {\n event = optionsLink.downloadsFullUrl\n ? hostname + pathname\n : pathname.split(\"/\").pop();\n metadata.url = url;\n break;\n }\n case \"email\": {\n var href = element.getAttribute(\"href\");\n event = (href.split(\":\")[1] || \"\").split(\"?\")[0];\n metadata.email = event;\n break;\n }\n case \"phone\": {\n var hrefPhone = element.getAttribute(\"href\");\n event = (hrefPhone.split(\":\")[1] || \"\").split(\"?\")[0];\n metadata.phone = event;\n break;\n }\n }\n }\n\n var clean =\n type +\n \"_\" +\n event.replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_+|_+$)/g, \"\");\n\n window[saGlobal](clean, metadata, function () {}, true);\n\n log(\"collected \" + clean);\n } else {\n log(saGlobal + \" is not defined\", \"warn\");\n }\n } catch (error) {\n log(error.message, \"warn\");\n }\n };\n\n window.saAutomatedLink = saAutomatedLink;\n\n function collectLink(link) {\n if (link.hasAttribute(\"data-simple-event\")) return;\n var collect = false;\n\n // Collect download clicks\n if (\n optionsLink.downloads &&\n /^https?:\\/\\//i.test(link.href) &&\n new RegExp(\n \"\\\\.(\" + (optionsLink.downloadsExtensions || []).join(\"|\") + \")$\",\n \"i\"\n ).test(link.pathname)\n ) {\n collect = \"download\";\n\n // Collect outbound links clicks\n } else if (\n optionsLink.outbound &&\n /^https?:\\/\\//i.test(link.href) &&\n link.hostname !== window.location.hostname\n ) {\n collect = \"outbound\";\n\n // Collect email clicks\n } else if (optionsLink.emails && /^mailto:/i.test(link.href)) {\n collect = \"email\";\n\n // Collect telephone clicks\n } else if (optionsLink.phones && /^tel:/i.test(link.href)) {\n collect = \"phone\";\n }\n\n if (!collect) return;\n\n link.addEventListener(\"click\", function () {\n saAutomatedLink(this, collect);\n });\n }\n\n function onDOMContentLoaded() {\n try {\n var a = document.getElementsByTagName(\"a\");\n\n // Loop over all links on the page\n for (var i = 0; i < a.length; i++) {\n var link = a[i];\n var href = link.getAttribute(\"href\");\n\n // Skip links that don't have an href\n if (!href) continue;\n\n collectLink(link);\n }\n } catch (error) {\n log(error.message, \"warn\");\n }\n }\n\n if (doc.readyState === \"ready\" || doc.readyState === \"complete\") {\n onDOMContentLoaded();\n } else {\n document.addEventListener(\"readystatechange\", function (event) {\n if (event.target.readyState === \"complete\") onDOMContentLoaded();\n });\n }\n})(window);\n"],"names":["onDOMContentLoaded","a","document","getElementsByTagName","i","length","link","getAttribute","collect","hasAttribute","optionsLink","downloads","test","href","RegExp","downloadsExtensions","join","pathname","outbound","hostname","window","location","emails","phones","addEventListener","saAutomatedLink","this","collectLink","error","log","message","doc","scriptElement","setting","collectTypes","fullUrls","options","saGlobal","type","logger","console","warn","info","currentScript","querySelector","attribute","defaultValue","value","dataset","split","map","item","trim","filter","Boolean","indexOf","title","outboundFullUrl","downloadsFullUrl","element","theTitle","metadata","undefined","url","useTitle","event","pop","email","phone","clean","replace","readyState","target"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"auto-events.source.js","sources":["auto-events.source.js"],"sourcesContent":["(function saAutomatedEvents(window) {\n // Skip server side rendered pages\n if (typeof window === \"undefined\") return;\n\n var log = function (message, type) {\n var logger = type === \"warn\" ? console.warn : console.info;\n return logger && logger(\"Simple Analytics auto events:\", message);\n };\n\n var doc = window.document;\n\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"auto-events.js\"]');\n\n var setting = function (attribute, type, defaultValue) {\n var value = scriptElement && scriptElement.dataset[attribute];\n\n // Booleans\n if (type === \"bool\" && (value === \"true\" || value === \"false\"))\n return value === \"true\";\n else if (type === \"bool\") return defaultValue;\n\n // Arrays\n if (type === \"array\" && value)\n return value\n .split(\",\")\n .map(function (item) {\n return item.trim();\n })\n .filter(Boolean);\n else if (type === \"array\") return defaultValue;\n\n return value || defaultValue;\n };\n\n var collectTypes = setting(\"collect\", \"array\", [\n \"outbound\",\n \"emails\",\n \"downloads\",\n \"phones\",\n ]);\n var fullUrls = setting(\"fullUrls\", \"bool\", false);\n\n var options = {\n // What to collect\n outbound: collectTypes.indexOf(\"outbound\") > -1,\n emails: collectTypes.indexOf(\"emails\") > -1,\n downloads: collectTypes.indexOf(\"downloads\") > -1,\n phones: collectTypes.indexOf(\"phones\") > -1,\n // Downloads: enter file extensions you want to collect\n downloadsExtensions: setting(\"extensions\", \"array\", [\n \"pdf\",\n \"csv\",\n \"docx\",\n \"xlsx\",\n \"zip\",\n \"doc\",\n \"xls\",\n ]),\n\n // All: use title attribute if set for event name (for all events)\n // THIS TAKES PRECEDENCE OVER OTHER SETTINGS BELOW\n title: setting(\"useTitle\", \"bool\", true),\n // Outbound: use full URL of the links? false for just the hostname\n outboundFullUrl: fullUrls,\n // Downloads: if taking event name from URL, use full URL or just filename (default)\n downloadsFullUrl: fullUrls,\n };\n\n var saGlobal = setting(\"saGlobal\", \"string\", \"sa_event\");\n\n // For compiling the script\n var optionsLink = options;\n\n if (typeof optionsLink === \"undefined\")\n log(\"options object not found, please specify\", \"warn\");\n\n var saAutomatedLink = function saAutomatedLink(element, type) {\n try {\n if (!element) return log(\"no element found\");\n\n if (window[saGlobal] && window[saGlobal + \"_loaded\"]) {\n var hostname = element.hostname;\n var pathname = element.pathname;\n\n var event;\n var metadata = {\n title: element.getAttribute(\"title\") || undefined,\n };\n var url = element.href || undefined;\n\n var useTitle = false;\n if (optionsLink.title && element.hasAttribute(\"title\")) {\n var theTitle = element.getAttribute(\"title\").trim();\n if (theTitle != \"\") useTitle = true;\n }\n\n if (!useTitle || type === \"phone\") {\n switch (type) {\n case \"outbound\": {\n event = hostname + (optionsLink.outboundFullUrl ? pathname : \"\");\n metadata.url = url;\n break;\n }\n case \"download\": {\n event = optionsLink.downloadsFullUrl\n ? hostname + pathname\n : pathname.split(\"/\").pop();\n metadata.url = url;\n break;\n }\n case \"email\": {\n var href = element.getAttribute(\"href\");\n event = (href.split(\":\")[1] || \"\").split(\"?\")[0];\n metadata.email = event;\n break;\n }\n case \"phone\": {\n var hrefPhone = element.getAttribute(\"href\");\n event = (hrefPhone.split(\":\")[1] || \"\").split(\"?\")[0];\n metadata.phone = event;\n break;\n }\n }\n }\n if (useTitle) event = theTitle;\n\n var clean =\n type +\n \"_\" +\n event.replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_+|_+$)/g, \"\");\n\n window[saGlobal](clean, metadata, function () {}, true);\n\n log(\"collected \" + clean);\n } else {\n log(saGlobal + \" is not defined\", \"warn\");\n }\n } catch (error) {\n log(error.message, \"warn\");\n }\n };\n\n window.saAutomatedLink = saAutomatedLink;\n\n function collectLink(link) {\n if (link.hasAttribute(\"data-simple-event\")) return;\n var collect = false;\n\n // Collect download clicks\n if (\n optionsLink.downloads &&\n /^https?:\\/\\//i.test(link.href) &&\n new RegExp(\n \"\\\\.(\" + (optionsLink.downloadsExtensions || []).join(\"|\") + \")$\",\n \"i\"\n ).test(link.pathname)\n ) {\n collect = \"download\";\n\n // Collect outbound links clicks\n } else if (\n optionsLink.outbound &&\n /^https?:\\/\\//i.test(link.href) &&\n link.hostname !== window.location.hostname\n ) {\n collect = \"outbound\";\n\n // Collect email clicks\n } else if (optionsLink.emails && /^mailto:/i.test(link.href)) {\n collect = \"email\";\n\n // Collect telephone clicks\n } else if (optionsLink.phones && /^tel:/i.test(link.href)) {\n collect = \"phone\";\n }\n\n if (!collect) return;\n\n link.addEventListener(\"click\", function () {\n saAutomatedLink(this, collect);\n });\n }\n\n function onDOMContentLoaded() {\n try {\n var a = document.getElementsByTagName(\"a\");\n\n // Loop over all links on the page\n for (var i = 0; i < a.length; i++) {\n var link = a[i];\n var href = link.getAttribute(\"href\");\n\n // Skip links that don't have an href\n if (!href) continue;\n\n collectLink(link);\n }\n } catch (error) {\n log(error.message, \"warn\");\n }\n }\n\n if (doc.readyState === \"ready\" || doc.readyState === \"complete\") {\n onDOMContentLoaded();\n } else {\n document.addEventListener(\"readystatechange\", function (event) {\n if (event.target.readyState === \"complete\") onDOMContentLoaded();\n });\n }\n})(window);\n"],"names":["onDOMContentLoaded","a","document","getElementsByTagName","i","length","link","getAttribute","collect","hasAttribute","optionsLink","downloads","test","href","RegExp","downloadsExtensions","join","pathname","outbound","hostname","window","location","emails","phones","addEventListener","saAutomatedLink","this","collectLink","error","log","message","doc","scriptElement","setting","collectTypes","fullUrls","options","saGlobal","type","logger","console","warn","info","currentScript","querySelector","attribute","defaultValue","value","dataset","split","map","item","trim","filter","Boolean","indexOf","title","outboundFullUrl","downloadsFullUrl","element","theTitle","metadata","undefined","url","useTitle","event","pop","email","phone","clean","replace","readyState","target"],"mappings":"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"} \ No newline at end of file diff --git a/dist/latest/custom/auto-events.js b/dist/latest/custom/auto-events.js index 2e99bd73..cd391b60 100644 --- a/dist/latest/custom/auto-events.js +++ b/dist/latest/custom/auto-events.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-15; 54ac; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-15; 99ad; v12) */ -function t(){try{for(var e=document.getElementsByTagName("a"),t=0;t -1,\n emails: collectTypes.indexOf(\"emails\") > -1,\n downloads: collectTypes.indexOf(\"downloads\") > -1,\n phones: collectTypes.indexOf(\"phones\") > -1,\n // Downloads: enter file extensions you want to collect\n downloadsExtensions: setting(\"extensions\", \"array\", [\n \"pdf\",\n \"csv\",\n \"docx\",\n \"xlsx\",\n \"zip\",\n \"doc\",\n \"xls\",\n ]),\n\n // All: use title attribute if set for event name (for all events)\n // THIS TAKES PRECEDENCE OVER OTHER SETTINGS BELOW\n title: setting(\"useTitle\", \"bool\", true),\n // Outbound: use full URL of the links? false for just the hostname\n outboundFullUrl: fullUrls,\n // Downloads: if taking event name from URL, use full URL or just filename (default)\n downloadsFullUrl: fullUrls,\n };\n\n var saGlobal = setting(\"saGlobal\", \"string\", \"sa_event\");\n\n // For compiling the script\n var optionsLink = options;\n\n if (typeof optionsLink === \"undefined\")\n log(\"options object not found, please specify\", \"warn\");\n\n var saAutomatedLink = function saAutomatedLink(element, type) {\n try {\n if (!element) return log(\"no element found\");\n\n if (window[saGlobal] && window[saGlobal + \"_loaded\"]) {\n var hostname = element.hostname;\n var pathname = element.pathname;\n\n var event;\n var metadata = {\n title: element.getAttribute(\"title\") || undefined,\n };\n var url = element.href || undefined;\n\n var useTitle = false;\n if (optionsLink.title && element.hasAttribute(\"title\")) {\n var theTitle = element.getAttribute(\"title\").trim();\n if (theTitle != \"\") useTitle = true;\n }\n\n if (useTitle) {\n event = theTitle;\n } else {\n switch (type) {\n case \"outbound\": {\n event = hostname + (optionsLink.outboundFullUrl ? pathname : \"\");\n metadata.url = url;\n break;\n }\n case \"download\": {\n event = optionsLink.downloadsFullUrl\n ? hostname + pathname\n : pathname.split(\"/\").pop();\n metadata.url = url;\n break;\n }\n case \"email\": {\n var href = element.getAttribute(\"href\");\n event = (href.split(\":\")[1] || \"\").split(\"?\")[0];\n metadata.email = event;\n break;\n }\n case \"phone\": {\n var hrefPhone = element.getAttribute(\"href\");\n event = (hrefPhone.split(\":\")[1] || \"\").split(\"?\")[0];\n metadata.phone = event;\n break;\n }\n }\n }\n\n var clean =\n type +\n \"_\" +\n event.replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_+|_+$)/g, \"\");\n\n window[saGlobal](clean, metadata, function () {}, true);\n\n log(\"collected \" + clean);\n } else {\n log(saGlobal + \" is not defined\", \"warn\");\n }\n } catch (error) {\n log(error.message, \"warn\");\n }\n };\n\n window.saAutomatedLink = saAutomatedLink;\n\n function collectLink(link) {\n if (link.hasAttribute(\"data-simple-event\")) return;\n var collect = false;\n\n // Collect download clicks\n if (\n optionsLink.downloads &&\n /^https?:\\/\\//i.test(link.href) &&\n new RegExp(\n \"\\\\.(\" + (optionsLink.downloadsExtensions || []).join(\"|\") + \")$\",\n \"i\"\n ).test(link.pathname)\n ) {\n collect = \"download\";\n\n // Collect outbound links clicks\n } else if (\n optionsLink.outbound &&\n /^https?:\\/\\//i.test(link.href) &&\n link.hostname !== window.location.hostname\n ) {\n collect = \"outbound\";\n\n // Collect email clicks\n } else if (optionsLink.emails && /^mailto:/i.test(link.href)) {\n collect = \"email\";\n\n // Collect telephone clicks\n } else if (optionsLink.phones && /^tel:/i.test(link.href)) {\n collect = \"phone\";\n }\n\n if (!collect) return;\n\n link.addEventListener(\"click\", function () {\n saAutomatedLink(this, collect);\n });\n }\n\n function onDOMContentLoaded() {\n try {\n var a = document.getElementsByTagName(\"a\");\n\n // Loop over all links on the page\n for (var i = 0; i < a.length; i++) {\n var link = a[i];\n var href = link.getAttribute(\"href\");\n\n // Skip links that don't have an href\n if (!href) continue;\n\n collectLink(link);\n }\n } catch (error) {\n log(error.message, \"warn\");\n }\n }\n\n if (doc.readyState === \"ready\" || doc.readyState === \"complete\") {\n onDOMContentLoaded();\n } else {\n document.addEventListener(\"readystatechange\", function (event) {\n if (event.target.readyState === \"complete\") onDOMContentLoaded();\n });\n }\n})(window);\n"],"names":["onDOMContentLoaded","a","document","getElementsByTagName","i","length","link","getAttribute","collect","hasAttribute","optionsLink","downloads","test","href","RegExp","downloadsExtensions","join","pathname","outbound","hostname","window","location","emails","phones","addEventListener","saAutomatedLink","this","collectLink","error","log","message","doc","scriptElement","setting","collectTypes","fullUrls","options","saGlobal","type","logger","console","warn","info","currentScript","querySelector","attribute","defaultValue","value","dataset","split","map","item","trim","filter","Boolean","indexOf","title","outboundFullUrl","downloadsFullUrl","element","theTitle","metadata","undefined","url","useTitle","event","pop","email","phone","clean","replace","readyState","target"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"auto-events.source.js","sources":["auto-events.source.js"],"sourcesContent":["(function saAutomatedEvents(window) {\n // Skip server side rendered pages\n if (typeof window === \"undefined\") return;\n\n var log = function (message, type) {\n var logger = type === \"warn\" ? console.warn : console.info;\n return logger && logger(\"Simple Analytics auto events:\", message);\n };\n\n var doc = window.document;\n\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"auto-events.js\"]');\n\n var setting = function (attribute, type, defaultValue) {\n var value = scriptElement && scriptElement.dataset[attribute];\n\n // Booleans\n if (type === \"bool\" && (value === \"true\" || value === \"false\"))\n return value === \"true\";\n else if (type === \"bool\") return defaultValue;\n\n // Arrays\n if (type === \"array\" && value)\n return value\n .split(\",\")\n .map(function (item) {\n return item.trim();\n })\n .filter(Boolean);\n else if (type === \"array\") return defaultValue;\n\n return value || defaultValue;\n };\n\n var collectTypes = setting(\"collect\", \"array\", [\n \"outbound\",\n \"emails\",\n \"downloads\",\n \"phones\",\n ]);\n var fullUrls = setting(\"fullUrls\", \"bool\", false);\n\n var options = {\n // What to collect\n outbound: collectTypes.indexOf(\"outbound\") > -1,\n emails: collectTypes.indexOf(\"emails\") > -1,\n downloads: collectTypes.indexOf(\"downloads\") > -1,\n phones: collectTypes.indexOf(\"phones\") > -1,\n // Downloads: enter file extensions you want to collect\n downloadsExtensions: setting(\"extensions\", \"array\", [\n \"pdf\",\n \"csv\",\n \"docx\",\n \"xlsx\",\n \"zip\",\n \"doc\",\n \"xls\",\n ]),\n\n // All: use title attribute if set for event name (for all events)\n // THIS TAKES PRECEDENCE OVER OTHER SETTINGS BELOW\n title: setting(\"useTitle\", \"bool\", true),\n // Outbound: use full URL of the links? false for just the hostname\n outboundFullUrl: fullUrls,\n // Downloads: if taking event name from URL, use full URL or just filename (default)\n downloadsFullUrl: fullUrls,\n };\n\n var saGlobal = setting(\"saGlobal\", \"string\", \"sa_event\");\n\n // For compiling the script\n var optionsLink = options;\n\n if (typeof optionsLink === \"undefined\")\n log(\"options object not found, please specify\", \"warn\");\n\n var saAutomatedLink = function saAutomatedLink(element, type) {\n try {\n if (!element) return log(\"no element found\");\n\n if (window[saGlobal] && window[saGlobal + \"_loaded\"]) {\n var hostname = element.hostname;\n var pathname = element.pathname;\n\n var event;\n var metadata = {\n title: element.getAttribute(\"title\") || undefined,\n };\n var url = element.href || undefined;\n\n var useTitle = false;\n if (optionsLink.title && element.hasAttribute(\"title\")) {\n var theTitle = element.getAttribute(\"title\").trim();\n if (theTitle != \"\") useTitle = true;\n }\n\n if (!useTitle || type === \"phone\") {\n switch (type) {\n case \"outbound\": {\n event = hostname + (optionsLink.outboundFullUrl ? pathname : \"\");\n metadata.url = url;\n break;\n }\n case \"download\": {\n event = optionsLink.downloadsFullUrl\n ? hostname + pathname\n : pathname.split(\"/\").pop();\n metadata.url = url;\n break;\n }\n case \"email\": {\n var href = element.getAttribute(\"href\");\n event = (href.split(\":\")[1] || \"\").split(\"?\")[0];\n metadata.email = event;\n break;\n }\n case \"phone\": {\n var hrefPhone = element.getAttribute(\"href\");\n event = (hrefPhone.split(\":\")[1] || \"\").split(\"?\")[0];\n metadata.phone = event;\n break;\n }\n }\n }\n if (useTitle) event = theTitle;\n\n var clean =\n type +\n \"_\" +\n event.replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_+|_+$)/g, \"\");\n\n window[saGlobal](clean, metadata, function () {}, true);\n\n log(\"collected \" + clean);\n } else {\n log(saGlobal + \" is not defined\", \"warn\");\n }\n } catch (error) {\n log(error.message, \"warn\");\n }\n };\n\n window.saAutomatedLink = saAutomatedLink;\n\n function collectLink(link) {\n if (link.hasAttribute(\"data-simple-event\")) return;\n var collect = false;\n\n // Collect download clicks\n if (\n optionsLink.downloads &&\n /^https?:\\/\\//i.test(link.href) &&\n new RegExp(\n \"\\\\.(\" + (optionsLink.downloadsExtensions || []).join(\"|\") + \")$\",\n \"i\"\n ).test(link.pathname)\n ) {\n collect = \"download\";\n\n // Collect outbound links clicks\n } else if (\n optionsLink.outbound &&\n /^https?:\\/\\//i.test(link.href) &&\n link.hostname !== window.location.hostname\n ) {\n collect = \"outbound\";\n\n // Collect email clicks\n } else if (optionsLink.emails && /^mailto:/i.test(link.href)) {\n collect = \"email\";\n\n // Collect telephone clicks\n } else if (optionsLink.phones && /^tel:/i.test(link.href)) {\n collect = \"phone\";\n }\n\n if (!collect) return;\n\n link.addEventListener(\"click\", function () {\n saAutomatedLink(this, collect);\n });\n }\n\n function onDOMContentLoaded() {\n try {\n var a = document.getElementsByTagName(\"a\");\n\n // Loop over all links on the page\n for (var i = 0; i < a.length; i++) {\n var link = a[i];\n var href = link.getAttribute(\"href\");\n\n // Skip links that don't have an href\n if (!href) continue;\n\n collectLink(link);\n }\n } catch (error) {\n log(error.message, \"warn\");\n }\n }\n\n if (doc.readyState === \"ready\" || doc.readyState === \"complete\") {\n onDOMContentLoaded();\n } else {\n document.addEventListener(\"readystatechange\", function (event) {\n if (event.target.readyState === \"complete\") onDOMContentLoaded();\n });\n }\n})(window);\n"],"names":["onDOMContentLoaded","a","document","getElementsByTagName","i","length","link","getAttribute","collect","hasAttribute","optionsLink","downloads","test","href","RegExp","downloadsExtensions","join","pathname","outbound","hostname","window","location","emails","phones","addEventListener","saAutomatedLink","this","collectLink","error","log","message","doc","scriptElement","setting","collectTypes","fullUrls","options","saGlobal","type","logger","console","warn","info","currentScript","querySelector","attribute","defaultValue","value","dataset","split","map","item","trim","filter","Boolean","indexOf","title","outboundFullUrl","downloadsFullUrl","element","theTitle","metadata","undefined","url","useTitle","event","pop","email","phone","clean","replace","readyState","target"],"mappings":";;AAwLE,SAASA,IACP,IAIE,IAHA,IAAIC,EAAIC,SAASC,qBAAqB,KAG7BC,EAAI,EAAGA,EAAIH,EAAEI,OAAQD,IAAK,CACjC,IAAIE,EAAOL,EAAEG,GACFE,EAAKC,aAAa,SA9CnC,SAAqBD,GACnB,IACIE,EADAF,EAAKG,aAAa,uBAClBD,GAAU,EAIZE,EAAYC,WACZ,gBAAgBC,KAAKN,EAAKO,OAC1B,IAAIC,OACF,QAAUJ,EAAYK,qBAAuB,IAAIC,KAAK,KAAO,KAC7D,KACAJ,KAAKN,EAAKW,UAEZT,EAAU,WAIVE,EAAYQ,UACZ,gBAAgBN,KAAKN,EAAKO,OAC1BP,EAAKa,WAAaC,EAAOC,SAASF,SAElCX,EAAU,WAGDE,EAAYY,QAAU,YAAYV,KAAKN,EAAKO,MACrDL,EAAU,QAGDE,EAAYa,QAAU,SAASX,KAAKN,EAAKO,QAClDL,EAAU,SAGPA,GAELF,EAAKkB,iBAAiB,QAAS,WAC7BC,EAAgBC,KAAMlB,MAgBpBmB,CAAYrB,IAEd,MAAOsB,GACPC,EAAID,EAAME,QAAS,SAvMzB,IAA4BV,EAItBS,EAKAE,EAEAC,EAGAC,EAqBAC,EAMAC,EAEAC,EA0BAC,EAGA3B,EAKAe,OA3EkB,KAFIL,EAkNzBA,UA9MGS,EAAM,SAAUC,EAASQ,GAC3B,IAAIC,EAAkB,SAATD,EAAkBE,QAAQC,KAAOD,QAAQE,KACtD,OAAOH,GAAUA,EAAO,gCAAiCT,IAGvDC,EAAMX,EAAOlB,SAEb8B,EACFD,EAAIY,eAAiBZ,EAAIa,cAAc,iCAuBrCV,GArBAD,EAAU,SAAUY,EAAWP,EAAMQ,GACvC,IAAIC,EAAQf,GAAiBA,EAAcgB,QAAQH,GAGnD,MAAa,SAATP,GAA8B,SAAVS,GAA8B,UAAVA,EAE1B,SAATT,EAAwBQ,EAGpB,UAATR,GAAoBS,EACfA,EACJE,MAAM,KACNC,IAAI,SAAUC,GACb,OAAOA,EAAKC,SAEbC,OAAOC,SACM,UAAThB,GAEFS,GAF2BD,EAXf,SAAVC,IAgBgB,UAAW,QAAS,CAC7C,WACA,SACA,YACA,WAEEZ,EAAWF,EAAQ,WAAY,QAAQ,GAEvCG,EAAU,CAEZlB,UAA8C,EAApCgB,EAAaqB,QAAQ,YAC/BjC,QAA0C,EAAlCY,EAAaqB,QAAQ,UAC7B5C,WAAgD,EAArCuB,EAAaqB,QAAQ,aAChChC,QAA0C,EAAlCW,EAAaqB,QAAQ,UAE7BxC,oBAAqBkB,EAAQ,aAAc,QAAS,CAClD,MACA,MACA,OACA,OACA,MACA,MACA,QAKFuB,MAAOvB,EAAQ,WAAY,QAAQ,GAEnCwB,gBAAiBtB,EAEjBuB,iBAAkBvB,GAGhBE,EAAWJ,EAAQ,WAAY,SAAU,iBAKlB,KAFvBvB,EAAc0B,IAGhBP,EAAI,2CAA4C,QAE9CJ,EAAkB,SAASA,EAAgBkC,EAASrB,GACtD,IACE,IAAKqB,EAAS,OAAO9B,EAAI,oBAEzB,GAAIT,EAAOiB,IAAajB,EAAOiB,EAAW,WAAY,CACpD,IAWMuB,EAXFzC,EAAWwC,EAAQxC,SACnBF,EAAW0C,EAAQ1C,SAGnB4C,EAAW,CACbL,MAAOG,EAAQpD,aAAa,UAAYuD,WAEtCC,EAAMJ,EAAQ9C,MAAQiD,UAEtBE,GAAW,EAMf,GALItD,EAAY8C,OAASG,EAAQlD,aAAa,WAE5B,KADZmD,EAAWD,EAAQpD,aAAa,SAAS6C,UACzBY,GAAW,KAG5BA,GAAqB,UAAT1B,EACf,OAAQA,GACN,IAAK,WACH2B,EAAQ9C,GAAYT,EAAY+C,gBAAkBxC,EAAW,IAC7D4C,EAASE,IAAMA,EACf,MAEF,IAAK,WACHE,EAAQvD,EAAYgD,iBAChBvC,EAAWF,EACXA,EAASgC,MAAM,KAAKiB,MACxBL,EAASE,IAAMA,EACf,MAEF,IAAK,QACH,IACAE,GADWN,EAAQpD,aAAa,QAClB0C,MAAM,KAAK,IAAM,IAAIA,MAAM,KAAK,GAC9CY,EAASM,MAAQF,EACjB,MAEF,IAAK,QAEHA,GADgBN,EAAQpD,aAAa,QAClB0C,MAAM,KAAK,IAAM,IAAIA,MAAM,KAAK,GACnDY,EAASO,MAAQH,EAKnBD,IAAUC,EAAQL,GAEtB,IAAIS,EACF/B,EACA,IACA2B,EAAMK,QAAQ,eAAgB,KAAKA,QAAQ,aAAc,IAE3DlD,EAAOiB,GAAUgC,EAAOR,EAAU,cAAgB,GAElDhC,EAAI,aAAewC,QAEnBxC,EAAIQ,EAAW,kBAAmB,QAEpC,MAAOT,GACPC,EAAID,EAAME,QAAS,UAIvBV,EAAOK,gBAAkBA,EA4DF,UAAnBM,EAAIwC,YAA6C,aAAnBxC,EAAIwC,WACpCvE,IAEAE,SAASsB,iBAAiB,mBAAoB,SAAUyC,GACtB,aAA5BA,EAAMO,OAAOD,YAA2BvE"} \ No newline at end of file diff --git a/dist/v12/auto-events.js b/dist/v12/auto-events.js index fe2cde2d..b6b0f60a 100644 --- a/dist/v12/auto-events.js +++ b/dist/v12/auto-events.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-15; 3352; SRI-version; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-15; 99ad; SRI-version; v12) */ -function r(t,e){var n,o;t.hasAttribute("data-simple-event")||(n=!1,b.downloads&&/^https?:\/\//i.test(t.href)&&new RegExp("\\.("+(b.downloadsExtensions||[]).join("|")+")$","i").test(t.pathname)?n="download":b.outbound&&/^https?:\/\//i.test(t.href)&&t.hostname!==h.location.hostname?n="outbound":b.emails&&/^mailto:/i.test(t.href)?n="email":b.phones&&/^tel:/i.test(t.href)&&(n="phone"),n&&(e?(o="saAutomatedLink(this, '"+n+"');",t.hasAttribute("target")&&"_self"!==t.getAttribute("target")||(o+=" return false;"),t.setAttribute("onclick",o)):t.addEventListener("click",function(){g(this,n)})))}function e(){try{for(var t=document.getElementsByTagName("a"),e=0;e -1,\n emails: collectTypes.indexOf(\"emails\") > -1,\n downloads: collectTypes.indexOf(\"downloads\") > -1,\n phones: collectTypes.indexOf(\"phones\") > -1,\n // Downloads: enter file extensions you want to collect\n downloadsExtensions: setting(\"extensions\", \"array\", [\n \"pdf\",\n \"csv\",\n \"docx\",\n \"xlsx\",\n \"zip\",\n \"doc\",\n \"xls\",\n ]),\n\n // All: use title attribute if set for event name (for all events)\n // THIS TAKES PRECEDENCE OVER OTHER SETTINGS BELOW\n title: setting(\"useTitle\", \"bool\", true),\n // Outbound: use full URL of the links? false for just the hostname\n outboundFullUrl: fullUrls,\n // Downloads: if taking event name from URL, use full URL or just filename (default)\n downloadsFullUrl: fullUrls,\n };\n\n var saGlobal = setting(\"saGlobal\", \"string\", \"sa_event\");\n\n // For compiling the script\n var optionsLink = options;\n\n if (typeof optionsLink === \"undefined\")\n log(\"options object not found, please specify\", \"warn\");\n\n var saAutomatedLink = function saAutomatedLink(element, type) {\n try {\n if (!element) return log(\"no element found\");\n var sent = false;\n\n var callback = function () {\n if (\n type !== \"phone\" &&\n !sent &&\n (!element.hasAttribute(\"target\") ||\n element.getAttribute(\"target\") === \"_self\")\n )\n document.location = element.getAttribute(\"href\");\n sent = true;\n };\n\n if (window[saGlobal] && window[saGlobal + \"_loaded\"]) {\n var hostname = element.hostname;\n var pathname = element.pathname;\n\n var event;\n var metadata = {\n title: element.getAttribute(\"title\") || undefined,\n };\n var url = element.href || undefined;\n\n var useTitle = false;\n if (optionsLink.title && element.hasAttribute(\"title\")) {\n var theTitle = element.getAttribute(\"title\").trim();\n if (theTitle != \"\") useTitle = true;\n }\n\n if (useTitle) {\n event = theTitle;\n } else {\n switch (type) {\n case \"outbound\": {\n event = hostname + (optionsLink.outboundFullUrl ? pathname : \"\");\n metadata.url = url;\n break;\n }\n case \"download\": {\n event = optionsLink.downloadsFullUrl\n ? hostname + pathname\n : pathname.split(\"/\").pop();\n metadata.url = url;\n break;\n }\n case \"email\": {\n var href = element.getAttribute(\"href\");\n event = (href.split(\":\")[1] || \"\").split(\"?\")[0];\n metadata.email = event;\n break;\n }\n case \"phone\": {\n var hrefPhone = element.getAttribute(\"href\");\n event = (hrefPhone.split(\":\")[1] || \"\").split(\"?\")[0];\n metadata.phone = event;\n break;\n }\n }\n }\n\n var clean =\n type +\n \"_\" +\n event.replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_+|_+$)/g, \"\");\n\n window[saGlobal](clean, metadata, callback);\n\n log(\"collected \" + clean);\n\n return type === \"email\" || type === \"phone\"\n ? callback()\n : window.setTimeout(callback, 5000);\n } else {\n log(saGlobal + \" is not defined\", \"warn\");\n return callback();\n }\n } catch (error) {\n log(error.message, \"warn\");\n }\n };\n\n window.saAutomatedLink = saAutomatedLink;\n\n function collectLink(link, onclick) {\n if (link.hasAttribute(\"data-simple-event\")) return;\n var collect = false;\n\n // Collect download clicks\n if (\n optionsLink.downloads &&\n /^https?:\\/\\//i.test(link.href) &&\n new RegExp(\n \"\\\\.(\" + (optionsLink.downloadsExtensions || []).join(\"|\") + \")$\",\n \"i\"\n ).test(link.pathname)\n ) {\n collect = \"download\";\n\n // Collect outbound links clicks\n } else if (\n optionsLink.outbound &&\n /^https?:\\/\\//i.test(link.href) &&\n link.hostname !== window.location.hostname\n ) {\n collect = \"outbound\";\n\n // Collect email clicks\n } else if (optionsLink.emails && /^mailto:/i.test(link.href)) {\n collect = \"email\";\n\n // Collect telephone clicks\n } else if (optionsLink.phones && /^tel:/i.test(link.href)) {\n collect = \"phone\";\n }\n\n if (!collect) return;\n\n if (onclick) {\n var onClickAttribute = \"saAutomatedLink(this, '\" + collect + \"');\";\n\n if (\n !link.hasAttribute(\"target\") ||\n link.getAttribute(\"target\") === \"_self\"\n )\n onClickAttribute += \" return false;\";\n\n link.setAttribute(\"onclick\", onClickAttribute);\n } else {\n link.addEventListener(\"click\", function () {\n saAutomatedLink(this, collect);\n });\n }\n }\n\n function onDOMContentLoaded() {\n try {\n var a = document.getElementsByTagName(\"a\");\n\n // Loop over all links on the page\n for (var i = 0; i < a.length; i++) {\n var link = a[i];\n var href = link.getAttribute(\"href\");\n\n // Skip links that don't have an href\n if (!href) continue;\n\n // We don't want to overwrite website behaviour so we check for the onclick attribute\n if (\n !link.getAttribute(\"onclick\") &&\n !/^mailto:/.test(href) &&\n !/^tel:/.test(href)\n ) {\n collectLink(link, true);\n } else {\n collectLink(link, false);\n }\n }\n } catch (error) {\n log(error.message, \"warn\");\n }\n }\n\n if (doc.readyState === \"ready\" || doc.readyState === \"complete\") {\n onDOMContentLoaded();\n } else {\n document.addEventListener(\"readystatechange\", function (event) {\n if (event.target.readyState === \"complete\") onDOMContentLoaded();\n });\n }\n})(window);\n"],"names":["collectLink","link","onclick","collect","onClickAttribute","hasAttribute","optionsLink","downloads","test","href","RegExp","downloadsExtensions","join","pathname","outbound","hostname","window","location","emails","phones","getAttribute","setAttribute","addEventListener","saAutomatedLink","this","onDOMContentLoaded","a","document","getElementsByTagName","i","length","error","log","message","doc","scriptElement","setting","collectTypes","fullUrls","options","saGlobal","type","logger","console","warn","info","currentScript","querySelector","attribute","defaultValue","value","dataset","split","map","item","trim","filter","Boolean","indexOf","title","outboundFullUrl","downloadsFullUrl","element","sent","callback","theTitle","metadata","undefined","url","useTitle","event","pop","email","phone","clean","replace","setTimeout","readyState","target"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"auto-events.source.js","sources":["auto-events.source.js"],"sourcesContent":["(function saAutomatedEvents(window) {\n // Skip server side rendered pages\n if (typeof window === \"undefined\") return;\n\n var log = function (message, type) {\n var logger = type === \"warn\" ? console.warn : console.info;\n return logger && logger(\"Simple Analytics auto events:\", message);\n };\n\n var doc = window.document;\n\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"auto-events.js\"]');\n\n var setting = function (attribute, type, defaultValue) {\n var value = scriptElement && scriptElement.dataset[attribute];\n\n // Booleans\n if (type === \"bool\" && (value === \"true\" || value === \"false\"))\n return value === \"true\";\n else if (type === \"bool\") return defaultValue;\n\n // Arrays\n if (type === \"array\" && value)\n return value\n .split(\",\")\n .map(function (item) {\n return item.trim();\n })\n .filter(Boolean);\n else if (type === \"array\") return defaultValue;\n\n return value || defaultValue;\n };\n\n var collectTypes = setting(\"collect\", \"array\", [\n \"outbound\",\n \"emails\",\n \"downloads\",\n \"phones\",\n ]);\n var fullUrls = setting(\"fullUrls\", \"bool\", false);\n\n var options = {\n // What to collect\n outbound: collectTypes.indexOf(\"outbound\") > -1,\n emails: collectTypes.indexOf(\"emails\") > -1,\n downloads: collectTypes.indexOf(\"downloads\") > -1,\n phones: collectTypes.indexOf(\"phones\") > -1,\n // Downloads: enter file extensions you want to collect\n downloadsExtensions: setting(\"extensions\", \"array\", [\n \"pdf\",\n \"csv\",\n \"docx\",\n \"xlsx\",\n \"zip\",\n \"doc\",\n \"xls\",\n ]),\n\n // All: use title attribute if set for event name (for all events)\n // THIS TAKES PRECEDENCE OVER OTHER SETTINGS BELOW\n title: setting(\"useTitle\", \"bool\", true),\n // Outbound: use full URL of the links? false for just the hostname\n outboundFullUrl: fullUrls,\n // Downloads: if taking event name from URL, use full URL or just filename (default)\n downloadsFullUrl: fullUrls,\n };\n\n var saGlobal = setting(\"saGlobal\", \"string\", \"sa_event\");\n\n // For compiling the script\n var optionsLink = options;\n\n if (typeof optionsLink === \"undefined\")\n log(\"options object not found, please specify\", \"warn\");\n\n var saAutomatedLink = function saAutomatedLink(element, type) {\n try {\n if (!element) return log(\"no element found\");\n\n if (window[saGlobal] && window[saGlobal + \"_loaded\"]) {\n var hostname = element.hostname;\n var pathname = element.pathname;\n\n var event;\n var metadata = {\n title: element.getAttribute(\"title\") || undefined,\n };\n var url = element.href || undefined;\n\n var useTitle = false;\n if (optionsLink.title && element.hasAttribute(\"title\")) {\n var theTitle = element.getAttribute(\"title\").trim();\n if (theTitle != \"\") useTitle = true;\n }\n\n if (!useTitle || type === \"phone\") {\n switch (type) {\n case \"outbound\": {\n event = hostname + (optionsLink.outboundFullUrl ? pathname : \"\");\n metadata.url = url;\n break;\n }\n case \"download\": {\n event = optionsLink.downloadsFullUrl\n ? hostname + pathname\n : pathname.split(\"/\").pop();\n metadata.url = url;\n break;\n }\n case \"email\": {\n var href = element.getAttribute(\"href\");\n event = (href.split(\":\")[1] || \"\").split(\"?\")[0];\n metadata.email = event;\n break;\n }\n case \"phone\": {\n var hrefPhone = element.getAttribute(\"href\");\n event = (hrefPhone.split(\":\")[1] || \"\").split(\"?\")[0];\n metadata.phone = event;\n break;\n }\n }\n }\n if (useTitle) event = theTitle;\n\n var clean =\n type +\n \"_\" +\n event.replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_+|_+$)/g, \"\");\n\n window[saGlobal](clean, metadata, function () {}, true);\n\n log(\"collected \" + clean);\n } else {\n log(saGlobal + \" is not defined\", \"warn\");\n }\n } catch (error) {\n log(error.message, \"warn\");\n }\n };\n\n window.saAutomatedLink = saAutomatedLink;\n\n function collectLink(link) {\n if (link.hasAttribute(\"data-simple-event\")) return;\n var collect = false;\n\n // Collect download clicks\n if (\n optionsLink.downloads &&\n /^https?:\\/\\//i.test(link.href) &&\n new RegExp(\n \"\\\\.(\" + (optionsLink.downloadsExtensions || []).join(\"|\") + \")$\",\n \"i\"\n ).test(link.pathname)\n ) {\n collect = \"download\";\n\n // Collect outbound links clicks\n } else if (\n optionsLink.outbound &&\n /^https?:\\/\\//i.test(link.href) &&\n link.hostname !== window.location.hostname\n ) {\n collect = \"outbound\";\n\n // Collect email clicks\n } else if (optionsLink.emails && /^mailto:/i.test(link.href)) {\n collect = \"email\";\n\n // Collect telephone clicks\n } else if (optionsLink.phones && /^tel:/i.test(link.href)) {\n collect = \"phone\";\n }\n\n if (!collect) return;\n\n link.addEventListener(\"click\", function () {\n saAutomatedLink(this, collect);\n });\n }\n\n function onDOMContentLoaded() {\n try {\n var a = document.getElementsByTagName(\"a\");\n\n // Loop over all links on the page\n for (var i = 0; i < a.length; i++) {\n var link = a[i];\n var href = link.getAttribute(\"href\");\n\n // Skip links that don't have an href\n if (!href) continue;\n\n collectLink(link);\n }\n } catch (error) {\n log(error.message, \"warn\");\n }\n }\n\n if (doc.readyState === \"ready\" || doc.readyState === \"complete\") {\n onDOMContentLoaded();\n } else {\n document.addEventListener(\"readystatechange\", function (event) {\n if (event.target.readyState === \"complete\") onDOMContentLoaded();\n });\n }\n})(window);\n"],"names":["onDOMContentLoaded","a","document","getElementsByTagName","i","length","link","getAttribute","collect","hasAttribute","optionsLink","downloads","test","href","RegExp","downloadsExtensions","join","pathname","outbound","hostname","window","location","emails","phones","addEventListener","saAutomatedLink","this","collectLink","error","log","message","doc","scriptElement","setting","collectTypes","fullUrls","options","saGlobal","type","logger","console","warn","info","currentScript","querySelector","attribute","defaultValue","value","dataset","split","map","item","trim","filter","Boolean","indexOf","title","outboundFullUrl","downloadsFullUrl","element","theTitle","metadata","undefined","url","useTitle","event","pop","email","phone","clean","replace","readyState","target"],"mappings":"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"} \ No newline at end of file diff --git a/dist/v12/custom/auto-events.js b/dist/v12/custom/auto-events.js index fe2cde2d..b6b0f60a 100644 --- a/dist/v12/custom/auto-events.js +++ b/dist/v12/custom/auto-events.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-15; 3352; SRI-version; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-15; 99ad; SRI-version; v12) */ -function r(t,e){var n,o;t.hasAttribute("data-simple-event")||(n=!1,b.downloads&&/^https?:\/\//i.test(t.href)&&new RegExp("\\.("+(b.downloadsExtensions||[]).join("|")+")$","i").test(t.pathname)?n="download":b.outbound&&/^https?:\/\//i.test(t.href)&&t.hostname!==h.location.hostname?n="outbound":b.emails&&/^mailto:/i.test(t.href)?n="email":b.phones&&/^tel:/i.test(t.href)&&(n="phone"),n&&(e?(o="saAutomatedLink(this, '"+n+"');",t.hasAttribute("target")&&"_self"!==t.getAttribute("target")||(o+=" return false;"),t.setAttribute("onclick",o)):t.addEventListener("click",function(){g(this,n)})))}function e(){try{for(var t=document.getElementsByTagName("a"),e=0;e -1,\n emails: collectTypes.indexOf(\"emails\") > -1,\n downloads: collectTypes.indexOf(\"downloads\") > -1,\n phones: collectTypes.indexOf(\"phones\") > -1,\n // Downloads: enter file extensions you want to collect\n downloadsExtensions: setting(\"extensions\", \"array\", [\n \"pdf\",\n \"csv\",\n \"docx\",\n \"xlsx\",\n \"zip\",\n \"doc\",\n \"xls\",\n ]),\n\n // All: use title attribute if set for event name (for all events)\n // THIS TAKES PRECEDENCE OVER OTHER SETTINGS BELOW\n title: setting(\"useTitle\", \"bool\", true),\n // Outbound: use full URL of the links? false for just the hostname\n outboundFullUrl: fullUrls,\n // Downloads: if taking event name from URL, use full URL or just filename (default)\n downloadsFullUrl: fullUrls,\n };\n\n var saGlobal = setting(\"saGlobal\", \"string\", \"sa_event\");\n\n // For compiling the script\n var optionsLink = options;\n\n if (typeof optionsLink === \"undefined\")\n log(\"options object not found, please specify\", \"warn\");\n\n var saAutomatedLink = function saAutomatedLink(element, type) {\n try {\n if (!element) return log(\"no element found\");\n var sent = false;\n\n var callback = function () {\n if (\n type !== \"phone\" &&\n !sent &&\n (!element.hasAttribute(\"target\") ||\n element.getAttribute(\"target\") === \"_self\")\n )\n document.location = element.getAttribute(\"href\");\n sent = true;\n };\n\n if (window[saGlobal] && window[saGlobal + \"_loaded\"]) {\n var hostname = element.hostname;\n var pathname = element.pathname;\n\n var event;\n var metadata = {\n title: element.getAttribute(\"title\") || undefined,\n };\n var url = element.href || undefined;\n\n var useTitle = false;\n if (optionsLink.title && element.hasAttribute(\"title\")) {\n var theTitle = element.getAttribute(\"title\").trim();\n if (theTitle != \"\") useTitle = true;\n }\n\n if (useTitle) {\n event = theTitle;\n } else {\n switch (type) {\n case \"outbound\": {\n event = hostname + (optionsLink.outboundFullUrl ? pathname : \"\");\n metadata.url = url;\n break;\n }\n case \"download\": {\n event = optionsLink.downloadsFullUrl\n ? hostname + pathname\n : pathname.split(\"/\").pop();\n metadata.url = url;\n break;\n }\n case \"email\": {\n var href = element.getAttribute(\"href\");\n event = (href.split(\":\")[1] || \"\").split(\"?\")[0];\n metadata.email = event;\n break;\n }\n case \"phone\": {\n var hrefPhone = element.getAttribute(\"href\");\n event = (hrefPhone.split(\":\")[1] || \"\").split(\"?\")[0];\n metadata.phone = event;\n break;\n }\n }\n }\n\n var clean =\n type +\n \"_\" +\n event.replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_+|_+$)/g, \"\");\n\n window[saGlobal](clean, metadata, callback);\n\n log(\"collected \" + clean);\n\n return type === \"email\" || type === \"phone\"\n ? callback()\n : window.setTimeout(callback, 5000);\n } else {\n log(saGlobal + \" is not defined\", \"warn\");\n return callback();\n }\n } catch (error) {\n log(error.message, \"warn\");\n }\n };\n\n window.saAutomatedLink = saAutomatedLink;\n\n function collectLink(link, onclick) {\n if (link.hasAttribute(\"data-simple-event\")) return;\n var collect = false;\n\n // Collect download clicks\n if (\n optionsLink.downloads &&\n /^https?:\\/\\//i.test(link.href) &&\n new RegExp(\n \"\\\\.(\" + (optionsLink.downloadsExtensions || []).join(\"|\") + \")$\",\n \"i\"\n ).test(link.pathname)\n ) {\n collect = \"download\";\n\n // Collect outbound links clicks\n } else if (\n optionsLink.outbound &&\n /^https?:\\/\\//i.test(link.href) &&\n link.hostname !== window.location.hostname\n ) {\n collect = \"outbound\";\n\n // Collect email clicks\n } else if (optionsLink.emails && /^mailto:/i.test(link.href)) {\n collect = \"email\";\n\n // Collect telephone clicks\n } else if (optionsLink.phones && /^tel:/i.test(link.href)) {\n collect = \"phone\";\n }\n\n if (!collect) return;\n\n if (onclick) {\n var onClickAttribute = \"saAutomatedLink(this, '\" + collect + \"');\";\n\n if (\n !link.hasAttribute(\"target\") ||\n link.getAttribute(\"target\") === \"_self\"\n )\n onClickAttribute += \" return false;\";\n\n link.setAttribute(\"onclick\", onClickAttribute);\n } else {\n link.addEventListener(\"click\", function () {\n saAutomatedLink(this, collect);\n });\n }\n }\n\n function onDOMContentLoaded() {\n try {\n var a = document.getElementsByTagName(\"a\");\n\n // Loop over all links on the page\n for (var i = 0; i < a.length; i++) {\n var link = a[i];\n var href = link.getAttribute(\"href\");\n\n // Skip links that don't have an href\n if (!href) continue;\n\n // We don't want to overwrite website behaviour so we check for the onclick attribute\n if (\n !link.getAttribute(\"onclick\") &&\n !/^mailto:/.test(href) &&\n !/^tel:/.test(href)\n ) {\n collectLink(link, true);\n } else {\n collectLink(link, false);\n }\n }\n } catch (error) {\n log(error.message, \"warn\");\n }\n }\n\n if (doc.readyState === \"ready\" || doc.readyState === \"complete\") {\n onDOMContentLoaded();\n } else {\n document.addEventListener(\"readystatechange\", function (event) {\n if (event.target.readyState === \"complete\") onDOMContentLoaded();\n });\n }\n})(window);\n"],"names":["collectLink","link","onclick","collect","onClickAttribute","hasAttribute","optionsLink","downloads","test","href","RegExp","downloadsExtensions","join","pathname","outbound","hostname","window","location","emails","phones","getAttribute","setAttribute","addEventListener","saAutomatedLink","this","onDOMContentLoaded","a","document","getElementsByTagName","i","length","error","log","message","doc","scriptElement","setting","collectTypes","fullUrls","options","saGlobal","type","logger","console","warn","info","currentScript","querySelector","attribute","defaultValue","value","dataset","split","map","item","trim","filter","Boolean","indexOf","title","outboundFullUrl","downloadsFullUrl","element","sent","callback","theTitle","metadata","undefined","url","useTitle","event","pop","email","phone","clean","replace","setTimeout","readyState","target"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"auto-events.source.js","sources":["auto-events.source.js"],"sourcesContent":["(function saAutomatedEvents(window) {\n // Skip server side rendered pages\n if (typeof window === \"undefined\") return;\n\n var log = function (message, type) {\n var logger = type === \"warn\" ? console.warn : console.info;\n return logger && logger(\"Simple Analytics auto events:\", message);\n };\n\n var doc = window.document;\n\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"auto-events.js\"]');\n\n var setting = function (attribute, type, defaultValue) {\n var value = scriptElement && scriptElement.dataset[attribute];\n\n // Booleans\n if (type === \"bool\" && (value === \"true\" || value === \"false\"))\n return value === \"true\";\n else if (type === \"bool\") return defaultValue;\n\n // Arrays\n if (type === \"array\" && value)\n return value\n .split(\",\")\n .map(function (item) {\n return item.trim();\n })\n .filter(Boolean);\n else if (type === \"array\") return defaultValue;\n\n return value || defaultValue;\n };\n\n var collectTypes = setting(\"collect\", \"array\", [\n \"outbound\",\n \"emails\",\n \"downloads\",\n \"phones\",\n ]);\n var fullUrls = setting(\"fullUrls\", \"bool\", false);\n\n var options = {\n // What to collect\n outbound: collectTypes.indexOf(\"outbound\") > -1,\n emails: collectTypes.indexOf(\"emails\") > -1,\n downloads: collectTypes.indexOf(\"downloads\") > -1,\n phones: collectTypes.indexOf(\"phones\") > -1,\n // Downloads: enter file extensions you want to collect\n downloadsExtensions: setting(\"extensions\", \"array\", [\n \"pdf\",\n \"csv\",\n \"docx\",\n \"xlsx\",\n \"zip\",\n \"doc\",\n \"xls\",\n ]),\n\n // All: use title attribute if set for event name (for all events)\n // THIS TAKES PRECEDENCE OVER OTHER SETTINGS BELOW\n title: setting(\"useTitle\", \"bool\", true),\n // Outbound: use full URL of the links? false for just the hostname\n outboundFullUrl: fullUrls,\n // Downloads: if taking event name from URL, use full URL or just filename (default)\n downloadsFullUrl: fullUrls,\n };\n\n var saGlobal = setting(\"saGlobal\", \"string\", \"sa_event\");\n\n // For compiling the script\n var optionsLink = options;\n\n if (typeof optionsLink === \"undefined\")\n log(\"options object not found, please specify\", \"warn\");\n\n var saAutomatedLink = function saAutomatedLink(element, type) {\n try {\n if (!element) return log(\"no element found\");\n\n if (window[saGlobal] && window[saGlobal + \"_loaded\"]) {\n var hostname = element.hostname;\n var pathname = element.pathname;\n\n var event;\n var metadata = {\n title: element.getAttribute(\"title\") || undefined,\n };\n var url = element.href || undefined;\n\n var useTitle = false;\n if (optionsLink.title && element.hasAttribute(\"title\")) {\n var theTitle = element.getAttribute(\"title\").trim();\n if (theTitle != \"\") useTitle = true;\n }\n\n if (!useTitle || type === \"phone\") {\n switch (type) {\n case \"outbound\": {\n event = hostname + (optionsLink.outboundFullUrl ? pathname : \"\");\n metadata.url = url;\n break;\n }\n case \"download\": {\n event = optionsLink.downloadsFullUrl\n ? hostname + pathname\n : pathname.split(\"/\").pop();\n metadata.url = url;\n break;\n }\n case \"email\": {\n var href = element.getAttribute(\"href\");\n event = (href.split(\":\")[1] || \"\").split(\"?\")[0];\n metadata.email = event;\n break;\n }\n case \"phone\": {\n var hrefPhone = element.getAttribute(\"href\");\n event = (hrefPhone.split(\":\")[1] || \"\").split(\"?\")[0];\n metadata.phone = event;\n break;\n }\n }\n }\n if (useTitle) event = theTitle;\n\n var clean =\n type +\n \"_\" +\n event.replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_+|_+$)/g, \"\");\n\n window[saGlobal](clean, metadata, function () {}, true);\n\n log(\"collected \" + clean);\n } else {\n log(saGlobal + \" is not defined\", \"warn\");\n }\n } catch (error) {\n log(error.message, \"warn\");\n }\n };\n\n window.saAutomatedLink = saAutomatedLink;\n\n function collectLink(link) {\n if (link.hasAttribute(\"data-simple-event\")) return;\n var collect = false;\n\n // Collect download clicks\n if (\n optionsLink.downloads &&\n /^https?:\\/\\//i.test(link.href) &&\n new RegExp(\n \"\\\\.(\" + (optionsLink.downloadsExtensions || []).join(\"|\") + \")$\",\n \"i\"\n ).test(link.pathname)\n ) {\n collect = \"download\";\n\n // Collect outbound links clicks\n } else if (\n optionsLink.outbound &&\n /^https?:\\/\\//i.test(link.href) &&\n link.hostname !== window.location.hostname\n ) {\n collect = \"outbound\";\n\n // Collect email clicks\n } else if (optionsLink.emails && /^mailto:/i.test(link.href)) {\n collect = \"email\";\n\n // Collect telephone clicks\n } else if (optionsLink.phones && /^tel:/i.test(link.href)) {\n collect = \"phone\";\n }\n\n if (!collect) return;\n\n link.addEventListener(\"click\", function () {\n saAutomatedLink(this, collect);\n });\n }\n\n function onDOMContentLoaded() {\n try {\n var a = document.getElementsByTagName(\"a\");\n\n // Loop over all links on the page\n for (var i = 0; i < a.length; i++) {\n var link = a[i];\n var href = link.getAttribute(\"href\");\n\n // Skip links that don't have an href\n if (!href) continue;\n\n collectLink(link);\n }\n } catch (error) {\n log(error.message, \"warn\");\n }\n }\n\n if (doc.readyState === \"ready\" || doc.readyState === \"complete\") {\n onDOMContentLoaded();\n } else {\n document.addEventListener(\"readystatechange\", function (event) {\n if (event.target.readyState === \"complete\") onDOMContentLoaded();\n });\n }\n})(window);\n"],"names":["onDOMContentLoaded","a","document","getElementsByTagName","i","length","link","getAttribute","collect","hasAttribute","optionsLink","downloads","test","href","RegExp","downloadsExtensions","join","pathname","outbound","hostname","window","location","emails","phones","addEventListener","saAutomatedLink","this","collectLink","error","log","message","doc","scriptElement","setting","collectTypes","fullUrls","options","saGlobal","type","logger","console","warn","info","currentScript","querySelector","attribute","defaultValue","value","dataset","split","map","item","trim","filter","Boolean","indexOf","title","outboundFullUrl","downloadsFullUrl","element","theTitle","metadata","undefined","url","useTitle","event","pop","email","phone","clean","replace","readyState","target"],"mappings":"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"} \ No newline at end of file diff --git a/src/auto-events.js b/src/auto-events.js index 5095d86f..56a88746 100644 --- a/src/auto-events.js +++ b/src/auto-events.js @@ -95,9 +95,7 @@ if (theTitle != "") useTitle = true; } - if (useTitle) { - event = theTitle; - } else { + if (!useTitle || type === "phone") { switch (type) { case "outbound": { event = hostname + (optionsLink.outboundFullUrl ? pathname : ""); @@ -125,6 +123,7 @@ } } } + if (useTitle) event = theTitle; var clean = type + diff --git a/test/unit/auto-events.test.js b/test/unit/auto-events.test.js index 8193dedc..0a3492e2 100644 --- a/test/unit/auto-events.test.js +++ b/test/unit/auto-events.test.js @@ -19,6 +19,23 @@ function setupDOM() { } describe("auto-events", function () { + it("keeps phone metadata when the title names the event", function () { + const dom = setupDOM(); + const link = dom.window.document.createElement("a"); + link.href = "tel:+31201234567?extension=42"; + link.title = "Call sales"; + + dom.window.saAutomatedLink(link, "phone"); + + expect(dom.events).to.deep.equal([ + { + name: "phone_Call_sales", + metadata: { title: "Call sales", phone: "+31201234567" }, + }, + ]); + dom.window.close(); + }); + it("collects phone clicks by default without overriding cancelled navigation", function () { const events = []; const navigations = []; From fa3cbff4befc141f8cb188fd51d9850682f082bf Mon Sep 17 00:00:00 2001 From: "simple-analytics-ai[bot]" <313929673+simple-analytics-ai[bot]@users.noreply.github.com> Date: Fri, 16 Oct 2026 14:41:01 +0200 Subject: [PATCH 62/62] test: require current script version in SRI header checks (#123) User requested verifying unresolved CodeRabbit feedback with separate minimal PRs. Require the discovered SRI version to match latest.js so an obsolete version cannot make deployment validation pass. Refs #107 Co-authored-by: Simple Analytics Codex --- test/deploy.test.mts | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/test/deploy.test.mts b/test/deploy.test.mts index 5bf7727f..317db1c0 100644 --- a/test/deploy.test.mts +++ b/test/deploy.test.mts @@ -21,6 +21,13 @@ describe("deployment headers", () => { await readdir(new URL("../dist", import.meta.url)) ); assert.ok(version !== undefined, "dist has no versioned SRI directory"); + assert.match( + firstLine( + await readFile(new URL("../dist/latest/latest.js", import.meta.url)) + ), + new RegExp(`; v${version}\\) \\*/$`), + "SRI directory version must match dist/latest/latest.js" + ); const files = createManifest( { destinations: ["cdn", "custom"],